mirror of https://github.com/nxp-imx/mwifiex.git
mxm_wifiex: update to mxm5x17322 release
New Additions/Removals/Improvements: ------------------------------------ 1. WSW-18868: Improve FW download time after suspend/resume cycle 2. WSFD-484: WIFI 6E support 3. WSW-17954: Enable turbo mode command for mlanutl 4. WSW-19363: Add debug prints to WLAN driver regarding WPA_supplicant 5. WSW-19307: Support robust btc related commands [0x00e0] in mlanutl 6. WSW-16429: Disabling of WEP/TKIP on all V16 devices 7. Use CFG80211_VERSION_CODE to control cfg80211 related code 8. Enabled these new commands for mlanutl: min_ba_threshold, stop_su and ed_mac_ctrl_v3 9. WSFD-386: FW and VHAL Implementation for WOWLAN by adding code for MDNS wakeup Driver Bug Fixes: ----------------- 1. WSW-18708: Setting domain info fails for W8801 Murata M.2 Module (2DS) 2. WSW-18541: Debug logs not seen if drvdbg is part of wifi_mod_para.conf 3. WSW-19136: Command 0x107 timeout is seen radomly during connect-disconnect test 4. WSW-18865: VHT80 TCP-tx throughput only run about 170Mbps, both STA and MMH mode 5. WSW-17923: 4K Video Stoppage Issue, Wi-Fi throughput drops to lower than 20Mbps without recovery 6. WSW-17925: NO_IR flags are not cleared for ch 12,13 and 14 if country is changed to JP in runtime 7. WCSWREL-251: There is "mlan0: Failed to initialize driver interface" during stress load/unload testing 8. WSW-18431: UAP beacon (in 1x1 mode) not reporting correct values for tx_highest_rate and rx_highest_rate in VhtCap IE 9. WSW-18116: TCP Keep alive packets are not seen after starting cloud keep alive 10. WSW-18690: STAUT is advertising support of MCS-0 to 9 only in HE-IE in Probe Request 11. WCSWREL-266: Fix L5.16 build errors and warnings Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
This commit is contained in:
parent
6620b8524b
commit
2a2b474597
|
@ -1,6 +1,6 @@
|
|||
# File: Makefile
|
||||
#
|
||||
# Copyright 2008-2021 NXP
|
||||
# Copyright 2008-2022 NXP
|
||||
#
|
||||
# This software file (the File) is distributed by NXP
|
||||
# under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -21,7 +21,7 @@ ifeq ($(CONFIG_COMPATDIR), y)
|
|||
COMPATDIR=/lib/modules/$(KERNELVERSION_X86)/build/compat-wireless-3.2-rc1-1/include
|
||||
CC ?= $(CROSS_COMPILE)gcc -I$(COMPATDIR)
|
||||
else
|
||||
CC ?= $(CROSS_COMPILE)gcc
|
||||
CC ?= $(CROSS_COMPILE)gcc -I$(COMPATDIR)
|
||||
endif
|
||||
|
||||
LD ?= $(CROSS_COMPILE)ld
|
||||
|
@ -52,6 +52,9 @@ CONFIG_PCIE9097=n
|
|||
CONFIG_SD9098=y
|
||||
CONFIG_USB9098=n
|
||||
CONFIG_PCIE9098=y
|
||||
CONFIG_SDNW62X=n
|
||||
CONFIG_PCIENW62X=n
|
||||
CONFIG_USBNW62X=n
|
||||
|
||||
|
||||
# Debug Option
|
||||
|
@ -81,9 +84,6 @@ CONFIG_MFG_CMD_SUPPORT=y
|
|||
# OpenWrt support
|
||||
CONFIG_OPENWRT_SUPPORT=n
|
||||
|
||||
# Big-endian platform
|
||||
CONFIG_BIG_ENDIAN=n
|
||||
|
||||
|
||||
|
||||
ifeq ($(CONFIG_DRV_EMBEDDED_SUPPLICANT), y)
|
||||
|
@ -125,6 +125,7 @@ ccflags-y += -DLINUX
|
|||
|
||||
|
||||
|
||||
|
||||
ARCH ?= arm64
|
||||
CONFIG_IMX_SUPPORT=y
|
||||
ifeq ($(CONFIG_IMX_SUPPORT),y)
|
||||
|
@ -187,10 +188,6 @@ ifeq ($(CONFIG_MFG_CMD_SUPPORT),y)
|
|||
ccflags-y += -DMFG_CMD_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_BIG_ENDIAN),y)
|
||||
ccflags-y += -DBIG_ENDIAN_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT),y)
|
||||
ccflags-y += -DUSERSPACE_32BIT_OVER_KERNEL_64BIT
|
||||
endif
|
||||
|
@ -249,6 +246,10 @@ ifeq ($(CONFIG_SD9097),y)
|
|||
CONFIG_SDIO=y
|
||||
ccflags-y += -DSD9097
|
||||
endif
|
||||
ifeq ($(CONFIG_SDNW62X),y)
|
||||
CONFIG_SDIO=y
|
||||
ccflags-y += -DSDNW62X
|
||||
endif
|
||||
ifeq ($(CONFIG_SD9177),y)
|
||||
CONFIG_SDIO=y
|
||||
ccflags-y += -DSD9177
|
||||
|
@ -281,6 +282,10 @@ ifeq ($(CONFIG_USB9097),y)
|
|||
CONFIG_MUSB=y
|
||||
ccflags-y += -DUSB9097
|
||||
endif
|
||||
ifeq ($(CONFIG_USBNW62X),y)
|
||||
CONFIG_MUSB=y
|
||||
ccflags-y += -DUSBNW62X
|
||||
endif
|
||||
ifeq ($(CONFIG_USB9098),y)
|
||||
CONFIG_MUSB=y
|
||||
ccflags-y += -DUSB9098
|
||||
|
@ -301,6 +306,10 @@ ifeq ($(CONFIG_PCIE9098),y)
|
|||
CONFIG_PCIE=y
|
||||
ccflags-y += -DPCIE9098
|
||||
endif
|
||||
ifeq ($(CONFIG_PCIENW62X),y)
|
||||
CONFIG_PCIE=y
|
||||
ccflags-y += -DPCIENW62X
|
||||
endif
|
||||
ifeq ($(CONFIG_SDIO),y)
|
||||
ccflags-y += -DSDIO
|
||||
ccflags-y += -DSDIO_MMC
|
||||
|
@ -344,7 +353,6 @@ endif
|
|||
#ccflags-y += -Wstringop-truncation
|
||||
#ccflags-y += -Wmisleading-indentation
|
||||
#ccflags-y += -Wunused-const-variable
|
||||
ccflags-y += -Wno-stringop-truncation
|
||||
ccflags-y += -Wno-array-bounds
|
||||
#############################################################################
|
||||
# Make Targets
|
||||
|
@ -583,6 +591,18 @@ mapp/mlanutl:
|
|||
|
||||
echo:
|
||||
|
||||
appsbuild:
|
||||
|
||||
@if [ ! -d $(BINDIR) ]; then \
|
||||
mkdir $(BINDIR); \
|
||||
fi
|
||||
|
||||
cp -f README_MLAN $(BINDIR)
|
||||
ifneq ($(APPDIR),)
|
||||
$(MAKE) -C mapp/mlanconfig $@ INSTALLDIR=$(BINDIR)
|
||||
$(MAKE) -C mapp/mlanutl $@ INSTALLDIR=$(BINDIR)
|
||||
endif
|
||||
|
||||
build: echo default
|
||||
|
||||
@if [ ! -d $(BINDIR) ]; then \
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
===============================================================================
|
||||
U S E R M A N U A L
|
||||
|
||||
Copyright 2008-2021 NXP
|
||||
Copyright 2008-2022 NXP
|
||||
|
||||
|
||||
1) FOR DRIVER BUILD
|
||||
|
@ -63,6 +63,7 @@
|
|||
fw_name = <FW file name>
|
||||
e.g. copy pcieuart9098_combo_v1.bin to firmware directory, fw_name=nxp/pcieuart9098_combo_v1.bin
|
||||
hw_name = <hardware name>
|
||||
reg_work=0|1 <Disable register work queue| Enable register work queue>
|
||||
hw_test=0|1 <Disable hardware test (default) | Enable hardware test>
|
||||
fw_serial=0|1 <support parallel download FW | support serial download FW (default)>
|
||||
req_fw_nowait=0|1 <use request_firmware API (default) | use request_firmware_nowait API>
|
||||
|
@ -120,12 +121,15 @@
|
|||
GoAgeoutTime=0|x <use default ageout time (default) | set Go age out time xTU(TU 100ms)>
|
||||
multi_dtim=0|x <use default DTIM interval(default) | set x*beacon_period as DTIM interval>
|
||||
inact_tmo=0|x <use default IEEE ps inactivity timout value (default) | use IEEE ps inactivity timeout value x ms>
|
||||
roamoffload_in_hs=0|1 <always enable fw roaming (default) | enable fw roaming only when host suspend>
|
||||
uap_max_sta: Maximum number of STA for UAP/GO (default 0, max 64)
|
||||
host_mlme=0|1 <Operate in non-host_mlme mode (default)| Operate in host_mlme mode>
|
||||
for supplicant/authenticator running on host side, WPA3 support is available only in host_mlme mode
|
||||
country_ie_ignore=0|1 <Follow countryIE from AP and beacon hint enable (default) | Ignore countryIE from AP and beacon hint disable>
|
||||
beacon_hints=0|1 <enable beacon hints(default) | disable beacon hints>
|
||||
|
||||
chan_track=0|1 <restore channel tracking parameters(default) | set channel tracking new parameters> for 9098 only
|
||||
|
||||
Note: On some platforms (e.g. PXA910/920) double quotation marks ("") need to used
|
||||
for module parameters.
|
||||
insmod sdxxx.ko "<para1> <para2> ..."
|
||||
|
@ -1315,7 +1319,7 @@ hssetpara
|
|||
This command is used to set host sleep parameters.
|
||||
|
||||
Usage:
|
||||
mlanutl mlanX hssetpara condition [GPIO# [gap]] (optional)[type ind_GPIO# [level]] (optional)[type event_force_ignore event_use_ext_gap ext_gap [gpio_wave]] (optional)[type hs_wakeup_interval]
|
||||
mlanutl mlanX hssetpara condition [GPIO# [gap]] (optional)[type ind_GPIO# [level]] (optional)[type event_force_ignore event_use_ext_gap ext_gap [gpio_wave]] (optional)[type hs_wakeup_interval] (optional)[type min_wake_holdoff]
|
||||
|
||||
This command takes one (condition), two (condition and GPIO#) or three
|
||||
(condition, GPIO# and gap).If more than three parameters, it can set different or multiple features indicating by type.
|
||||
|
@ -1382,6 +1386,9 @@ hssetpara
|
|||
where hs_wakeup_interval is used to set host sleep wakeup interval and the type must set to 3 to indicate
|
||||
this feature. And the value will round to the nearest multiple dtim*beacon_interval in fw. The unit is milliseconds.
|
||||
|
||||
where min_wake_holdoff is minimum delay between HsActive and HostWake and the type must set to 4 to indicate
|
||||
this feature. The unit is milliseconds.
|
||||
|
||||
Examples:
|
||||
mlanutl mlan0 hssetpara -1 : Cancel host sleep mode
|
||||
mlanutl mlan0 hssetpara 3 : Broadcast and unicast data
|
||||
|
@ -1434,6 +1441,12 @@ hssetpara
|
|||
type=3 to set hs_wakeup_interval feature
|
||||
hs_wakeup_interval set to 400ms
|
||||
|
||||
mlanutl mlan0 hssetpara 2 1 0xa0 4 800: Unicase data
|
||||
Use GPIO 1
|
||||
Gap 160ms
|
||||
type=4 to set min_wake_holdoff feature
|
||||
min_wake_holdoff set to 800ms
|
||||
|
||||
Note: The parameters will be saved in the driver and be used when host suspends.
|
||||
The ind_GPIO# and level parameters only work with specific board and firmware.
|
||||
mefcfg
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
#
|
||||
# File : mlanconfig/Makefile
|
||||
#
|
||||
# Copyright 2008-2020 NXP
|
||||
|
||||
# Path to the top directory of the mlandriver distribution
|
||||
PATH_TO_TOP = ../..
|
||||
|
||||
# Determine how we should copy things to the install directory
|
||||
ABSPATH := $(filter /%, $(INSTALLDIR))
|
||||
RELPATH := $(filter-out /%, $(INSTALLDIR))
|
||||
INSTALLPATH := $(ABSPATH)
|
||||
ifeq ($(strip $(INSTALLPATH)),)
|
||||
INSTALLPATH := $(PATH_TO_TOP)/$(RELPATH)
|
||||
endif
|
||||
|
||||
# Override CFLAGS for application sources, remove __ kernel namespace defines
|
||||
CFLAGS := $(filter-out -D__%, $(ccflags-y))
|
||||
# remove KERNEL include dir
|
||||
CFLAGS := $(filter-out -I$(KERNELDIR)%, $(CFLAGS))
|
||||
|
||||
#
|
||||
# List of application executables to create
|
||||
#
|
||||
TARGETS := $(exectarget)
|
||||
|
||||
#
|
||||
# Make target rules
|
||||
#
|
||||
|
||||
# All rule compiles list of TARGETS using builtin program target from src rule
|
||||
all :
|
||||
$(exectarget): $(libobjs)
|
||||
$(CC) $(CFLAGS) $(libobjs) -o $(exectarget)
|
||||
|
||||
# Update any needed TARGETS and then copy to the install path
|
||||
build install: $(TARGETS)
|
||||
@cp -rf config $(INSTALLPATH)
|
||||
|
||||
clean:
|
||||
@rm -f $(exectarget)
|
||||
@rm -f *.o
|
||||
|
||||
distclean: clean
|
||||
@rm -f *~ core
|
||||
@rm -f tags
|
|
@ -0,0 +1,126 @@
|
|||
# File : coex_int_api.conf
|
||||
|
||||
######################### Coex API command ###############
|
||||
get_bca_arb_config={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024B # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=0 # GET
|
||||
Arbitration_Enable:1=0x00 # Read-back BCA Arb Settings
|
||||
Grant_Policy:1=0 # Read-back Grant Policy acc to Ant and Isolation config
|
||||
Priority_Remap_WLAN:16=0 # Read-back remapped WLAN priority
|
||||
Priority_Remap_BT:4=0 # Read-back remapped BT priority
|
||||
Priority_Remap_15_4:4=0 # Read-back remapped 15.4 priority
|
||||
Priority_Ramap_ExtRadio:4=0 # Read-back remapped External Radio
|
||||
}
|
||||
}
|
||||
|
||||
set_en_bca_arb_config={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024B # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=1 # SET
|
||||
Arbitration_Enable:1=0x01 # Set BCA Arb Settings
|
||||
Grant_Policy:1=0 # Set Grant Policy acc to Ant and Isolation config
|
||||
Priority_Remap_WLAN:16='0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78' # Set remapped WLAN priority
|
||||
Priority_Remap_BT:4='0x80,0x88,0x90,0x98' # Set remapped BT priority
|
||||
Priority_Remap_15_4:4='0xA0,0xA8,0xB0,0xB8' # Set remapped 15.4 priority
|
||||
}
|
||||
}
|
||||
|
||||
set_dis_bca_arb_config={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024B # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=1 # SET
|
||||
Arbitration_Enable:1=0x00 # Clear BCA Arb Settings
|
||||
Grant_Policy:1=0 # Set Grant Policy acc to Ant and Isolation config
|
||||
Priority_Remap_WLAN:16='0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78' # Set remapped WLAN priority
|
||||
Priority_Remap_BT:4='0x80,0x88,0x90,0x98' # Set remapped BT priority
|
||||
Priority_Remap_15_4:4='0xA0,0xA8,0xB0,0xB8' # Set remapped 15.4 priority
|
||||
}
|
||||
}
|
||||
|
||||
set_wlan_traffic_priority={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# COEX WLAN Traffic Priority TLV
|
||||
BCAArbitrationTLVType:2=0x024C # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=1 # SET
|
||||
Mode:1=1 # 1 - Qbased based;0-Packet type based
|
||||
Mask_1:4=0xffffffff # This value will be read in little endian format in firmware,Tx_Priority_setting[t] t = 0 – 31, set bits to indicate which entry need to update priorities
|
||||
Mask_2:4=0xffffffff # Tx_Priority_setting[t] t= 32 – 63, set bits to indicate which entry need to update priorities
|
||||
Mask_3:4=0xffffffff # Rx_Priority_setting[t] t= 0 – 31, set bits to indicate which entry need to update priorities
|
||||
Mask_4:4=0xffffffff # Rx_Priority_setting[t] t= 32 – 63, set bits to indicate which entry need to update priorities
|
||||
Tx_Priority_setting:64='0xf,0xf,0xf,0xf,0xf,0xf,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x08,0x8,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0xd,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40' # WLAN Tx Traffic priorities
|
||||
Rx_Priority_setting:64='0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d,0x7e,0x7f,0x80' # WLAN Rx Traffic priorities
|
||||
}
|
||||
}
|
||||
|
||||
get_wlan_traffic_priority={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# COEX WLAN Traffic Priority TLV
|
||||
BCAArbitrationTLVType:2=0x024C # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=0 # GET WLAN Traffic priorities
|
||||
Mode:1=0 # (Qbased based - 1) or (Packet type based - 0)
|
||||
Mask_1:4=0 # GET mask 1
|
||||
Mask_2:4=0 # GET mask 2
|
||||
Mask_3:4=0 # GET mask 3
|
||||
Mask_4:4=0 # GET mask 4
|
||||
Tx_Priority_setting:64=0 # GET WLAN Tx Traffic priorities
|
||||
Rx_Priority_setting:64=0 # GET WLAN Rx Traffic priorities
|
||||
}
|
||||
}
|
||||
|
||||
get_wlan_stats={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024F # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=0 # GET WLAN Statistics
|
||||
length:4=40 # Length of collected statistics
|
||||
stats:40=0 # Accumulated Statistics
|
||||
}
|
||||
}
|
||||
|
||||
get_15_4_stats={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024F # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=1 # GET 15.4 Statistics
|
||||
length:4=52 # Length of collected statistics
|
||||
stats:52=0 # Accumulated Statistics
|
||||
}
|
||||
}
|
||||
|
||||
get_bt_stats={
|
||||
CmdCode=0x0277 # do NOT change this line
|
||||
|
||||
# BCA Arbitration TLV
|
||||
BCAArbitrationTLVType:2=0x024F # do NOT change this line
|
||||
RobustCoexTlvLength:2={
|
||||
Version:2=0x1 # Firecrest
|
||||
Action:2=2 # GET BT Statistics
|
||||
length:4=28 # Length of collected statistics
|
||||
stats:28=0 # Accumulated Statistics
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
# File : robust_btc_MM.conf
|
||||
|
||||
######################### Robust Coex command ###############
|
||||
mode_get={
|
||||
CmdCode=0x00e0 # do NOT change this line
|
||||
Action:2=0 # GET
|
||||
RSVD:2=0
|
||||
|
||||
# Robust Coex Mode TLV
|
||||
RobustCoexTlvType:2=0x0160
|
||||
RobustCoexTlvLength:2={
|
||||
Enable:1=0x00 # Read-back Coex mode(s)
|
||||
Reserved:3=0
|
||||
}
|
||||
}
|
||||
|
||||
mode_none={
|
||||
CmdCode=0x00e0 # do NOT change this line
|
||||
Action:2=1 # SET
|
||||
RSVD:2=0
|
||||
|
||||
# Robust Coex Mode TLV
|
||||
RobustCoexTlvType:2=0x0160
|
||||
RobustCoexTlvLength:2={
|
||||
Enable:1=0 # Concurrent Coex mode. Used for chips which has
|
||||
# separate antenna for BT
|
||||
Reserved:3=0
|
||||
}
|
||||
}
|
||||
|
||||
mode_bca={
|
||||
CmdCode=0x00e0 # do NOT change this line
|
||||
Action:2=1 # SET
|
||||
RSVD:2=0
|
||||
|
||||
# Robust Coex Mode TLV
|
||||
RobustCoexTlvType:2=0x0160
|
||||
RobustCoexTlvLength:2={
|
||||
Enable:1=0x08 # BCA Coex mode.
|
||||
# Pure HW BCA based WLAN and BT traffic arbitration.
|
||||
Reserved:3=0
|
||||
}
|
||||
}
|
|
@ -67,6 +67,15 @@ SD8997 = {
|
|||
# drv_mode=7
|
||||
#}
|
||||
|
||||
#SD8978 = {
|
||||
# cfg80211_wext=0xf
|
||||
# wfd_name=p2p
|
||||
# hw_name=SDIW416
|
||||
# max_vir_bss=1
|
||||
# cal_data_cfg=nxp/WlanCalData_ext_8978_QFN_TB.conf
|
||||
# drv_mode=7
|
||||
#}
|
||||
|
||||
#SD8987 = {
|
||||
# cfg80211_wext=0xf
|
||||
# wfd_name=p2p
|
||||
|
@ -75,6 +84,14 @@ SD8997 = {
|
|||
# drv_mode=7
|
||||
#}
|
||||
|
||||
#SD9177 = {
|
||||
# cfg80211_wext=0xf
|
||||
# wfd_name=p2p
|
||||
# hw_name=SDNW611
|
||||
# max_vir_bss=1
|
||||
# drv_mode=7
|
||||
#}
|
||||
|
||||
USB8997 = {
|
||||
cfg80211_wext=0xf
|
||||
wfd_name=p2p
|
||||
|
@ -83,6 +100,15 @@ USB8997 = {
|
|||
drv_mode=7
|
||||
}
|
||||
|
||||
#USBIW620 = {
|
||||
# cfg80211_wext=0xf
|
||||
# wfd_name=p2p
|
||||
# hw_name=USBIW620
|
||||
# max_vir_bss=1
|
||||
# drv_mode=7
|
||||
#}
|
||||
|
||||
|
||||
PCIE8997 = {
|
||||
cfg80211_wext=0xf
|
||||
wfd_name=p2p
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
# Copyright 2021 NXP
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
## http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
LOCAL_PATH := $(my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
# Enable DEBUG Level
|
||||
DEBUG_LEVEL=1
|
||||
ifeq ($(DEBUG_LEVEL),1)
|
||||
LOCAL_CFLAGS += -DDEBUG_LEVEL1
|
||||
endif
|
||||
ifeq ($(DEBUG_LEVEL),2)
|
||||
LOCAL_CFLAGS += -DDEBUG_LEVEL1
|
||||
LOCAL_CFLAGS += -DDEBUG_LEVEL2
|
||||
endif
|
||||
# Enable STA mode support
|
||||
CONFIG_STA_SUPPORT=y
|
||||
ifeq ($(CONFIG_STA_SUPPORT),y)
|
||||
LOCAL_CFLAGS += -DSTA_SUPPORT
|
||||
endif
|
||||
# Enable uAP mode support
|
||||
CONFIG_UAP_SUPPORT=y
|
||||
ifeq ($(CONFIG_UAP_SUPPORT),y)
|
||||
LOCAL_CFLAGS += -DUAP_SUPPORT
|
||||
endif
|
||||
CONFIG_WIFI_DIRECT_SUPPORT=y
|
||||
ifeq ($(CONFIG_WIFI_DIRECT_SUPPORT), y)
|
||||
LOCAL_CFLAGS += -DWIFI_DIRECT_SUPPORT
|
||||
endif
|
||||
|
||||
# if 64bit Android is used (e.g. PXA1928)
|
||||
# Please turn on following compiler flag
|
||||
CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT=y
|
||||
ifeq ($(CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT), y)
|
||||
LOCAL_CFLAGS += -DUSERSPACE_32BIT_OVER_KERNEL_64BIT
|
||||
endif
|
||||
|
||||
LOCAL_MODULE := mlanutl
|
||||
LOCAL_VENDOR_MODULE := true
|
||||
OBJS = mlanutl.c
|
||||
LOCAL_SRC_FILES := $(OBJS)
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
|
@ -1,6 +1,6 @@
|
|||
# File : mlanutl/Makefile
|
||||
#
|
||||
# Copyright 2011-2020 NXP
|
||||
# Copyright 2011-2022 NXP
|
||||
|
||||
# Path to the top directory of the wlan distribution
|
||||
PATH_TO_TOP = ../..
|
||||
|
@ -21,6 +21,7 @@ CFLAGS := $(filter-out -I$(KERNELDIR)%, $(CFLAGS))
|
|||
|
||||
#CFLAGS += -DAP22 -fshort-enums
|
||||
CFLAGS += -Wall
|
||||
CFLAGS += -Wno-stringop-truncation
|
||||
#ECHO = @
|
||||
ifeq (,$(findstring ANDROID_KERNEL, $(CFLAGS)))
|
||||
LIBS=-lrt
|
||||
|
@ -33,10 +34,12 @@ HEADERS = mlanutl.h
|
|||
|
||||
|
||||
|
||||
|
||||
|
||||
exectarget=mlanutl
|
||||
TARGET := $(exectarget)
|
||||
|
||||
build default: $(TARGET)
|
||||
build appsbuild default: $(TARGET)
|
||||
@cp -f $(TARGET) $(INSTALLPATH)
|
||||
|
||||
all : tags default
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief Program to control parameters in the mlandriver
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2021 NXP
|
||||
* Copyright 2011-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -52,6 +52,9 @@ Change log:
|
|||
/** Termination flag */
|
||||
int terminate_flag = 0;
|
||||
|
||||
/** Termination flag */
|
||||
boolean mcast_debug_flag = 0;
|
||||
|
||||
/********************************************************
|
||||
Local Variables
|
||||
********************************************************/
|
||||
|
@ -72,6 +75,25 @@ const char *rateIdStr[] = {"1", "2", "5.5", "11", "--", "6", "9", "12",
|
|||
"M2", "M3", "M4", "M5", "M6", "M7", "H0", "H1",
|
||||
"H2", "H3", "H4", "H5", "H6", "H7"};
|
||||
|
||||
char mod_conv_bg_1x1[10][35] = {
|
||||
"CCK (1,2,5.5,11 Mbps)", "OFDM_PSK (6,9,12,18 Mbps)",
|
||||
"OFDM_QAM16 (24,36 Mbps)", "OFDM_QAM64 (48,54 Mbps)",
|
||||
"HT_20_PSK (MCS 0,1,2)", "HT_20_QAM16 (MCS 3,4)",
|
||||
"HT_20_QAM64 (MCS 5,6,7)", "HT_40_PSK (MCS 0,1,2)",
|
||||
"HT_40_QAM16 (MCS 3,4)", "HT_40_QAM64 (MCS 5,6,7)"};
|
||||
char mod_conv_a_1x1[6][35] = {
|
||||
"VHT_20_QAM256 (MCS 8)", "VHT_40_QAM256 (MCS 8,9)",
|
||||
"VHT_80_PSK (MCS 0,1,2)", "VHT_80_QAM16 (MCS 3,4)",
|
||||
"VHT_80_QAM64 (MCS 5,6,7)", "VHT_80_QAM256 (MCS 8,9)"};
|
||||
char mod_conv_bg_2x2[6][35] = {
|
||||
"HT2_20_PSK (MCS 8,9,10)", "HT2_20_QAM16 (MCS 11,12)",
|
||||
"HT2_20_QAM64 (MCS 13,14,15)", "HT2_40_PSK (MCS 8,9,10)",
|
||||
"HT2_40_QAM16 (MCS 11,12)", "HT2_40_QAM64 (MCS 13,14,15)"};
|
||||
char mod_conv_a_2x2[6][35] = {
|
||||
"VHT2_20_QAM256 (MCS 8)", "VHT2_40_QAM256 (MCS 8,9)",
|
||||
"VHT2_80_PSK (MCS 0,1,2)", "VHT2_80_QAM16 (MCS 3,4)",
|
||||
"VHT2_80_QAM64 (MCS 5,6,7)", "VHT2_80_QAM256 (MCS 8,9)"};
|
||||
|
||||
#ifdef DEBUG_LEVEL1
|
||||
#define MMSG MBIT(0)
|
||||
#define MFATAL MBIT(1)
|
||||
|
@ -203,8 +225,7 @@ t_s32 sockfd;
|
|||
char dev_name[IFNAMSIZ + 1];
|
||||
#define HOSTCMD "hostcmd"
|
||||
|
||||
static char *config_get_line(char *s, int size, FILE *stream, int *line,
|
||||
char **_pos);
|
||||
char *config_get_line(char *s, int size, FILE *stream, int *line, char **_pos);
|
||||
#define BSSID_FILTER 1
|
||||
#define SSID_FILTER 2
|
||||
/********************************************************
|
||||
|
@ -268,7 +289,7 @@ t_void hexdump(char *prompt, t_void *p, t_s32 len, char delim)
|
|||
* @param chr Char
|
||||
* @return Hex integer
|
||||
*/
|
||||
static t_u8 hexc2bin(char chr)
|
||||
t_u8 hexc2bin(char chr)
|
||||
{
|
||||
if (chr >= '0' && chr <= '9')
|
||||
chr -= '0';
|
||||
|
@ -286,7 +307,7 @@ static t_u8 hexc2bin(char chr)
|
|||
* @param s A pointer string buffer
|
||||
* @return Hex integer
|
||||
*/
|
||||
static t_u32 a2hex(char *s)
|
||||
t_u32 a2hex(char *s)
|
||||
{
|
||||
t_u32 val = 0;
|
||||
|
||||
|
@ -307,7 +328,7 @@ static t_u32 a2hex(char *s)
|
|||
* @param value A pointer to string
|
||||
* @return Integer
|
||||
*/
|
||||
static t_u32 a2hex_or_atoi(char *value)
|
||||
t_u32 a2hex_or_atoi(char *value)
|
||||
{
|
||||
if (value[0] == '0' && (value[1] == 'X' || value[1] == 'x')) {
|
||||
return a2hex(value + 2);
|
||||
|
@ -667,7 +688,7 @@ int process_host_cmd_resp(char *cmd_name, t_u8 *buf);
|
|||
* @param lineno A pointer to return current line number
|
||||
* @return returns string or NULL
|
||||
*/
|
||||
static char *mlan_config_get_line(FILE *fp, char *str, t_s32 size, int *lineno)
|
||||
char *mlan_config_get_line(FILE *fp, char *str, t_s32 size, int *lineno)
|
||||
{
|
||||
char *start, *end;
|
||||
int out, next_line;
|
||||
|
@ -763,8 +784,7 @@ static char *mlan_config_get_line(FILE *fp, char *str, t_s32 size, int *lineno)
|
|||
* @param _pos Output string or NULL
|
||||
* @return String or NULL
|
||||
*/
|
||||
static char *config_get_line(char *s, int size, FILE *stream, int *line,
|
||||
char **_pos)
|
||||
char *config_get_line(char *s, int size, FILE *stream, int *line, char **_pos)
|
||||
{
|
||||
*_pos = mlan_config_get_line(stream, s, size, line);
|
||||
return *_pos;
|
||||
|
@ -945,7 +965,7 @@ static int prepare_host_cmd_buffer(FILE *fp, char *cmd_name, t_u8 *buf)
|
|||
#define SUBID_OFFSET (S_DS_GEN + 2)
|
||||
|
||||
static const t_u16 debug_cmd = 0x008b;
|
||||
static t_u16 supported_cmd[] = {0x0130};
|
||||
static t_u16 supported_cmd[] = {0x0130, 0x0016, 0x00e0};
|
||||
/* If the hostcmd CmdCode is 0x008b (debug cmd), then below SUBIDs will be
|
||||
* allowed */
|
||||
static t_u16 supported_8b_subcmd[] = {0x104, 0x111, 0x11b, 0x11e, 0x27, 0x101};
|
||||
|
@ -2867,8 +2887,11 @@ static int process_11axcfg(int argc, char *argv[])
|
|||
(t_u8 *)config_id);
|
||||
|
||||
snprintf(config_id, sizeof(config_id), "HECap");
|
||||
fparse_for_cmd_and_hex(fp, buffer + cmd_header_len + id_len,
|
||||
(t_u8 *)config_id);
|
||||
id_len +=
|
||||
fparse_for_cmd_and_hex(fp,
|
||||
buffer + cmd_header_len + id_len,
|
||||
(t_u8 *)config_id);
|
||||
|
||||
hexdump("Set 11axcfg", buffer + cmd_header_len,
|
||||
sizeof(mlan_ds_11ax_he_cfg), ' ');
|
||||
cmd->used_len = cmd_header_len + sizeof(mlan_ds_11ax_he_cfg);
|
||||
|
@ -3659,6 +3682,35 @@ int process_host_cmd_resp(char *cmd_name, t_u8 *buf)
|
|||
wmm_param->ac_params[AC_VO].tx_op_limit));
|
||||
break;
|
||||
}
|
||||
case HostCmd_ROBUST_COEX: {
|
||||
host_RobustCoexLteStats_t *RobustCoexLteStat =
|
||||
(host_RobustCoexLteStats_t *)(buf + S_DS_GEN);
|
||||
if (RobustCoexLteStat->ResponseType ==
|
||||
EXT_LTE_RESP_GETSTAT) {
|
||||
printf("==============LTE COEX STATS================\n");
|
||||
printf("Responsetype: %d \n",
|
||||
RobustCoexLteStat->ResponseType);
|
||||
printf("Count_LTE_TX_NOTIFY: %d \n",
|
||||
(unsigned int)le32_to_cpu(
|
||||
RobustCoexLteStat
|
||||
->Count_LTE_TX_NOTIFY));
|
||||
printf("Count_LTE_RX_PROTECT: %d \n",
|
||||
(unsigned int)le32_to_cpu(
|
||||
RobustCoexLteStat
|
||||
->Count_LTE_RX_PROTECT));
|
||||
printf("Count_LTE_TX_SUSPEND: %d \n",
|
||||
(unsigned int)le32_to_cpu(
|
||||
RobustCoexLteStat
|
||||
->Count_LTE_TX_SUSPEND));
|
||||
printf("Count_LTE_RX_NOTIFY: %d \n",
|
||||
(unsigned int)le32_to_cpu(
|
||||
RobustCoexLteStat
|
||||
->Count_LTE_RX_NOTIFY));
|
||||
} else if (RobustCoexLteStat->ResponseType ==
|
||||
EXT_LTE_RESP_RSTSTAT) {
|
||||
printf("LTE STAT Counters cleared \n");
|
||||
}
|
||||
} break;
|
||||
default:
|
||||
printf("HOSTCMD_RESP: CmdCode=%#04x, Size=%#04x,"
|
||||
" SeqNum=%#04x, Result=%#04x\n",
|
||||
|
@ -4585,7 +4637,7 @@ static int ishexstring(char *s)
|
|||
* MAC_BROADCAST - if broadcast mac
|
||||
* MAC_MULTICAST - if multicast mac
|
||||
*/
|
||||
static int mac2raw(char *mac, t_u8 *raw)
|
||||
int mac2raw(char *mac, t_u8 *raw)
|
||||
{
|
||||
unsigned int temp_raw[ETH_ALEN];
|
||||
int num_tokens = 0;
|
||||
|
@ -4635,7 +4687,7 @@ static int atoval(char *buf)
|
|||
* 'args'
|
||||
* @return Number of arguments in the line or EOF
|
||||
*/
|
||||
static int parse_line(char *line, char *args[], t_u16 args_count)
|
||||
int parse_line(char *line, char *args[], t_u16 args_count)
|
||||
{
|
||||
int arg_num = 0;
|
||||
int is_start = 0;
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains definitions for application
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2021 NXP
|
||||
* Copyright 2011-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -59,16 +59,6 @@ typedef enum { FALSE, TRUE } boolean;
|
|||
(((t_u32)(x)&0xff000000UL) >> 24)))
|
||||
|
||||
/** Convert to correct endian format */
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** CPU to little-endian convert for 16-bit */
|
||||
#define cpu_to_le16(x) swap_byte_16(x)
|
||||
/** CPU to little-endian convert for 32-bit */
|
||||
#define cpu_to_le32(x) swap_byte_32(x)
|
||||
/** Little-endian to CPU convert for 16-bit */
|
||||
#define le16_to_cpu(x) swap_byte_16(x)
|
||||
/** Little-endian to CPU convert for 32-bit */
|
||||
#define le32_to_cpu(x) swap_byte_32(x)
|
||||
#else
|
||||
/** Do nothing */
|
||||
#define cpu_to_le16(x) (x)
|
||||
/** Do nothing */
|
||||
|
@ -77,7 +67,6 @@ typedef enum { FALSE, TRUE } boolean;
|
|||
#define le16_to_cpu(x) (x)
|
||||
/** Do nothing */
|
||||
#define le32_to_cpu(x) (x)
|
||||
#endif
|
||||
|
||||
/** TLV header */
|
||||
#define TLVHEADER /** Tag */ \
|
||||
|
@ -456,28 +445,11 @@ typedef enum _IEEEtypes_ElementId_e {
|
|||
|
||||
typedef enum _IEEEtypes_Ext_ElementId_e {
|
||||
HE_CAPABILITY = 35,
|
||||
HE_OPERATION = 36
|
||||
HE_OPERATION = 36,
|
||||
HE_6G_CAPABILITY = 59
|
||||
} IEEEtypes_Ext_ElementId_e;
|
||||
|
||||
/** Capability Bit Map*/
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
typedef struct _IEEEtypes_CapInfo_t {
|
||||
t_u8 rsrvd1 : 2;
|
||||
t_u8 dsss_ofdm : 1;
|
||||
t_u8 rsvrd2 : 2;
|
||||
t_u8 short_slot_time : 1;
|
||||
t_u8 rsrvd3 : 1;
|
||||
t_u8 spectrum_mgmt : 1;
|
||||
t_u8 chan_agility : 1;
|
||||
t_u8 pbcc : 1;
|
||||
t_u8 short_preamble : 1;
|
||||
t_u8 privacy : 1;
|
||||
t_u8 cf_poll_rqst : 1;
|
||||
t_u8 cf_pollable : 1;
|
||||
t_u8 ibss : 1;
|
||||
t_u8 ess : 1;
|
||||
} __ATTRIB_PACK__ IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
|
||||
#else
|
||||
typedef struct _IEEEtypes_CapInfo_t {
|
||||
/** Capability Bit Map : ESS */
|
||||
t_u8 ess : 1;
|
||||
|
@ -510,7 +482,6 @@ typedef struct _IEEEtypes_CapInfo_t {
|
|||
/** Capability Bit Map : Reserved */
|
||||
t_u8 rsrvd1 : 2;
|
||||
} __ATTRIB_PACK__ IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
/** IEEE IE header */
|
||||
typedef struct _IEEEtypes_Header_t {
|
||||
|
@ -595,6 +566,7 @@ typedef struct MrvlIEtypes_Data_t {
|
|||
enum { BAND_2GHZ = 0,
|
||||
BAND_5GHZ = 1,
|
||||
BAND_4GHZ = 2,
|
||||
BAND_6GHZ = 3,
|
||||
};
|
||||
|
||||
/** channel offset */
|
||||
|
@ -612,16 +584,6 @@ enum { CHAN_BW_20MHZ = 0,
|
|||
|
||||
/** Band_Config_t */
|
||||
typedef struct _Band_Config_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/
|
||||
t_u8 scanMode : 2;
|
||||
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
|
||||
t_u8 chan2Offset : 2;
|
||||
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
|
||||
t_u8 chanWidth : 2;
|
||||
/** Band Info - (00)=2.4GHz, (01)=5GHz */
|
||||
t_u8 chanBand : 2;
|
||||
#else
|
||||
/** Band Info - (00)=2.4GHz, (01)=5GHz */
|
||||
t_u8 chanBand : 2;
|
||||
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
|
||||
|
@ -630,7 +592,6 @@ typedef struct _Band_Config_t {
|
|||
t_u8 chan2Offset : 2;
|
||||
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=Adoption mode*/
|
||||
t_u8 scanMode : 2;
|
||||
#endif
|
||||
} __ATTRIB_PACK__ Band_Config_t;
|
||||
|
||||
/** Maximum length of lines in configuration file */
|
||||
|
@ -879,16 +840,6 @@ typedef struct _mlan_ds_11ax_cmd_cfg {
|
|||
|
||||
/** Data structure of WMM Aci/Aifsn */
|
||||
typedef struct _IEEEtypes_WmmAciAifsn_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
/** Aci */
|
||||
t_u8 aci : 2;
|
||||
/** Acm */
|
||||
t_u8 acm : 1;
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
#else
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
/** Acm */
|
||||
|
@ -897,22 +848,14 @@ typedef struct _IEEEtypes_WmmAciAifsn_t {
|
|||
t_u8 aci : 2;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
#endif
|
||||
} __ATTRIB_PACK__ IEEEtypes_WmmAciAifsn_t, *pIEEEtypes_WmmAciAifsn_t;
|
||||
|
||||
/** Data structure of WMM ECW */
|
||||
typedef struct _IEEEtypes_WmmEcw_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
#else
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
#endif
|
||||
} __ATTRIB_PACK__ IEEEtypes_WmmEcw_t, *pIEEEtypes_WmmEcw_t;
|
||||
|
||||
/** Data structure of WMM AC parameters */
|
||||
|
@ -1244,4 +1187,16 @@ typedef struct _cloud_keep_alive {
|
|||
t_u8 pkt[255];
|
||||
} __ATTRIB_PACK__ cloud_keep_alive;
|
||||
|
||||
#define EXT_LTE_RESP_GETSTAT 0xA5
|
||||
#define EXT_LTE_RESP_RSTSTAT 0x5A
|
||||
/** Host Command ID: ROBUST_COEX */
|
||||
#define HostCmd_ROBUST_COEX 0x00e0
|
||||
typedef struct _host_RobustCoexLteStats_t {
|
||||
unsigned int Count_LTE_TX_NOTIFY;
|
||||
unsigned int Count_LTE_RX_PROTECT;
|
||||
unsigned int Count_LTE_TX_SUSPEND;
|
||||
unsigned int Count_LTE_RX_NOTIFY;
|
||||
unsigned char ResponseType;
|
||||
} __ATTRIB_PACK__ host_RobustCoexLteStats_t;
|
||||
|
||||
#endif /* _MLANUTL_H_ */
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,375 @@
|
|||
/** @file mlanwls.h
|
||||
*
|
||||
* @brief 11mc/11az Wifi location services application
|
||||
*
|
||||
*
|
||||
* Copyright 2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
* (the License). You may use, redistribute and/or modify the File in
|
||||
* accordance with the terms and conditions of the License, a copy of which
|
||||
* is available by writing to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
|
||||
* worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
|
||||
*
|
||||
* THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE EXPRESSLY DISCLAIMED. The License provides additional details about
|
||||
* this warranty disclaimer.
|
||||
*
|
||||
*/
|
||||
/************************************************************************
|
||||
Change log:
|
||||
01/24/2022: initial version
|
||||
************************************************************************/
|
||||
#ifndef _WLS_H_
|
||||
#define _WLS_H_
|
||||
|
||||
/** Size of command buffer */
|
||||
#define MRVDRV_SIZE_OF_CMD_BUFFER (3 * 1024)
|
||||
|
||||
/** MAC BROADCAST */
|
||||
#define MAC_BROADCAST 0x1FF
|
||||
/** MAC MULTICAST */
|
||||
#define MAC_MULTICAST 0x1FE
|
||||
/** Default scan interval in second*/
|
||||
#define DEFAULT_SCAN_INTERVAL 300
|
||||
|
||||
/** Netlink protocol number */
|
||||
#define NETLINK_NXP (MAX_LINKS - 1)
|
||||
/** Netlink maximum payload size */
|
||||
#define NL_MAX_PAYLOAD 1024
|
||||
/** Default wait time in seconds for events */
|
||||
#define UAP_RECV_WAIT_DEFAULT 10
|
||||
#ifndef NLMSG_HDRLEN
|
||||
/** NL message header length */
|
||||
#define NLMSG_HDRLEN ((int)NLMSG_ALIGN(sizeof(struct nlmsghdr)))
|
||||
#endif
|
||||
|
||||
/** Host Command ID : FTM session config and control */
|
||||
#define HostCmd_CMD_FTM_SESSION_CFG 0x024d
|
||||
#define HostCmd_CMD_FTM_SESSION_CTRL 0x024E
|
||||
#define HostCmd_CMD_FTM_FEATURE_CTRL 0x024f
|
||||
#define HostCmd_CMD_WLS_REQ_FTM_RANGE 0x0250
|
||||
|
||||
/** Events*/
|
||||
#define EVENT_WLS_FTM_COMPLETE 0x00000086
|
||||
#define WLS_SUB_EVENT_FTM_COMPLETE 0
|
||||
#define WLS_SUB_EVENT_RADIO_RECEIVED 1
|
||||
#define WLS_SUB_EVENT_RADIO_RPT_RECEIVED 2
|
||||
#define WLS_SUB_EVENT_ANQP_RESP_RECEIVED 3
|
||||
#define WLS_SUB_EVENT_RTT_RESULTS 4
|
||||
|
||||
/** Custom events definitions */
|
||||
/** AP connected event */
|
||||
#define CUS_EVT_AP_CONNECTED "EVENT=AP_CONNECTED"
|
||||
/** Custom events definitions end */
|
||||
|
||||
/*TLVs*/
|
||||
/** TLV type ID definition */
|
||||
#define PROPRIETARY_TLV_BASE_ID 0x0100
|
||||
#define FTM_SESSION_CFG_INITATOR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 273)
|
||||
#define FTM_NTB_RANGING_CFG_TLV_ID (PROPRIETARY_TLV_BASE_ID + 343)
|
||||
#define FTM_RANGE_REPORT_TLV_ID \
|
||||
(PROPRIETARY_TLV_BASE_ID + 0x10C) /* 0x0100 + 0x10C = 0x20C */
|
||||
#define FTM_SESSION_CFG_LCI_TLV_ID (PROPRIETARY_TLV_BASE_ID + 270)
|
||||
#define FTM_SESSION_CFG_LOCATION_CIVIC_TLV_ID (PROPRIETARY_TLV_BASE_ID + 271)
|
||||
|
||||
/** Structure of command table*/
|
||||
typedef struct {
|
||||
/** User Command ID*/
|
||||
int cmd_id;
|
||||
/** Command name */
|
||||
char *cmd;
|
||||
/** Command function pointer */
|
||||
int (*func)(int argc, char *argv[], void *param);
|
||||
/** Command usuage */
|
||||
char **help;
|
||||
} wls_app_command_table;
|
||||
|
||||
/** Structure of FTM_SESSION_CFG_NTB_RANGING TLV data*/
|
||||
typedef struct _ntb_ranging_cfg {
|
||||
/** Indicates the channel BW for session*/
|
||||
/*0: HE20, 1: HE40, 2: HE80, 3: HE80+80, 4: HE160, 5:HE160_SRF*/
|
||||
t_u8 format_bw;
|
||||
/** indicates for bandwidths less than or equal to 80 MHz the maximum
|
||||
* number of space-time streams to be used in DL/UL NDP frames in the
|
||||
* session*/
|
||||
t_u8 max_i2r_sts_upto80;
|
||||
/**indicates for bandwidths less than or equal to 80 MHz the maximum
|
||||
* number of space-time streams to be used in DL/UL NDP frames in the
|
||||
* session*/
|
||||
t_u8 max_r2i_sts_upto80;
|
||||
/**Specify measurement freq in Hz to calculate measurement interval*/
|
||||
t_u8 az_measurement_freq;
|
||||
/**Indicates the number of measurements to be done for session*/
|
||||
t_u8 az_number_of_measurements;
|
||||
/**Include location civic request (Expect location civic from
|
||||
* responder)*/
|
||||
t_u8 civic_req;
|
||||
/**Include LCI request (Expect LCI info from responder)*/
|
||||
t_u8 lci_req;
|
||||
} __ATTRIB_PACK__ ntb_ranging_cfg_t;
|
||||
|
||||
/** Structure of FTM_SESSION_CFG TLV data*/
|
||||
typedef struct _ftm_session_cfg {
|
||||
/** Indicates how many burst instances are requested for the FTM
|
||||
* session*/
|
||||
t_u8 burst_exponent;
|
||||
/** Indicates the duration of a burst instance*/
|
||||
t_u8 burst_duration;
|
||||
/**Minimum time between consecutive FTM frames*/
|
||||
t_u8 min_delta_FTM;
|
||||
/**ASAP/non-ASAP casel*/
|
||||
t_u8 is_ASAP;
|
||||
/**Number of FTMs per burst*/
|
||||
t_u8 per_burst_FTM;
|
||||
/**FTM channel spacing: HT20/HT40/VHT80/…*/
|
||||
t_u8 channel_spacing;
|
||||
/**Indicates the interval between two consecutive burst instances*/
|
||||
t_u16 burst_period;
|
||||
} __ATTRIB_PACK__ ftm_session_cfg_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_LOCATION_CIVIC TLV data*/
|
||||
typedef struct _civic_loc_cfg {
|
||||
/**Civic location type*/
|
||||
t_u8 civic_location_type;
|
||||
/**Country code*/
|
||||
t_u16 country_code;
|
||||
/**Civic address type*/
|
||||
t_u8 civic_address_type;
|
||||
/**Civic address length*/
|
||||
t_u8 civic_address_length;
|
||||
/**Civic Address*/
|
||||
t_u8 civic_address[];
|
||||
} __ATTRIB_PACK__ civic_loc_cfg_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_LCI TLV data*/
|
||||
typedef struct _lci_cfg {
|
||||
/** known longitude*/
|
||||
double longitude;
|
||||
/** known Latitude*/
|
||||
double latitude;
|
||||
/** known altitude*/
|
||||
double altitude;
|
||||
/** known Latitude uncertainty*/
|
||||
t_u8 lat_unc;
|
||||
/** known Longitude uncertainty*/
|
||||
t_u8 long_unc;
|
||||
/** Known Altitude uncertainty*/
|
||||
t_u8 alt_unc;
|
||||
/** 1 word for additional Z information */
|
||||
t_u32 z_info;
|
||||
} __ATTRIB_PACK__ lci_cfg_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_NTB_RANGING TLV*/
|
||||
typedef struct _ntb_ranging_cfg_tlv {
|
||||
/** Type*/
|
||||
t_u16 type;
|
||||
/** Length*/
|
||||
t_u16 len;
|
||||
/** Value*/
|
||||
ntb_ranging_cfg_t val;
|
||||
} __ATTRIB_PACK__ ntb_ranging_cfg_tlv_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG TLV*/
|
||||
typedef struct _ftm_session_cfg_tlv {
|
||||
/** Type*/
|
||||
t_u16 type;
|
||||
/** Length*/
|
||||
t_u16 len;
|
||||
/** Value*/
|
||||
ftm_session_cfg_t val;
|
||||
t_u8 civic_req;
|
||||
t_u8 lci_req;
|
||||
} __ATTRIB_PACK__ ftm_session_cfg_tlv_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_LOCATION_CIVIC TLV*/
|
||||
typedef struct _civic_loc_tlv {
|
||||
/** Type*/
|
||||
t_u16 type;
|
||||
/** Length*/
|
||||
t_u16 len;
|
||||
/** Value*/
|
||||
civic_loc_cfg_t val;
|
||||
} __ATTRIB_PACK__ civic_loc_tlv_t;
|
||||
|
||||
/** Structure for FTM_SESSION_CFG_LCI TLV*/
|
||||
typedef struct _lci_tlv {
|
||||
/** Type*/
|
||||
t_u16 type;
|
||||
/** Length*/
|
||||
t_u16 len;
|
||||
/** Value*/
|
||||
lci_cfg_t val;
|
||||
} __ATTRIB_PACK__ lci_tlv_t;
|
||||
|
||||
/** Structure for DOT11MC FTM_SESSION_CFG */
|
||||
typedef struct _dot11mc_ftm_cfg {
|
||||
/** FTM session cfg*/
|
||||
ftm_session_cfg_tlv_t sess_tlv;
|
||||
/** Location Request cfg*/
|
||||
lci_tlv_t lci_tlv;
|
||||
/** Civic location cfg*/
|
||||
civic_loc_tlv_t civic_tlv;
|
||||
|
||||
} __ATTRIB_PACK__ dot11mc_ftm_cfg_t;
|
||||
|
||||
/** Structure for DOT11AZ FTM_SESSION_CFG */
|
||||
typedef struct _dot11az_ftmcfg_ntb_t {
|
||||
/** NTB session cfg */
|
||||
ntb_ranging_cfg_tlv_t ntb_tlv;
|
||||
} __ATTRIB_PACK__ dot11az_ftm_cfg_t;
|
||||
|
||||
/** Type definition for hostcmd_ftm_session_cfg */
|
||||
typedef struct _hostcmd_ftm_session_cfg {
|
||||
/** 0:Get, 1:Set */
|
||||
t_u16 action;
|
||||
/** FTM_SESSION_CFG_TLVs*/
|
||||
union {
|
||||
/**11az cfg*/
|
||||
dot11az_ftm_cfg_t cfg_11az;
|
||||
/** 11mc cfg*/
|
||||
dot11mc_ftm_cfg_t cfg_11mc;
|
||||
} tlv;
|
||||
} __ATTRIB_PACK__ hostcmd_ftm_session_cfg;
|
||||
|
||||
/** Type definition for hostcmd_ftm_session_ctrl */
|
||||
typedef struct _hostcmd_ftm_session_ctrl {
|
||||
/** 0: Not used, 1: Start, 2: Stop*/
|
||||
t_u16 action;
|
||||
/*FTM for ranging*/
|
||||
t_u8 for_ranging;
|
||||
/** Mac address of the peer with whom FTM session is required*/
|
||||
t_u8 peer_mac[ETH_ALEN];
|
||||
/** Channel on which FTM must be started */
|
||||
t_u8 chan;
|
||||
} __ATTRIB_PACK__ hostcmd_ftm_session_ctrl;
|
||||
|
||||
/** Type definition for generic Hostcmd for 11AZ FTM Session */
|
||||
typedef struct _hostcmd_ds_ftm_session_cmd {
|
||||
/** HostCmd_DS_GEN */
|
||||
HostCmd_DS_GEN cmd_hdr;
|
||||
/** Command Body */
|
||||
union {
|
||||
/** hostcmd for session_ctrl user command */
|
||||
hostcmd_ftm_session_ctrl ftm_session_ctrl;
|
||||
/** hostcmd for session_cfg user command */
|
||||
hostcmd_ftm_session_cfg ftm_session_cfg;
|
||||
} cmd;
|
||||
} __ATTRIB_PACK__ hostcmd_ds_ftm_session_cmd;
|
||||
|
||||
/** Type definition for FTM Session Events */
|
||||
|
||||
/** Event ID length */
|
||||
#define EVENT_ID_LEN 4
|
||||
|
||||
/**Structure for RTT results subevent*/
|
||||
typedef struct _wls_subevent_rtt_results_t {
|
||||
/** complete */
|
||||
t_u8 complete;
|
||||
/** tlv buffer */
|
||||
/** MrvlIEtypes_RTTResult_t */
|
||||
t_u8 tlv_buffer[];
|
||||
} __ATTRIB_PACK__ wls_subevent_rtt_results_t;
|
||||
|
||||
/**Structure for FTM complete subevent*/
|
||||
typedef struct _wls_subevent_ftm_complete {
|
||||
/** BSS Number */
|
||||
t_u8 bssNum;
|
||||
/** BSS Type */
|
||||
t_u8 bssType;
|
||||
/** MAC address of the responder */
|
||||
t_u8 mac[ETH_ALEN];
|
||||
/** Average RTT */
|
||||
t_u32 avg_rtt;
|
||||
/** Average Clock offset */
|
||||
t_u32 avg_clk_offset;
|
||||
/** Measure start timestamp */
|
||||
t_u32 meas_start_tsf;
|
||||
} __ATTRIB_PACK__ wls_subevent_ftm_complete_t;
|
||||
|
||||
/** TLV for FTM Range Report */
|
||||
typedef struct _range_report_tlv_t {
|
||||
/**Type*/
|
||||
t_u16 type;
|
||||
/**Length*/
|
||||
t_u16 len;
|
||||
/** MAC address of the responder */
|
||||
t_u8 mac[ETH_ALEN];
|
||||
/** Average RTT */
|
||||
t_u32 avg_rtt;
|
||||
/** Average Clock offset */
|
||||
t_u32 avg_clk_offset;
|
||||
/** LCI and Location Civic TLV */
|
||||
} __ATTRIB_PACK__ range_report_tlv_t;
|
||||
|
||||
/** Structure for FTM events*/
|
||||
typedef struct _wls_event_t {
|
||||
/** Event ID */
|
||||
t_u16 event_id;
|
||||
/** BSS index number for multiple BSS support */
|
||||
t_u8 bss_index;
|
||||
/** BSS type */
|
||||
t_u8 bss_type;
|
||||
/** sub event id */
|
||||
t_u8 sub_event_id;
|
||||
union {
|
||||
/** FTM Complete Sub event*/
|
||||
wls_subevent_ftm_complete_t ftm_complete;
|
||||
} e;
|
||||
} __ATTRIB_PACK__ wls_event_t;
|
||||
|
||||
/*Application Global Data*/
|
||||
typedef struct {
|
||||
/** Average RTT */
|
||||
t_u32 avg_rtt;
|
||||
/** Average Clock offset */
|
||||
t_u32 avg_clk_offset;
|
||||
/*Range*/
|
||||
t_s64 range;
|
||||
} range_results_t;
|
||||
|
||||
/** Structure for ftm command private data*/
|
||||
typedef struct _wls_app_data {
|
||||
/** 0 : 80211mc, 1:80211az*/
|
||||
t_u8 protocol_type;
|
||||
/** num of times to run FTM*/
|
||||
t_u8 loop_cnt;
|
||||
/** flag to run nonstop*/
|
||||
t_u8 run_nonstop;
|
||||
/** flag is associated */
|
||||
t_u8 associated;
|
||||
/** 0 - STA, 1- AP*/
|
||||
t_u8 bss_type;
|
||||
/**flag for ftm started */
|
||||
t_u8 ftm_started;
|
||||
/** flag for app to terminate ftm session*/
|
||||
t_u8 terminate_app;
|
||||
/**flag for debug print level */
|
||||
t_u8 debug_level;
|
||||
/**peer mac address */
|
||||
t_u8 peer_mac[ETH_ALEN];
|
||||
/**AP mac address */
|
||||
t_u8 ap_mac[ETH_ALEN];
|
||||
/** Channel number for FTM session*/
|
||||
t_u8 channel;
|
||||
/**SET/GET action */
|
||||
t_u8 hostcmd_action;
|
||||
/**Is LCI data available in cfg*/
|
||||
t_u8 lci_request;
|
||||
/** Is civic data available in cfg*/
|
||||
t_u8 civic_request;
|
||||
/**ntb cfg param*/
|
||||
ntb_ranging_cfg_t ntb_cfg;
|
||||
/** 11mc session cfg param*/
|
||||
ftm_session_cfg_t session_cfg;
|
||||
/** lci cfg data*/
|
||||
lci_cfg_t lci_cfg;
|
||||
/** civic cfg data - this should be last field*/
|
||||
civic_loc_cfg_t civic_cfg;
|
||||
} __ATTRIB_PACK__ wls_app_data_t;
|
||||
|
||||
int mlanwls_main(int argc, char *argv[]);
|
||||
#endif /* _WLS_H_ */
|
|
@ -4,7 +4,7 @@
|
|||
* It also defines the data structures used for APIs between MLAN and MOAL.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -192,7 +192,7 @@ static t_u8 wlan_get_nss_num_vht_mcs(t_u16 mcs_map_set)
|
|||
* @return N/A
|
||||
*/
|
||||
static void wlan_fill_cap_info(mlan_private *priv, VHT_capa_t *vht_cap,
|
||||
t_u8 bands)
|
||||
t_u16 bands)
|
||||
{
|
||||
t_u32 usr_dot_11ac_dev_cap;
|
||||
ENTER();
|
||||
|
@ -228,7 +228,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
|
|||
t_u32 hw_value = 0;
|
||||
t_u8 nss = 0;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
t_u16 rx_nss = 0;
|
||||
t_u16 tx_nss = 0;
|
||||
#endif
|
||||
|
@ -311,8 +312,10 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
|
|||
/** update the RX MCS map */
|
||||
if (cfg->param.vht_cfg.txrx & MLAN_RADIO_RX) {
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
if (cfg->param.vht_cfg.band == BAND_SELECT_A) {
|
||||
rx_nss = GET_RXMCSSUPP(
|
||||
|
@ -343,7 +346,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
|
|||
pmadapter->hw_dot_11ac_mcs_support,
|
||||
nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((rx_nss != 0) && (nss > rx_nss))
|
||||
cfg_value = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -370,7 +374,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
|
|||
pmadapter->hw_dot_11ac_mcs_support,
|
||||
nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((tx_nss != 0) && (nss > tx_nss))
|
||||
cfg_value = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -795,7 +800,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
|
|||
t_u16 mcs_resp = 0;
|
||||
t_u16 nss;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) | defined(USBNW62X)
|
||||
t_u16 rx_nss = 0, tx_nss = 0;
|
||||
#endif
|
||||
ENTER();
|
||||
|
@ -816,8 +822,10 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
|
|||
mcs_map_resp =
|
||||
wlan_le16_to_cpu(pvht_cap->vht_cap.mcs_sets.rx_mcs_map);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(priv->adapter->card_type) ||
|
||||
IS_CARDNW62X(priv->adapter->card_type) ||
|
||||
IS_CARD9097(priv->adapter->card_type)) {
|
||||
if (bands & BAND_A) {
|
||||
rx_nss = GET_RXMCSSUPP(priv->adapter->user_htstream >>
|
||||
|
@ -840,7 +848,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
|
|||
mcs_user = GET_VHTNSSMCS(mcs_map_user, nss);
|
||||
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((rx_nss != 0) && (nss > rx_nss))
|
||||
mcs_user = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -872,7 +881,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
|
|||
mcs_user = GET_VHTNSSMCS(mcs_map_user, nss);
|
||||
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((tx_nss != 0) && (nss > tx_nss))
|
||||
mcs_user = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -1088,7 +1098,8 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc)
|
|||
{
|
||||
t_u8 ret = MFALSE;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
t_u16 rx_nss = 0, tx_nss = 0;
|
||||
IEEEtypes_VHTCap_t *pvht_cap = pbss_desc->pvht_cap;
|
||||
MrvlIEtypes_He_cap_t *phecap = MNULL;
|
||||
|
@ -1098,8 +1109,10 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc)
|
|||
ENTER();
|
||||
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (!IS_CARD9098(pmpriv->adapter->card_type) &&
|
||||
!IS_CARDNW62X(pmpriv->adapter->card_type) &&
|
||||
!IS_CARD9097(pmpriv->adapter->card_type))
|
||||
return ret;
|
||||
/** check band A */
|
||||
|
@ -1151,7 +1164,8 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
int ret_len = 0;
|
||||
t_u8 bw_80p80 = MFALSE;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
t_u16 rx_nss = 0;
|
||||
#endif
|
||||
|
||||
|
@ -1222,8 +1236,10 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
/** set default bandwidth:80M*/
|
||||
SET_OPER_MODE_80M(pmrvl_oper_mode->oper_mode);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
if (pbss_desc->bss_band & BAND_A)
|
||||
rx_nss = GET_RXMCSSUPP(
|
||||
|
@ -1238,8 +1254,10 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
nss = wlan_get_nss_num_vht_mcs(mcs_map_user);
|
||||
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
PRINTM(MCMND, "rx_nss=%d nss=%d\n", rx_nss, nss);
|
||||
nss = MIN(rx_nss, nss);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for 11ax related features.
|
||||
*
|
||||
*
|
||||
* Copyright 2018-2021 NXP
|
||||
* Copyright 2018-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -142,6 +142,140 @@ static void wlan_show_dot11axphycap(pmlan_adapter pmadapter, t_u32 support)
|
|||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function fills the HE CAP IE w/ output format LE, not CPU
|
||||
*
|
||||
* @param priv A pointer to mlan_private structure
|
||||
* @param hecap_ie A pointer to IEEEtypes_HECap_t structure
|
||||
* @param band BAND_A (5G), otherwise, 2.4G
|
||||
*
|
||||
* @return bytes added to the phe_cap
|
||||
*/
|
||||
t_u8 wlan_fill_he_cap_ie(mlan_private *pmpriv, IEEEtypes_HECap_t *hecap_ie,
|
||||
t_u16 band)
|
||||
{
|
||||
pmlan_adapter pmadapter = pmpriv->adapter;
|
||||
MrvlIEtypes_He_cap_t *user_hecap_tlv = MNULL;
|
||||
MrvlIEtypes_He_cap_t *hw_hecap_tlv = MNULL;
|
||||
IEEEtypes_HeMcsNss_t *he_mcsnss = MNULL;
|
||||
t_u8 nss = 0;
|
||||
t_u16 cfg_value = 0;
|
||||
t_u16 hw_value = 0;
|
||||
|
||||
if (band & BAND_A) {
|
||||
user_hecap_tlv = (MrvlIEtypes_He_cap_t *)(pmpriv->user_he_cap);
|
||||
hw_hecap_tlv = (MrvlIEtypes_He_cap_t *)pmadapter->hw_he_cap;
|
||||
} else {
|
||||
user_hecap_tlv =
|
||||
(MrvlIEtypes_He_cap_t *)(pmpriv->user_2g_he_cap);
|
||||
hw_hecap_tlv = (MrvlIEtypes_He_cap_t *)pmadapter->hw_2g_he_cap;
|
||||
}
|
||||
|
||||
// include PPE threshold
|
||||
memcpy_ext(pmadapter, (t_u8 *)hecap_ie + sizeof(IEEEtypes_Header_t),
|
||||
(t_u8 *)user_hecap_tlv + sizeof(MrvlIEtypesHeader_t),
|
||||
user_hecap_tlv->len,
|
||||
sizeof(IEEEtypes_HECap_t) - sizeof(IEEEtypes_Header_t));
|
||||
|
||||
hecap_ie->ieee_hdr.element_id = EXTENSION;
|
||||
hecap_ie->ieee_hdr.len =
|
||||
MIN(user_hecap_tlv->len,
|
||||
sizeof(IEEEtypes_HECap_t) - sizeof(IEEEtypes_Header_t));
|
||||
hecap_ie->ext_id = HE_CAPABILITY;
|
||||
|
||||
he_mcsnss = (IEEEtypes_HeMcsNss_t *)hecap_ie->he_txrx_mcs_support;
|
||||
|
||||
cfg_value = GET_HE_NSSMCS(user_hecap_tlv->rx_mcs_80, nss);
|
||||
hw_value = GET_HE_NSSMCS(hw_hecap_tlv->rx_mcs_80, nss);
|
||||
for (nss = 1; nss <= 8; nss++) {
|
||||
if ((hw_value == NO_NSS_SUPPORT) ||
|
||||
(cfg_value == NO_NSS_SUPPORT)) {
|
||||
SET_HE_NSSMCS(he_mcsnss->rx_mcs, nss, NO_NSS_SUPPORT);
|
||||
} else {
|
||||
SET_HE_NSSMCS(he_mcsnss->rx_mcs, nss,
|
||||
MIN(cfg_value, hw_value));
|
||||
}
|
||||
}
|
||||
|
||||
cfg_value = GET_HE_NSSMCS(user_hecap_tlv->tx_mcs_80, nss);
|
||||
hw_value = GET_HE_NSSMCS(hw_hecap_tlv->tx_mcs_80, nss);
|
||||
for (nss = 1; nss <= 8; nss++) {
|
||||
if ((hw_value == NO_NSS_SUPPORT) ||
|
||||
(cfg_value == NO_NSS_SUPPORT)) {
|
||||
SET_HE_NSSMCS(he_mcsnss->tx_mcs, nss, NO_NSS_SUPPORT);
|
||||
} else {
|
||||
SET_HE_NSSMCS(he_mcsnss->tx_mcs, nss,
|
||||
MIN(cfg_value, hw_value));
|
||||
}
|
||||
}
|
||||
PRINTM(MCMND,
|
||||
"fill_11ax_ie: HE rx mcs_80 = 0x%08x tx mcs 80 = 0x%08x\n",
|
||||
he_mcsnss->rx_mcs, he_mcsnss->tx_mcs);
|
||||
|
||||
DBG_HEXDUMP(MCMD_D, "fill_11ax_ie", (t_u8 *)hecap_ie,
|
||||
hecap_ie->ieee_hdr.len + sizeof(IEEEtypes_Header_t));
|
||||
return hecap_ie->ieee_hdr.len;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function fills the HE cap tlv out put format is LE, not CPU
|
||||
*
|
||||
* @param priv A pointer to mlan_private structure
|
||||
* @param phe_cap A pointer to IEEEtypes_HECap_t structure
|
||||
* @param band BAND_A (5G), otherwise, 2.4G
|
||||
*
|
||||
* @return bytes added to the phe_cap
|
||||
*/
|
||||
t_u8 wlan_fill_he_op_ie(mlan_private *pmpriv, IEEEtypes_HeOp_t *heop_ie)
|
||||
{
|
||||
pmlan_adapter pmadapter = pmpriv->adapter;
|
||||
BSSDescriptor_t *pbss_desc = &pmpriv->curr_bss_params.bss_descriptor;
|
||||
IEEEtypes_HeOp_t *bss_heop_ie = MNULL;
|
||||
|
||||
memset(pmadapter, (void *)heop_ie, 0, sizeof(IEEEtypes_HeOp_t));
|
||||
|
||||
heop_ie->ieee_hdr.element_id = EXTENSION;
|
||||
heop_ie->ieee_hdr.len = sizeof(IEEEtypes_HeOp_t) -
|
||||
sizeof(IEEEtypes_Header_t) -
|
||||
sizeof(heop_ie->option);
|
||||
heop_ie->ext_id = HE_OPERATION;
|
||||
|
||||
// HE Operation Parameters
|
||||
heop_ie->he_op_param.default_pe_dur = 7;
|
||||
heop_ie->he_op_param.twt_req = 0;
|
||||
heop_ie->he_op_param.txop_dur_rts_threshold = 12;
|
||||
heop_ie->he_op_param.vht_op_info_present = 0;
|
||||
heop_ie->he_op_param.co_located_bss = 0;
|
||||
heop_ie->he_op_param.er_su_disable = 0;
|
||||
// HE BSS Color Information (following the AP)
|
||||
if (pbss_desc->phe_oprat) {
|
||||
bss_heop_ie = (IEEEtypes_HeOp_t *)(pbss_desc->phe_oprat);
|
||||
heop_ie->bss_color_info.bss_color =
|
||||
bss_heop_ie->bss_color_info.bss_color;
|
||||
} else {
|
||||
// default color
|
||||
heop_ie->bss_color_info.bss_color = 1;
|
||||
}
|
||||
heop_ie->bss_color_info.partial_bss_color = 0;
|
||||
heop_ie->bss_color_info.bss_color_disabled = 0;
|
||||
// Rx HE MCS MAP
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_1ss = 0;
|
||||
#if defined(SD9177)
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_2ss = 3;
|
||||
#else
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_2ss = 0;
|
||||
#endif
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_3ss = 3;
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_4ss = 3;
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_5ss = 3;
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_6ss = 3;
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_7ss = 3;
|
||||
heop_ie->basic_he_mcs_nss.max_mcs_8ss = 3;
|
||||
|
||||
return heop_ie->ieee_hdr.len;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function fills the HE cap tlv out put format is LE, not CPU
|
||||
*
|
||||
|
@ -153,13 +287,14 @@ static void wlan_show_dot11axphycap(pmlan_adapter pmadapter, t_u32 support)
|
|||
*
|
||||
* @return bytes added to the phe_cap
|
||||
*/
|
||||
t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u8 band,
|
||||
t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
|
||||
MrvlIEtypes_Extension_t *phe_cap, t_u8 flag)
|
||||
{
|
||||
pmlan_adapter pmadapter = pmpriv->adapter;
|
||||
t_u16 len = 0;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
t_u16 rx_nss = 0, tx_nss = 0;
|
||||
#endif
|
||||
MrvlIEtypes_He_cap_t *phecap = MNULL;
|
||||
|
@ -172,7 +307,7 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u8 band,
|
|||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
if (band & BAND_A) {
|
||||
if (band & BAND_AAX) {
|
||||
memcpy_ext(pmadapter, (t_u8 *)phe_cap, pmpriv->user_he_cap,
|
||||
pmpriv->user_hecap_len,
|
||||
sizeof(MrvlIEtypes_He_cap_t));
|
||||
|
@ -188,10 +323,11 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u8 band,
|
|||
phe_cap->type = wlan_cpu_to_le16(phe_cap->type);
|
||||
phe_cap->len = wlan_cpu_to_le16(phe_cap->len);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmpriv->adapter->card_type) ||
|
||||
IS_CARD9097(pmpriv->adapter->card_type)) {
|
||||
if (band & BAND_A) {
|
||||
if (band & BAND_AAX) {
|
||||
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
|
||||
8);
|
||||
tx_nss = GET_TXMCSSUPP(pmpriv->adapter->user_htstream >>
|
||||
|
@ -209,7 +345,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u8 band,
|
|||
cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss);
|
||||
hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((rx_nss != 0) && (nss > rx_nss))
|
||||
cfg_value = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -224,7 +361,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u8 band,
|
|||
cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss);
|
||||
hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((tx_nss != 0) && (nss > tx_nss))
|
||||
cfg_value = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -260,7 +398,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
int len = 0;
|
||||
t_u8 bw_80p80 = MFALSE;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
t_u16 rx_nss = 0, tx_nss = 0;
|
||||
#endif
|
||||
t_u8 nss = 0;
|
||||
|
@ -303,8 +442,10 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
phecap->type = wlan_cpu_to_le16(phecap->type);
|
||||
phecap->len = wlan_cpu_to_le16(phecap->len);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmpriv->adapter->card_type) ||
|
||||
IS_CARDNW62X(pmpriv->adapter->card_type) ||
|
||||
IS_CARD9097(pmpriv->adapter->card_type)) {
|
||||
if (pbss_desc->bss_band & BAND_A) {
|
||||
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
|
||||
|
@ -326,7 +467,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss);
|
||||
hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((rx_nss != 0) && (nss > rx_nss))
|
||||
cfg_value = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -341,7 +483,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss);
|
||||
hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if ((tx_nss != 0) && (nss > tx_nss))
|
||||
cfg_value = NO_NSS_SUPPORT;
|
||||
#endif
|
||||
|
@ -447,13 +590,15 @@ void wlan_update_11ax_cap(mlan_adapter *pmadapter,
|
|||
* @brief This function check if 11AX is allowed in bandcfg
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param bss_band bss band
|
||||
* @param pbss_desc A pointer to BSSDescriptor_t
|
||||
*
|
||||
* @return 0--not allowed, other value allowed
|
||||
*/
|
||||
t_u16 wlan_11ax_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band)
|
||||
t_u16 wlan_11ax_bandconfig_allowed(mlan_private *pmpriv,
|
||||
BSSDescriptor_t *pbss_desc)
|
||||
{
|
||||
if (!IS_FW_SUPPORT_11AX(pmpriv->adapter))
|
||||
t_u16 bss_band = pbss_desc->bss_band;
|
||||
if (pbss_desc->disable_11n)
|
||||
return MFALSE;
|
||||
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS) {
|
||||
if (bss_band & BAND_G)
|
||||
|
@ -597,7 +742,6 @@ mlan_status wlan_cmd_11ax_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
cmd->size += hecfg->he_cap.len + sizeof(MrvlIEtypesHeader_t);
|
||||
pos += hecfg->he_cap.len + sizeof(MrvlIEtypesHeader_t);
|
||||
}
|
||||
|
||||
cmd->size = wlan_cpu_to_le16(cmd->size);
|
||||
|
||||
LEAVE();
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for station ioctl.
|
||||
*
|
||||
*
|
||||
* Copyright 2018-2020 NXP
|
||||
* Copyright 2018-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -44,13 +44,18 @@ mlan_status wlan_11ax_ioctl_twtcfg(pmlan_adapter pmadapter,
|
|||
pmlan_ioctl_req pioctl_req);
|
||||
mlan_status wlan_cmd_twt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf);
|
||||
t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u8 band,
|
||||
t_u8 wlan_fill_he_cap_ie(mlan_private *pmpriv, IEEEtypes_HECap_t *hecap_ie,
|
||||
t_u16 band);
|
||||
t_u8 wlan_fill_he_op_ie(mlan_private *pmpriv, IEEEtypes_HeOp_t *heop_ie);
|
||||
t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
|
||||
MrvlIEtypes_Extension_t *phe_cap, t_u8 flag);
|
||||
void wlan_update_11ax_cap(mlan_adapter *pmadapter,
|
||||
MrvlIEtypes_Extension_t *hw_he_cap);
|
||||
|
||||
int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
||||
t_u8 **ppbuffer);
|
||||
t_u16 wlan_11ax_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band);
|
||||
t_u16 wlan_11ax_bandconfig_allowed(mlan_private *pmpriv,
|
||||
BSSDescriptor_t *pbss_desc);
|
||||
mlan_status wlan_11ax_cfg_ioctl(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
mlan_status wlan_11ax_ioctl_cmd(pmlan_adapter pmadapter,
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains functions for 802.11D.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -119,14 +119,16 @@ static chan_freq_power_t channel_freq_power_UN_AJ[] = {
|
|||
{153, 5765, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{157, 5785, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{161, 5805, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{165, 5825, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}
|
||||
{165, 5825, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{169, 5845, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{173, 5865, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{177, 5885, TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}
|
||||
/* {240, 4920, TX_PWR_DEFAULT},
|
||||
{244, 4940, TX_PWR_DEFAULT},
|
||||
{248, 4960, TX_PWR_DEFAULT},
|
||||
{252, 4980, TX_PWR_DEFAULT},
|
||||
channels for 11J JP 10M channel gap */
|
||||
};
|
||||
|
||||
/********************************************************
|
||||
Global Variables
|
||||
********************************************************/
|
||||
|
@ -172,7 +174,7 @@ static t_u8 *wlan_11d_code_2_region(pmlan_adapter pmadapter, t_u8 code)
|
|||
*
|
||||
* @return MTRUE or MFALSE
|
||||
*/
|
||||
static t_u8 wlan_11d_channel_known(pmlan_adapter pmadapter, t_u8 band,
|
||||
static t_u8 wlan_11d_channel_known(pmlan_adapter pmadapter, t_u16 band,
|
||||
t_u8 chan,
|
||||
parsed_region_chan_11d_t *parsed_region_chan)
|
||||
{
|
||||
|
@ -294,6 +296,8 @@ wlan_11d_generate_domain_info(pmlan_adapter pmadapter,
|
|||
/* Should be only place that clear domain_reg (besides init) */
|
||||
memset(pmadapter, domain_info, 0, sizeof(wlan_802_11d_domain_reg_t));
|
||||
|
||||
domain_info->dfs_region = NXP_DFS_UNKNOWN;
|
||||
|
||||
/* Set country code */
|
||||
memcpy_ext(pmadapter, domain_info->country_code,
|
||||
wlan_11d_code_2_region(pmadapter,
|
||||
|
@ -375,7 +379,8 @@ static mlan_status wlan_11d_update_chan_pwr_table(mlan_private *pmpriv,
|
|||
|
||||
chan = pbss_desc->phy_param_set.ds_param_set.current_chan;
|
||||
|
||||
tx_power = wlan_get_txpwr_of_chan_from_cfp(pmpriv, chan);
|
||||
tx_power = wlan_get_txpwr_of_chan_from_cfp(pmpriv, pbss_desc->bss_band,
|
||||
chan);
|
||||
|
||||
if (!tx_power) {
|
||||
PRINTM(MMSG, "11D: Invalid channel\n");
|
||||
|
@ -426,7 +431,7 @@ static mlan_status wlan_11d_update_chan_pwr_table(mlan_private *pmpriv,
|
|||
*
|
||||
* @return MTRUE or MFALSE
|
||||
*/
|
||||
static t_u8 wlan_11d_get_chan(pmlan_adapter pmadapter, t_u8 band,
|
||||
static t_u8 wlan_11d_get_chan(pmlan_adapter pmadapter, t_u16 band,
|
||||
t_u8 first_chan, t_u8 no_of_chan, t_u8 *chan)
|
||||
{
|
||||
chan_freq_power_t *cfp = MNULL;
|
||||
|
@ -490,7 +495,7 @@ static mlan_status wlan_11d_process_country_info(mlan_private *pmpriv,
|
|||
|
||||
/* Parse 11D country info */
|
||||
if (wlan_11d_parse_domain_info(pmadapter, &pbss_desc->country_info,
|
||||
(t_u8)pbss_desc->bss_band,
|
||||
pbss_desc->bss_band,
|
||||
®ion_chan) != MLAN_STATUS_SUCCESS) {
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
|
@ -659,13 +664,14 @@ static mlan_status wlan_11d_send_domain_info(mlan_private *pmpriv,
|
|||
* @param country_code Intended country code
|
||||
* @param num_sub_band Count of tuples in list below
|
||||
* @param sub_band_list List of sub_band tuples
|
||||
* @param dfs_region 0-unset,1-fcc,2-etsi,3-JP, 0xff-unknown
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
static mlan_status
|
||||
wlan_11d_set_domain_info(mlan_private *pmpriv, t_u8 band,
|
||||
wlan_11d_set_domain_info(mlan_private *pmpriv, t_u16 band,
|
||||
t_u8 country_code[COUNTRY_CODE_LEN], t_u8 num_sub_band,
|
||||
IEEEtypes_SubbandSet_t *sub_band_list)
|
||||
IEEEtypes_SubbandSet_t *sub_band_list, t_u8 dfs_region)
|
||||
{
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
wlan_802_11d_domain_reg_t *pdomain = &pmadapter->domain_reg;
|
||||
|
@ -674,6 +680,7 @@ wlan_11d_set_domain_info(mlan_private *pmpriv, t_u8 band,
|
|||
ENTER();
|
||||
|
||||
memset(pmadapter, pdomain, 0, sizeof(wlan_802_11d_domain_reg_t));
|
||||
pdomain->dfs_region = dfs_region;
|
||||
memcpy_ext(pmadapter, pdomain->country_code, country_code,
|
||||
COUNTRY_CODE_LEN, COUNTRY_CODE_LEN);
|
||||
pdomain->band = band;
|
||||
|
@ -846,13 +853,15 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
|
|||
&pcmd->params.domain_info;
|
||||
MrvlIEtypes_DomainParamSet_t *domain = &pdomain_info->domain;
|
||||
t_u8 no_of_sub_band = pmadapter->domain_reg.no_of_sub_band;
|
||||
MrvlIEtypes_Rgn_dom_code_t *rgn = MNULL;
|
||||
t_u8 i;
|
||||
|
||||
ENTER();
|
||||
PRINTM(MCMND, "11D:Country=%c%c band=%d sub-band=5d\n",
|
||||
PRINTM(MCMND, "11D:Country=%c%c band=%d sub-band=%d dfs_region=%d\n",
|
||||
pmadapter->domain_reg.country_code[0],
|
||||
pmadapter->domain_reg.country_code[1],
|
||||
pmadapter->domain_reg.band, no_of_sub_band);
|
||||
pmadapter->domain_reg.band, no_of_sub_band,
|
||||
pmadapter->domain_reg.dfs_region);
|
||||
for (i = 0; i < no_of_sub_band; i++) {
|
||||
PRINTM(MCMND,
|
||||
"11D: first chan=%d no_of_chan=%d, max_tx_pwr=%d\n",
|
||||
|
@ -890,15 +899,25 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
|
|||
MRVDRV_MAX_SUBBAND_802_11D *
|
||||
sizeof(IEEEtypes_SubbandSet_t));
|
||||
|
||||
pcmd->size = wlan_cpu_to_le16(
|
||||
sizeof(pdomain_info->action) + domain->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t) + S_DS_GEN);
|
||||
pcmd->size = sizeof(pdomain_info->action) + domain->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t) + S_DS_GEN;
|
||||
|
||||
if (pmadapter->domain_reg.dfs_region != NXP_DFS_UNKNOWN) {
|
||||
rgn = (MrvlIEtypes_Rgn_dom_code_t
|
||||
*)((t_u8 *)&pdomain_info->domain +
|
||||
domain->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
rgn->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_REGION_DOMAIN_CODE);
|
||||
rgn->header.len = 2;
|
||||
rgn->domain_code = pmadapter->domain_reg.dfs_region;
|
||||
pcmd->size += sizeof(MrvlIEtypes_Rgn_dom_code_t);
|
||||
}
|
||||
} else {
|
||||
pcmd->size = wlan_cpu_to_le16(sizeof(pdomain_info->action) +
|
||||
S_DS_GEN);
|
||||
pcmd->size = sizeof(pdomain_info->action) + S_DS_GEN;
|
||||
}
|
||||
domain->header.len = wlan_cpu_to_le16(domain->header.len);
|
||||
|
||||
pcmd->size = wlan_cpu_to_le16(pcmd->size);
|
||||
HEXDUMP("11D: 802_11D_DOMAIN_INFO", (t_u8 *)pcmd,
|
||||
wlan_le16_to_cpu(pcmd->size));
|
||||
|
||||
|
@ -967,7 +986,7 @@ mlan_status wlan_ret_802_11d_domain_info(mlan_private *pmpriv,
|
|||
*
|
||||
* @return Channel frequency
|
||||
*/
|
||||
t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u8 band)
|
||||
t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u16 band)
|
||||
{
|
||||
chan_freq_power_t *cf;
|
||||
t_u16 cnt;
|
||||
|
@ -976,15 +995,19 @@ t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u8 band)
|
|||
|
||||
ENTER();
|
||||
|
||||
/* Get channel-frequency-power trios */
|
||||
if (band & (BAND_A | BAND_AN | BAND_AAC)) {
|
||||
cf = channel_freq_power_UN_AJ;
|
||||
cnt = NELEMENTS(channel_freq_power_UN_AJ);
|
||||
} else {
|
||||
if (band & (BAND_B | BAND_G | BAND_GN | BAND_GAC)) {
|
||||
cf = channel_freq_power_UN_BG;
|
||||
cnt = NELEMENTS(channel_freq_power_UN_BG);
|
||||
}
|
||||
|
||||
/* Get channel-frequency-power trios */
|
||||
else if (band & (BAND_A | BAND_AN | BAND_AAC)) {
|
||||
cf = channel_freq_power_UN_AJ;
|
||||
cnt = NELEMENTS(channel_freq_power_UN_AJ);
|
||||
} else {
|
||||
PRINTM(MERROR, "11D: Wrong Band [%d]\n", band);
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
/* Locate channel and return corresponding frequency */
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (chan == cf[i].channel)
|
||||
|
@ -1008,7 +1031,7 @@ t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u8 band)
|
|||
*/
|
||||
mlan_status wlan_11d_parse_domain_info(
|
||||
pmlan_adapter pmadapter, IEEEtypes_CountryInfoFullSet_t *country_info,
|
||||
t_u8 band, parsed_region_chan_11d_t *parsed_region_chan)
|
||||
t_u16 band, parsed_region_chan_11d_t *parsed_region_chan)
|
||||
{
|
||||
t_u8 no_of_sub_band, no_of_chan;
|
||||
t_u8 last_chan, first_chan, cur_chan = 0;
|
||||
|
@ -1096,7 +1119,7 @@ mlan_status wlan_11d_parse_domain_info(
|
|||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u8 band)
|
||||
mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u16 band)
|
||||
{
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
t_u16 i = 0;
|
||||
|
@ -1166,7 +1189,7 @@ mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u8 band)
|
|||
* @return PASSIVE if chan is unknown; ACTIVE
|
||||
* if chan is known
|
||||
*/
|
||||
t_u8 wlan_11d_get_scan_type(pmlan_adapter pmadapter, t_u8 band, t_u8 chan,
|
||||
t_u8 wlan_11d_get_scan_type(pmlan_adapter pmadapter, t_u16 band, t_u8 chan,
|
||||
parsed_region_chan_11d_t *parsed_region_chan)
|
||||
{
|
||||
t_u8 scan_type = MLAN_SCAN_TYPE_PASSIVE;
|
||||
|
@ -1218,7 +1241,7 @@ mlan_status wlan_11d_clear_parsedtable(mlan_private *pmpriv)
|
|||
*
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u8 band)
|
||||
mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u16 band)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
|
@ -1342,8 +1365,7 @@ mlan_status wlan_11d_parse_dnld_countryinfo(mlan_private *pmpriv,
|
|||
/* Parse domain info if available */
|
||||
ret = wlan_11d_parse_domain_info(
|
||||
pmadapter, &pbss_desc->country_info,
|
||||
(t_u8)pbss_desc->bss_band,
|
||||
&bssdesc_region_chan);
|
||||
pbss_desc->bss_band, &bssdesc_region_chan);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS) {
|
||||
/* Update the channel-power table */
|
||||
|
@ -1514,7 +1536,8 @@ mlan_status wlan_11d_cfg_domain_info(pmlan_adapter pmadapter,
|
|||
pmpriv, domain_info->band,
|
||||
wlan_11d_map_country_code(pmadapter, domain_info->country_code),
|
||||
domain_info->no_of_sub_band,
|
||||
(IEEEtypes_SubbandSet_t *)domain_info->sub_band);
|
||||
(IEEEtypes_SubbandSet_t *)domain_info->sub_band,
|
||||
domain_info->dfs_region);
|
||||
ret = wlan_11d_send_domain_info(pmpriv, pioctl_req);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
|
@ -1559,7 +1582,7 @@ done:
|
|||
*
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u8 band,
|
||||
mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band,
|
||||
t_u8 *domain_tlv,
|
||||
t_void *pioctl_buf)
|
||||
{
|
||||
|
@ -1603,7 +1626,8 @@ mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u8 band,
|
|||
* Add some checking or merging between STA & UAP domain_info
|
||||
*/
|
||||
wlan_11d_set_domain_info(pmpriv, band, pdomain_tlv->country_code,
|
||||
num_sub_band, pdomain_tlv->sub_band);
|
||||
num_sub_band, pdomain_tlv->sub_band,
|
||||
NXP_DFS_UNKNOWN);
|
||||
ret = wlan_11d_send_domain_info(pmpriv, pioctl_buf);
|
||||
|
||||
done:
|
||||
|
|
|
@ -118,6 +118,8 @@ static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_mid_upper_band_1 = {
|
|||
/** U-NII sub-band config : Start Channel = 149, NumChans = 5 */
|
||||
static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_upper_band = {149,
|
||||
5};
|
||||
/** U-NII sub-band config : Start Channel = 169, NumChans = 3 */
|
||||
static const IEEEtypes_SupportChan_Subband_t wlan_11h_unii_4_band = {169, 3};
|
||||
|
||||
/** Internally passed structure used to send a CMD_802_11_TPC_INFO command */
|
||||
typedef struct {
|
||||
|
@ -298,7 +300,7 @@ static t_u32 wlan_11h_set_ibss_dfs_ie(mlan_private *priv,
|
|||
* - 0 if returned element is not setup
|
||||
*/
|
||||
static t_u16
|
||||
wlan_11h_set_supp_channels_ie(mlan_private *priv, t_u8 band,
|
||||
wlan_11h_set_supp_channels_ie(mlan_private *priv, t_u16 band,
|
||||
IEEEtypes_SupportedChannels_t *psup_chan)
|
||||
{
|
||||
t_u16 num_subbands = 0;
|
||||
|
@ -352,6 +354,17 @@ wlan_11h_set_supp_channels_ie(mlan_private *priv, t_u8 band,
|
|||
*/
|
||||
switch (cfp_a) {
|
||||
case 0x10: /* USA FCC */
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_lower_band;
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_middle_band;
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_mid_upper_band;
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_upper_band;
|
||||
psup_chan->subband[num_subbands++] =
|
||||
wlan_11h_unii_4_band;
|
||||
break;
|
||||
case 0x20: /* Canada IC */
|
||||
case 0x30: /* Europe ETSI */
|
||||
default:
|
||||
|
@ -589,6 +602,7 @@ static mlan_status wlan_11h_cmd_chan_rpt_req(mlan_private *priv,
|
|||
wlan_dfs_device_state_t *pstate_dfs = &priv->adapter->state_dfs;
|
||||
MrvlIEtypes_ChanRpt11hBasic_t *ptlv_basic;
|
||||
t_bool is_cancel_req = MFALSE;
|
||||
MrvlIEtypes_ZeroDfsOperation_t *ptlv_zero_dfs;
|
||||
t_u8 dfs53cfg = priv->adapter->dfs53cfg;
|
||||
MrvlIEtypes_DfsW53Cfg_t *ptlv_dfs53cfg;
|
||||
|
||||
|
@ -601,7 +615,8 @@ static mlan_status wlan_11h_cmd_chan_rpt_req(mlan_private *priv,
|
|||
if (pchan_rpt_req->millisec_dwell_time == 0)
|
||||
is_cancel_req = MTRUE;
|
||||
|
||||
if (pstate_dfs->dfs_check_pending && !is_cancel_req) {
|
||||
if (pstate_dfs->dfs_check_pending && !is_cancel_req &&
|
||||
priv->bss_type != MLAN_BSS_TYPE_DFS) {
|
||||
PRINTM(MERROR,
|
||||
"11h: ChanRptReq - previous CMD_CHAN_REPORT_REQUEST has"
|
||||
" not returned its result yet (as EVENT_CHANNEL_READY)."
|
||||
|
@ -650,6 +665,29 @@ static mlan_status wlan_11h_cmd_chan_rpt_req(mlan_private *priv,
|
|||
pcmd_ptr->size += sizeof(MrvlIEtypes_DfsW53Cfg_t);
|
||||
}
|
||||
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS) {
|
||||
memcpy_ext(priv->adapter, &priv->chan_rep_req, pchan_rpt_req,
|
||||
sizeof(mlan_ds_11h_chan_rep_req),
|
||||
sizeof(priv->chan_rep_req));
|
||||
ptlv_zero_dfs =
|
||||
(MrvlIEtypes_ZeroDfsOperation_t *)(((t_u8 *)(pcmd_ptr)) +
|
||||
pcmd_ptr->size);
|
||||
ptlv_zero_dfs->Header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_ZERO_DFS_OPERATION);
|
||||
ptlv_zero_dfs->Header.len = wlan_cpu_to_le16(sizeof(t_u8));
|
||||
if (!is_cancel_req) {
|
||||
ptlv_zero_dfs->zero_dfs_enbl = MTRUE;
|
||||
PRINTM(MCMND, "ZeroDFS: START: chan=%d\n",
|
||||
pchan_rpt_req->chan_desc.chanNum);
|
||||
} else {
|
||||
ptlv_zero_dfs->zero_dfs_enbl = MFALSE;
|
||||
PRINTM(MCMND, "ZeroDFS: STOP\n");
|
||||
}
|
||||
pcmd_ptr->size += sizeof(MrvlIEtypes_ZeroDfsOperation_t);
|
||||
pcmd_ptr->size = wlan_cpu_to_le16(pcmd_ptr->size);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
pcmd_ptr->size = wlan_cpu_to_le16(pcmd_ptr->size);
|
||||
|
||||
/* update dfs sturcture.
|
||||
|
@ -733,7 +771,7 @@ static t_u32 wlan_11h_set_local_power_constraint_tlv(
|
|||
* buffer (ppbuffer)
|
||||
*/
|
||||
static t_u32 wlan_11h_process_infra_join(mlan_private *priv, t_u8 **ppbuffer,
|
||||
t_u8 band, t_u32 channel,
|
||||
t_u16 band, t_u32 channel,
|
||||
wlan_11h_bss_info_t *p11h_bss_info)
|
||||
{
|
||||
MrvlIEtypesHeader_t ie_header;
|
||||
|
@ -1352,6 +1390,8 @@ static t_bool wlan_11h_is_band_valid(mlan_private *priv, t_u8 start_chn,
|
|||
* return MFALSE, 165 is not allowed in bands other than 20MHZ
|
||||
*/
|
||||
if (start_chn == 165) {
|
||||
if (priv->adapter->region_code == COUNTRY_CODE_US)
|
||||
return MTRUE;
|
||||
if (uap_band_cfg.chanWidth != CHAN_BW_20MHZ)
|
||||
return MFALSE;
|
||||
}
|
||||
|
@ -1916,6 +1956,7 @@ t_void wlan_11h_cleanup(mlan_adapter *adapter)
|
|||
{
|
||||
wlan_dfs_device_state_t *pstate_dfs = &adapter->state_dfs;
|
||||
wlan_dfs_timestamp_t *pdfs_ts;
|
||||
mlan_private *priv = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -1926,6 +1967,10 @@ t_void wlan_11h_cleanup(mlan_adapter *adapter)
|
|||
util_unlink_list(adapter->pmoal_handle,
|
||||
&pstate_dfs->dfs_ts_head,
|
||||
(pmlan_linked_list)pdfs_ts, MNULL, MNULL);
|
||||
priv = wlan_get_priv(adapter, MLAN_BSS_ROLE_ANY);
|
||||
if (priv)
|
||||
wlan_set_chan_dfs_state(priv, BAND_A, pdfs_ts->channel,
|
||||
DFS_USABLE);
|
||||
adapter->callbacks.moal_mfree(adapter->pmoal_handle,
|
||||
(t_u8 *)pdfs_ts);
|
||||
|
||||
|
@ -2448,7 +2493,7 @@ t_s32 wlan_11h_process_start(mlan_private *priv, t_u8 **ppbuffer,
|
|||
* or MLAN_STATUS_SUCCESS (0)
|
||||
*/
|
||||
t_s32 wlan_11h_process_join(mlan_private *priv, t_u8 **ppbuffer,
|
||||
IEEEtypes_CapInfo_t *pcap_info, t_u8 band,
|
||||
IEEEtypes_CapInfo_t *pcap_info, t_u16 band,
|
||||
t_u32 channel, wlan_11h_bss_info_t *p11h_bss_info)
|
||||
{
|
||||
t_s32 ret = 0;
|
||||
|
@ -2623,6 +2668,8 @@ mlan_status wlan_11h_cmdresp_process(mlan_private *priv,
|
|||
break;
|
||||
|
||||
case HostCmd_CMD_CHAN_REPORT_REQUEST:
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS)
|
||||
break;
|
||||
priv->adapter->state_dfs.dfs_check_priv = priv;
|
||||
priv->adapter->state_dfs.dfs_check_pending = MTRUE;
|
||||
|
||||
|
@ -3018,6 +3065,52 @@ mlan_status wlan_11h_ioctl_chan_switch_count(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get/Set 802.11h channel dfs state
|
||||
*
|
||||
* @param pmadapter Pointer to mlan_adapter
|
||||
* @param pioctl_req Pointer to mlan_ioctl_req
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
mlan_status wlan_11h_ioctl_chan_dfs_state(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_ds_11h_cfg *ds_11hcfg = MNULL;
|
||||
t_s32 ret = MLAN_STATUS_FAILURE;
|
||||
pmlan_private priv = pmadapter->priv[pioctl_req->bss_index];
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req) {
|
||||
ds_11hcfg = (mlan_ds_11h_cfg *)pioctl_req->pbuf;
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_GET) {
|
||||
wlan_11h_is_channel_under_nop(
|
||||
pmadapter,
|
||||
ds_11hcfg->param.ch_dfs_state.channel);
|
||||
ds_11hcfg->param.ch_dfs_state.dfs_required =
|
||||
wlan_11h_radar_detect_required(
|
||||
priv,
|
||||
ds_11hcfg->param.ch_dfs_state.channel);
|
||||
if (ds_11hcfg->param.ch_dfs_state.dfs_required)
|
||||
ds_11hcfg->param.ch_dfs_state
|
||||
.dfs_state = wlan_get_chan_dfs_state(
|
||||
priv, BAND_A,
|
||||
ds_11hcfg->param.ch_dfs_state.channel);
|
||||
} else {
|
||||
wlan_set_chan_dfs_state(
|
||||
priv, BAND_A,
|
||||
ds_11hcfg->param.ch_dfs_state.channel,
|
||||
ds_11hcfg->param.ch_dfs_state.dfs_state);
|
||||
}
|
||||
ret = MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 802.11h DFS chan report
|
||||
*
|
||||
|
@ -3064,6 +3157,7 @@ t_bool wlan_11h_is_channel_under_nop(mlan_adapter *pmadapter, t_u8 channel)
|
|||
wlan_dfs_timestamp_t *pdfs_ts = MNULL;
|
||||
t_u32 now_sec, now_usec;
|
||||
t_bool ret = MFALSE;
|
||||
mlan_private *priv;
|
||||
ENTER();
|
||||
pdfs_ts = wlan_11h_find_dfs_timestamp(pmadapter, channel);
|
||||
|
||||
|
@ -3089,6 +3183,10 @@ t_bool wlan_11h_is_channel_under_nop(mlan_adapter *pmadapter, t_u8 channel)
|
|||
/* if entry is expired, remove it */
|
||||
if (!ret) {
|
||||
wlan_11h_remove_dfs_timestamp(pmadapter, pdfs_ts);
|
||||
priv = wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY);
|
||||
if (priv)
|
||||
wlan_set_chan_dfs_state(priv, BAND_A, channel,
|
||||
DFS_USABLE);
|
||||
} else
|
||||
PRINTM(MMSG,
|
||||
"11h: channel %d is under NOP - can't use.\n",
|
||||
|
@ -3123,12 +3221,16 @@ mlan_status wlan_11h_handle_event_chanrpt_ready(mlan_private *priv,
|
|||
wlan_dfs_device_state_t *pstate_dfs = &priv->adapter->state_dfs;
|
||||
t_u8 dfs_radar_found = MFALSE;
|
||||
t_u8 dfs_check_channel = pstate_dfs->dfs_check_channel;
|
||||
MrvlIEtypes_channel_band_t *tlv;
|
||||
|
||||
ENTER();
|
||||
pchan_rpt_rsp = (HostCmd_DS_CHAN_RPT_RSP *)&pevent->event_buf;
|
||||
DBG_HEXDUMP(MCMD_D, "11h: Event ChanRptReady (HostCmd_DS_CHAN_RPT_RSP)",
|
||||
(t_u8 *)pchan_rpt_rsp, pevent->event_len);
|
||||
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS)
|
||||
dfs_check_channel = priv->chan_rep_req.chanNum;
|
||||
|
||||
if (wlan_le32_to_cpu(pchan_rpt_rsp->cmd_result) ==
|
||||
MLAN_CMD_RESULT_SUCCESS) {
|
||||
pbuffer = (t_u8 *)&pchan_rpt_rsp->tlv_buffer;
|
||||
|
@ -3147,6 +3249,10 @@ mlan_status wlan_11h_handle_event_chanrpt_ready(mlan_private *priv,
|
|||
if (pmeas_rpt_basic->radar)
|
||||
dfs_radar_found = MTRUE;
|
||||
break;
|
||||
case TLV_TYPE_CHANNELBANDLIST:
|
||||
tlv = (MrvlIEtypes_channel_band_t *)ptlv;
|
||||
dfs_check_channel = tlv->channel;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -3166,6 +3272,12 @@ mlan_status wlan_11h_handle_event_chanrpt_ready(mlan_private *priv,
|
|||
dfs_check_channel);
|
||||
}
|
||||
*radar_chan = dfs_check_channel;
|
||||
if (dfs_radar_found)
|
||||
wlan_set_chan_dfs_state(priv, BAND_A, dfs_check_channel,
|
||||
DFS_UNAVAILABLE);
|
||||
else
|
||||
wlan_set_chan_dfs_state(priv, BAND_A, dfs_check_channel,
|
||||
DFS_AVAILABLE);
|
||||
pstate_dfs->dfs_radar_found = dfs_radar_found;
|
||||
/* Update DFS structure. */
|
||||
priv->adapter->callbacks.moal_get_system_time(
|
||||
|
@ -3192,8 +3304,20 @@ mlan_status wlan_11h_print_event_radar_detected(mlan_private *priv,
|
|||
t_u8 *radar_chan)
|
||||
{
|
||||
wlan_dfs_device_state_t *pstate_dfs = &priv->adapter->state_dfs;
|
||||
MrvlIEtypes_channel_band_t *tlv;
|
||||
ENTER();
|
||||
*radar_chan = pstate_dfs->dfs_check_channel;
|
||||
if (pevent->event_len >= sizeof(MrvlIEtypes_channel_band_t)) {
|
||||
tlv = (MrvlIEtypes_channel_band_t *)&pevent->event_buf;
|
||||
*radar_chan = tlv->channel;
|
||||
} else {
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS)
|
||||
*radar_chan = priv->chan_rep_req.chanNum;
|
||||
}
|
||||
wlan_11h_add_dfs_timestamp(priv->adapter, DFS_TS_REPR_NOP_START,
|
||||
*radar_chan);
|
||||
wlan_set_chan_dfs_state(priv, BAND_A, *radar_chan, DFS_UNAVAILABLE);
|
||||
PRINTM(MEVENT, "ZeroDFS: Radar detected on %d\n", *radar_chan);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* function declarations of 802.11h
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -111,7 +111,7 @@ extern t_s32 wlan_11h_process_start(mlan_private *priv, t_u8 **ppbuffer,
|
|||
|
||||
/** Add any 11h TLVs necessary to complete a join command (adhoc or infra) */
|
||||
extern t_s32 wlan_11h_process_join(mlan_private *priv, t_u8 **ppbuffer,
|
||||
IEEEtypes_CapInfo_t *pcap_info, t_u8 band,
|
||||
IEEEtypes_CapInfo_t *pcap_info, t_u16 band,
|
||||
t_u32 channel,
|
||||
wlan_11h_bss_info_t *p11h_bss_info);
|
||||
|
||||
|
@ -154,6 +154,10 @@ extern mlan_status wlan_11h_ioctl_dfs_chan_report(mlan_private *priv,
|
|||
extern mlan_status wlan_11h_ioctl_chan_switch_count(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
||||
/** get/set channel dfs state */
|
||||
mlan_status wlan_11h_ioctl_chan_dfs_state(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
||||
/** get/set dfs w53 cfg */
|
||||
mlan_status wlan_11h_ioctl_dfs_w53_cfg(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
|
|
@ -1330,7 +1330,7 @@ static TxBAStreamTbl *wlan_11n_get_txbastream_status(mlan_private *priv,
|
|||
*
|
||||
* @return N/A
|
||||
*/
|
||||
static void wlan_fill_cap_info(mlan_private *priv, HTCap_t *ht_cap, t_u8 bands)
|
||||
static void wlan_fill_cap_info(mlan_private *priv, HTCap_t *ht_cap, t_u16 bands)
|
||||
{
|
||||
t_u32 usr_dot_11n_dev_cap;
|
||||
|
||||
|
@ -1419,7 +1419,8 @@ static void wlan_fill_cap_info(mlan_private *priv, HTCap_t *ht_cap, t_u8 bands)
|
|||
*
|
||||
* @return N/A
|
||||
*/
|
||||
static void wlan_reset_cap_info(mlan_private *priv, HTCap_t *ht_cap, t_u8 bands)
|
||||
static void wlan_reset_cap_info(mlan_private *priv, HTCap_t *ht_cap,
|
||||
t_u16 bands)
|
||||
{
|
||||
t_u32 usr_dot_11n_dev_cap;
|
||||
|
||||
|
@ -1513,8 +1514,10 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap,
|
|||
|
||||
rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
if (bands & BAND_A)
|
||||
rx_mcs_supp = MIN(
|
||||
|
@ -1587,8 +1590,10 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap,
|
|||
|
||||
rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
if (bands & BAND_A)
|
||||
rx_mcs_supp = MIN(
|
||||
|
@ -2294,7 +2299,7 @@ t_u8 wlan_get_second_channel_offset(mlan_private *priv, int chan)
|
|||
t_u8 chan2Offset = SEC_CHAN_NONE;
|
||||
|
||||
/* Special Case: 20Mhz-only Channel */
|
||||
if (chan == 165)
|
||||
if (priv->adapter->region_code != COUNTRY_CODE_US && chan == 165)
|
||||
return chan2Offset;
|
||||
|
||||
switch (chan) {
|
||||
|
@ -2310,6 +2315,8 @@ t_u8 wlan_get_second_channel_offset(mlan_private *priv, int chan)
|
|||
case 140:
|
||||
case 149:
|
||||
case 157:
|
||||
case 165:
|
||||
case 173:
|
||||
chan2Offset = SEC_CHAN_ABOVE;
|
||||
break;
|
||||
case 40:
|
||||
|
@ -2324,6 +2331,8 @@ t_u8 wlan_get_second_channel_offset(mlan_private *priv, int chan)
|
|||
case 144:
|
||||
case 153:
|
||||
case 161:
|
||||
case 169:
|
||||
case 177:
|
||||
chan2Offset = SEC_CHAN_BELOW;
|
||||
break;
|
||||
}
|
||||
|
@ -2555,7 +2564,7 @@ int wlan_cmd_append_11n_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
|||
pchan_list->chan_scan_param[0].chan_number =
|
||||
pbss_desc->pht_info->ht_info.pri_chan;
|
||||
pchan_list->chan_scan_param[0].bandcfg.chanBand =
|
||||
wlan_band_to_radio_type((t_u8)pbss_desc->bss_band);
|
||||
wlan_band_to_radio_type(pbss_desc->bss_band);
|
||||
/* support the VHT if the network to be join has the VHT
|
||||
* operation */
|
||||
if (ISSUPP_11ACENABLED(pmadapter->fw_cap_info) &&
|
||||
|
@ -3127,7 +3136,7 @@ int wlan_get_txbastream_tbl(mlan_private *priv, tx_ba_stream_tbl *buf)
|
|||
*
|
||||
* @return 0--not allowed, other value allowed
|
||||
*/
|
||||
t_u8 wlan_11n_bandconfig_allowed(mlan_private *pmpriv, t_u8 bss_band)
|
||||
t_u8 wlan_11n_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band)
|
||||
{
|
||||
if (pmpriv->bss_mode == MLAN_BSS_MODE_IBSS) {
|
||||
if (bss_band & BAND_G)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* implemented in mlan_11n.c.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -65,7 +65,7 @@ mlan_status wlan_cmd_tx_bf_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
mlan_status wlan_ret_tx_bf_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
#ifdef STA_SUPPORT
|
||||
t_u8 wlan_11n_bandconfig_allowed(mlan_private *pmpriv, t_u8 bss_band);
|
||||
t_u8 wlan_11n_bandconfig_allowed(mlan_private *pmpriv, t_u16 bss_band);
|
||||
/** Append the 802_11N tlv */
|
||||
int wlan_cmd_append_11n_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
|
||||
t_u8 **ppbuffer);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* of 11n aggregation functionalities
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* of 11n RxReordering functionalities
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* related code
|
||||
*
|
||||
*
|
||||
* Copyright 2009-2021 NXP
|
||||
* Copyright 2009-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -97,11 +97,11 @@ static t_u8 eu_country_code_table[][COUNTRY_CODE_LEN] = {
|
|||
"LU", "MT", "MD", "MC", "ME", "NL", "NO", "PL", "RO", "SM", "RS", "SI",
|
||||
"SK", "ES", "SE", "CH", "TR", "UA", "UK", "GB", "NZ", "DZ", "AO", "AM",
|
||||
"AW", "BH", "BD", "BT", "BO", "BQ", "BW", "VG", "BF", "BI", "KH", "CL",
|
||||
"CN", "KM", "CG", "CD", "CW", "EG", "FO", "GF", "PF", "GE", "GI", "GP",
|
||||
"HK", "IN", "ID", "IM", "IL", "JE", "KE", "XK", "KW", "LA", "LR", "MW",
|
||||
"MV", "MQ", "MR", "YT", "MA", "MZ", "MM", "NA", "NC", "NE", "NG", "OM",
|
||||
"PS", "PT", "QA", "RW", "RE", "BL", "MF", "VC", "SA", "SC", "ZA", "SZ",
|
||||
"SY", "TZ", "TG", "TN", "AE", "VA", "EH", "YE", "ZM", "ZW"};
|
||||
"KM", "CG", "CD", "CW", "EG", "FO", "GF", "PF", "GE", "GI", "GP", "HK",
|
||||
"IN", "ID", "IM", "IL", "JE", "KE", "XK", "KW", "LA", "LR", "MW", "MV",
|
||||
"MQ", "MR", "YT", "MA", "MZ", "MM", "NA", "NC", "NE", "NG", "OM", "PS",
|
||||
"PT", "QA", "RW", "RE", "BL", "MF", "VC", "SA", "SC", "ZA", "SZ", "SY",
|
||||
"TZ", "TG", "TN", "AE", "VA", "EH", "YE", "ZM", "ZW"};
|
||||
|
||||
/**
|
||||
* The structure for Channel-Frequency-Power table
|
||||
|
@ -346,7 +346,10 @@ static chan_freq_power_t channel_freq_power_A[] = {
|
|||
{153, 5765, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{157, 5785, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{161, 5805, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{165, 5825, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}}};
|
||||
{165, 5825, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{169, 5845, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{173, 5865, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}},
|
||||
{177, 5885, WLAN_TX_PWR_US_DEFAULT, MFALSE, {0x10, 0, 0}}};
|
||||
|
||||
/** Band: 'A', Region: Canada IC */
|
||||
static chan_freq_power_t channel_freq_power_CAN_A[] = {
|
||||
|
@ -970,8 +973,6 @@ static const rate_map rate_map_table_1x1[] = {
|
|||
t_u16 region_code_index[MRVDRV_MAX_REGION_CODE] = {0x00, 0x10, 0x20, 0x30, 0x40,
|
||||
0x41, 0x50, 0xfe, 0xff};
|
||||
|
||||
/** The table to keep CFP code for BG */
|
||||
t_u16 cfp_code_index_bg[MRVDRV_MAX_CFP_CODE_BG] = {};
|
||||
/** The table to keep CFP code for A */
|
||||
t_u16 cfp_code_index_a[MRVDRV_MAX_CFP_CODE_A] = {0x1, 0x2, 0x3, 0x4, 0x5};
|
||||
|
||||
|
@ -1185,7 +1186,7 @@ static void *wlan_memchr(pmlan_adapter pmadapter, void *s, int c, int n)
|
|||
* @return A pointer to CFP
|
||||
*/
|
||||
static chan_freq_power_t *wlan_get_region_cfp_table(pmlan_adapter pmadapter,
|
||||
t_u8 region, t_u8 band,
|
||||
t_u8 region, t_u16 band,
|
||||
int *cfp_no)
|
||||
{
|
||||
t_u32 i;
|
||||
|
@ -1250,7 +1251,6 @@ static chan_freq_power_t *wlan_get_region_cfp_table(pmlan_adapter pmadapter,
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!region)
|
||||
PRINTM(MERROR, "Error Band[0x%x] or code[BG:%#x, A:%#x]\n",
|
||||
band, cfp_bg, cfp_a);
|
||||
|
@ -1290,6 +1290,7 @@ static t_void wlan_cfp_copy_dynamic(pmlan_adapter pmadapter,
|
|||
/* do not clear the flags */
|
||||
for (i = 0; i < num_cfp; i++) {
|
||||
cfp[i].dynamic.blacklist = MFALSE;
|
||||
cfp[i].dynamic.dfs_state = DFS_USABLE;
|
||||
}
|
||||
|
||||
/* copy dynamic blacklisted entries from source where channels match */
|
||||
|
@ -1299,6 +1300,8 @@ static t_void wlan_cfp_copy_dynamic(pmlan_adapter pmadapter,
|
|||
if (cfp[i].channel == cfp_src[j].channel) {
|
||||
cfp[i].dynamic.blacklist =
|
||||
cfp_src[j].dynamic.blacklist;
|
||||
cfp[i].dynamic.dfs_state =
|
||||
cfp_src[j].dynamic.dfs_state;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1878,11 +1881,13 @@ t_u32 wlan_get_active_data_rates(mlan_private *pmpriv, t_u32 bss_mode,
|
|||
* present in all the regions.
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param band band.
|
||||
* @param channel Channel number.
|
||||
*
|
||||
* @return The Tx power
|
||||
*/
|
||||
t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u8 channel)
|
||||
t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u16 band,
|
||||
t_u8 channel)
|
||||
{
|
||||
t_u8 i = 0;
|
||||
t_u8 j = 0;
|
||||
|
@ -1894,38 +1899,46 @@ t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u8 channel)
|
|||
|
||||
ENTER();
|
||||
|
||||
for (i = 0; i < MLAN_CFP_TABLE_SIZE_BG; i++) {
|
||||
/* Get CFP */
|
||||
cfp = cfp_table_BG[i].cfp;
|
||||
cfp_no = cfp_table_BG[i].cfp_no;
|
||||
/* Find matching channel and get Tx power */
|
||||
for (j = 0; j < cfp_no; j++) {
|
||||
if ((cfp + j)->channel == channel) {
|
||||
if (tx_power != 0)
|
||||
tx_power = MIN(tx_power,
|
||||
(cfp + j)->max_tx_power);
|
||||
else
|
||||
tx_power =
|
||||
(t_u8)(cfp + j)->max_tx_power;
|
||||
break;
|
||||
if (band & (BAND_B | BAND_G)) {
|
||||
for (i = 0; i < MLAN_CFP_TABLE_SIZE_BG; i++) {
|
||||
/* Get CFP */
|
||||
cfp = cfp_table_BG[i].cfp;
|
||||
cfp_no = cfp_table_BG[i].cfp_no;
|
||||
/* Find matching channel and get Tx power */
|
||||
for (j = 0; j < cfp_no; j++) {
|
||||
if ((cfp + j)->channel == channel) {
|
||||
if (tx_power != 0)
|
||||
tx_power = MIN(
|
||||
tx_power,
|
||||
(cfp + j)->max_tx_power);
|
||||
else
|
||||
tx_power =
|
||||
(t_u8)(cfp + j)
|
||||
->max_tx_power;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < MLAN_CFP_TABLE_SIZE_A; i++) {
|
||||
/* Get CFP */
|
||||
cfp_a = cfp_table_A[i].cfp;
|
||||
cfp_no_a = cfp_table_A[i].cfp_no;
|
||||
for (j = 0; j < cfp_no_a; j++) {
|
||||
if ((cfp_a + j)->channel == channel) {
|
||||
if (tx_power != 0)
|
||||
tx_power =
|
||||
MIN(tx_power,
|
||||
(cfp_a + j)->max_tx_power);
|
||||
else
|
||||
tx_power = (t_u8)(
|
||||
(cfp_a + j)->max_tx_power);
|
||||
break;
|
||||
if (band & BAND_A) {
|
||||
for (i = 0; i < MLAN_CFP_TABLE_SIZE_A; i++) {
|
||||
/* Get CFP */
|
||||
cfp_a = cfp_table_A[i].cfp;
|
||||
cfp_no_a = cfp_table_A[i].cfp_no;
|
||||
for (j = 0; j < cfp_no_a; j++) {
|
||||
if ((cfp_a + j)->channel == channel) {
|
||||
if (tx_power != 0)
|
||||
tx_power = MIN(
|
||||
tx_power,
|
||||
(cfp_a + j)
|
||||
->max_tx_power);
|
||||
else
|
||||
tx_power = (t_u8)(
|
||||
(cfp_a + j)
|
||||
->max_tx_power);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1947,7 +1960,7 @@ t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u8 channel)
|
|||
*/
|
||||
|
||||
chan_freq_power_t *
|
||||
wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u8 band,
|
||||
wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u16 band,
|
||||
t_u16 channel, region_chan_t *region_channel)
|
||||
{
|
||||
region_chan_t *rc;
|
||||
|
@ -2030,7 +2043,7 @@ wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u8 band,
|
|||
* found.
|
||||
*/
|
||||
chan_freq_power_t *wlan_find_cfp_by_band_and_channel(mlan_adapter *pmadapter,
|
||||
t_u8 band, t_u16 channel)
|
||||
t_u16 band, t_u16 channel)
|
||||
{
|
||||
chan_freq_power_t *cfp = MNULL;
|
||||
|
||||
|
@ -2059,7 +2072,7 @@ chan_freq_power_t *wlan_find_cfp_by_band_and_channel(mlan_adapter *pmadapter,
|
|||
* @return Pointer to chan_freq_power_t structure; MNULL if not found
|
||||
*/
|
||||
chan_freq_power_t *wlan_find_cfp_by_band_and_freq(mlan_adapter *pmadapter,
|
||||
t_u8 band, t_u32 freq)
|
||||
t_u16 band, t_u32 freq)
|
||||
{
|
||||
chan_freq_power_t *cfp = MNULL;
|
||||
region_chan_t *rc;
|
||||
|
@ -2182,6 +2195,27 @@ int wlan_get_rate_index(pmlan_adapter pmadapter, t_u16 *rate_bitmap, int size)
|
|||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Convert config_bands to B/G/A band
|
||||
*
|
||||
* @param config_bands The specified band configuration
|
||||
*
|
||||
* @return BAND_B|BAND_G|BAND_A
|
||||
*/
|
||||
t_u16 wlan_convert_config_bands(t_u16 config_bands)
|
||||
{
|
||||
t_u16 bands = 0;
|
||||
if (config_bands & BAND_B)
|
||||
bands |= BAND_B;
|
||||
if (config_bands & BAND_G || config_bands & BAND_GN ||
|
||||
config_bands & BAND_GAC || config_bands & BAND_GAX)
|
||||
bands |= BAND_G;
|
||||
if (config_bands & BAND_A || config_bands & BAND_AN ||
|
||||
config_bands & BAND_AAC || config_bands & BAND_AAX)
|
||||
bands |= BAND_A;
|
||||
return bands;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get supported data rates
|
||||
*
|
||||
|
@ -2196,110 +2230,64 @@ t_u32 wlan_get_supported_rates(mlan_private *pmpriv, t_u32 bss_mode,
|
|||
t_u16 config_bands, WLAN_802_11_RATES rates)
|
||||
{
|
||||
t_u32 k = 0;
|
||||
t_u16 bands = 0;
|
||||
|
||||
ENTER();
|
||||
bands = wlan_convert_config_bands(config_bands);
|
||||
|
||||
if (bss_mode == MLAN_BSS_MODE_INFRA) {
|
||||
/* Infra. mode */
|
||||
switch (config_bands) {
|
||||
case (t_u8)BAND_B:
|
||||
PRINTM(MINFO, "Infra Band=%d SupportedRates_B\n",
|
||||
config_bands);
|
||||
if (bands == BAND_B) {
|
||||
/* B only */
|
||||
PRINTM(MINFO, "Band: Infra B\n");
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_B,
|
||||
sizeof(SupportedRates_B));
|
||||
break;
|
||||
case (t_u8)BAND_G:
|
||||
case BAND_G | BAND_GN:
|
||||
case BAND_G | BAND_GN | BAND_GAC:
|
||||
case BAND_G | BAND_GN | BAND_GAC | BAND_GAX:
|
||||
PRINTM(MINFO, "Infra band=%d SupportedRates_G\n",
|
||||
config_bands);
|
||||
} else if (bands == BAND_G) {
|
||||
/* G only */
|
||||
PRINTM(MINFO, "Band: Infra G\n");
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_G,
|
||||
sizeof(SupportedRates_G));
|
||||
break;
|
||||
case BAND_B | BAND_G:
|
||||
case BAND_A | BAND_B | BAND_G:
|
||||
case BAND_A | BAND_B:
|
||||
case BAND_A | BAND_B | BAND_G | BAND_GN:
|
||||
case BAND_A | BAND_B | BAND_G | BAND_GN | BAND_AN:
|
||||
case BAND_A | BAND_B | BAND_G | BAND_GN | BAND_AN | BAND_AAC:
|
||||
case BAND_A | BAND_B | BAND_G | BAND_GN | BAND_AN | BAND_AAC |
|
||||
BAND_GAC:
|
||||
case BAND_A | BAND_B | BAND_G | BAND_GN | BAND_AN | BAND_AAC |
|
||||
BAND_AAX:
|
||||
case BAND_A | BAND_B | BAND_G | BAND_GN | BAND_AN | BAND_AAC |
|
||||
BAND_GAC | BAND_AAX | BAND_GAX:
|
||||
case BAND_B | BAND_G | BAND_GN:
|
||||
case BAND_B | BAND_G | BAND_GN | BAND_GAC:
|
||||
case BAND_B | BAND_G | BAND_GN | BAND_GAC | BAND_GAX:
|
||||
PRINTM(MINFO, "Infra band=%d SupportedRates_BG\n",
|
||||
config_bands);
|
||||
|
||||
} else if (bands & (BAND_B | BAND_G)) {
|
||||
/* BG only */
|
||||
PRINTM(MINFO, "Band: Infra BG\n");
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
if (pmpriv->bss_type == MLAN_BSS_TYPE_WIFIDIRECT)
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_G,
|
||||
sizeof(SupportedRates_G));
|
||||
else
|
||||
#endif
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_BG,
|
||||
sizeof(SupportedRates_BG));
|
||||
#else
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_BG,
|
||||
sizeof(SupportedRates_BG));
|
||||
#endif
|
||||
break;
|
||||
case BAND_A:
|
||||
case BAND_A | BAND_G:
|
||||
PRINTM(MINFO, "Infra band=%d SupportedRates_A\n",
|
||||
config_bands);
|
||||
} else if (bands & BAND_A) {
|
||||
/* support A */
|
||||
PRINTM(MINFO, "Band: Infra A\n");
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_A,
|
||||
sizeof(SupportedRates_A));
|
||||
break;
|
||||
case BAND_AN:
|
||||
case BAND_A | BAND_AN:
|
||||
case BAND_A | BAND_G | BAND_AN | BAND_GN:
|
||||
case BAND_A | BAND_AN | BAND_AAC:
|
||||
case BAND_A | BAND_G | BAND_AN | BAND_GN | BAND_AAC:
|
||||
case BAND_A | BAND_AN | BAND_AAC | BAND_AAX:
|
||||
case BAND_A | BAND_G | BAND_AN | BAND_GN | BAND_AAC | BAND_AAX:
|
||||
PRINTM(MINFO, "Infra band=%d SupportedRates_A\n",
|
||||
config_bands);
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_A,
|
||||
sizeof(SupportedRates_A));
|
||||
break;
|
||||
case BAND_GN:
|
||||
case BAND_GN | BAND_GAC:
|
||||
case BAND_GN | BAND_GAC | BAND_GAX:
|
||||
PRINTM(MINFO, "Infra band=%d SupportedRates_N\n",
|
||||
config_bands);
|
||||
k = wlan_copy_rates(rates, k, SupportedRates_N,
|
||||
sizeof(SupportedRates_N));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
/* Ad-hoc mode */
|
||||
switch (config_bands) {
|
||||
case (t_u8)BAND_B:
|
||||
/* Adhoc. mode */
|
||||
if (bands == BAND_B) {
|
||||
/* B only */
|
||||
PRINTM(MINFO, "Band: Adhoc B\n");
|
||||
k = wlan_copy_rates(rates, k, AdhocRates_B,
|
||||
sizeof(AdhocRates_B));
|
||||
break;
|
||||
case (t_u8)BAND_G:
|
||||
PRINTM(MINFO, "Band: Adhoc G only\n");
|
||||
} else if (bands == BAND_G) {
|
||||
/* G only */
|
||||
PRINTM(MINFO, "Band: Adhoc G\n");
|
||||
k = wlan_copy_rates(rates, k, AdhocRates_G,
|
||||
sizeof(AdhocRates_G));
|
||||
break;
|
||||
case BAND_B | BAND_G:
|
||||
PRINTM(MINFO, "Band: Adhoc BG\n");
|
||||
k = wlan_copy_rates(rates, k, AdhocRates_BG,
|
||||
sizeof(AdhocRates_BG));
|
||||
break;
|
||||
case BAND_A:
|
||||
case BAND_A | BAND_AN | BAND_AAC:
|
||||
case BAND_A | BAND_AN | BAND_AAC | BAND_AAX:
|
||||
|
||||
} else if (bands & BAND_A) {
|
||||
/* support A */
|
||||
PRINTM(MINFO, "Band: Adhoc A\n");
|
||||
k = wlan_copy_rates(rates, k, AdhocRates_A,
|
||||
sizeof(AdhocRates_A));
|
||||
break;
|
||||
|
||||
} else {
|
||||
PRINTM(MINFO, "Band: Adhoc BG\n");
|
||||
k = wlan_copy_rates(rates, k, AdhocRates_BG,
|
||||
sizeof(AdhocRates_BG));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2677,7 +2665,7 @@ int wlan_add_supported_oper_class_ie(mlan_private *pmpriv, t_u8 **pptlv_out,
|
|||
*
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u8 band)
|
||||
mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u16 band)
|
||||
{
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
int i = 0, j;
|
||||
|
@ -2734,7 +2722,7 @@ mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u8 band)
|
|||
i++;
|
||||
}
|
||||
if (band & (BAND_A | BAND_AN | BAND_AAC)) {
|
||||
if (pmadapter->cfp_code_bg)
|
||||
if (pmadapter->cfp_code_a)
|
||||
cfp_code_a = pmadapter->cfp_code_a;
|
||||
PRINTM(MCMND, "%s: 5G 0x%x\n", __func__, cfp_code_a);
|
||||
cfp = wlan_get_region_cfp_table(pmadapter, cfp_code_a, BAND_A,
|
||||
|
@ -2763,6 +2751,7 @@ mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u8 band)
|
|||
} else if (cfp) {
|
||||
wlan_cfp_copy_dynamic(pmadapter, cfp, cfp_no, MNULL, 0);
|
||||
}
|
||||
i++;
|
||||
}
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
|
@ -2824,7 +2813,6 @@ done:
|
|||
* - MTRUE if scan type is passive
|
||||
* - MFALSE otherwise
|
||||
*/
|
||||
|
||||
t_bool wlan_bg_scan_type_is_passive(mlan_private *priv, t_u8 chnl)
|
||||
{
|
||||
int i, j;
|
||||
|
@ -2873,7 +2861,7 @@ done:
|
|||
* - MFALSE otherwise
|
||||
*/
|
||||
|
||||
t_bool wlan_is_chan_passive(mlan_private *priv, t_u8 band, t_u8 chan)
|
||||
t_bool wlan_is_chan_passive(mlan_private *priv, t_u16 band, t_u8 chan)
|
||||
{
|
||||
int i, j;
|
||||
t_bool passive = MFALSE;
|
||||
|
@ -2916,7 +2904,7 @@ t_bool wlan_is_chan_passive(mlan_private *priv, t_u8 band, t_u8 chan)
|
|||
* - MFALSE otherwise
|
||||
*/
|
||||
|
||||
t_bool wlan_is_chan_disabled(mlan_private *priv, t_u8 band, t_u8 chan)
|
||||
t_bool wlan_is_chan_disabled(mlan_private *priv, t_u16 band, t_u8 chan)
|
||||
{
|
||||
int i, j;
|
||||
t_bool disabled = MFALSE;
|
||||
|
@ -2960,7 +2948,7 @@ t_bool wlan_is_chan_disabled(mlan_private *priv, t_u8 band, t_u8 chan)
|
|||
* - MFALSE otherwise
|
||||
*/
|
||||
|
||||
t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u8 band, t_u8 chan)
|
||||
t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u16 band, t_u8 chan)
|
||||
{
|
||||
int i, j;
|
||||
t_bool blacklist = MFALSE;
|
||||
|
@ -3003,7 +2991,7 @@ t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u8 band, t_u8 chan)
|
|||
* - MFALSE otherwise
|
||||
*/
|
||||
|
||||
t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u8 band, t_u8 chan,
|
||||
t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u16 band, t_u8 chan,
|
||||
t_bool bl)
|
||||
{
|
||||
int i, j;
|
||||
|
@ -3035,6 +3023,84 @@ t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u8 band, t_u8 chan,
|
|||
return set_bl;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set channel's dfs state
|
||||
*
|
||||
* @param priv Private driver information structure
|
||||
* @param band Band to check
|
||||
* @param chan Channel to check
|
||||
* @param dfs_state dfs state
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
t_void wlan_set_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan,
|
||||
dfs_state_t dfs_state)
|
||||
{
|
||||
int i, j;
|
||||
chan_freq_power_t *pcfp = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
/*get the cfp table first*/
|
||||
for (i = 0; i < MAX_REGION_CHANNEL_NUM; i++) {
|
||||
if (priv->adapter->region_channel[i].band & band) {
|
||||
pcfp = priv->adapter->region_channel[i].pcfp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pcfp) {
|
||||
/*check table according to chan num*/
|
||||
for (j = 0; j < priv->adapter->region_channel[i].num_cfp; j++) {
|
||||
if (pcfp[j].channel == chan) {
|
||||
pcfp[j].dynamic.dfs_state = dfs_state;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get channel's dfs state
|
||||
*
|
||||
* @param priv Private driver information structure
|
||||
* @param band Band to check
|
||||
* @param chan Channel to check
|
||||
*
|
||||
* @return channel's dfs state
|
||||
*/
|
||||
dfs_state_t wlan_get_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan)
|
||||
{
|
||||
int i, j;
|
||||
chan_freq_power_t *pcfp = MNULL;
|
||||
dfs_state_t dfs_state = DFS_USABLE;
|
||||
|
||||
ENTER();
|
||||
|
||||
/*get the cfp table first*/
|
||||
for (i = 0; i < MAX_REGION_CHANNEL_NUM; i++) {
|
||||
if (priv->adapter->region_channel[i].band & band) {
|
||||
pcfp = priv->adapter->region_channel[i].pcfp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (pcfp) {
|
||||
/*check table according to chan num*/
|
||||
for (j = 0; j < priv->adapter->region_channel[i].num_cfp; j++) {
|
||||
if (pcfp[j].channel == chan) {
|
||||
dfs_state = pcfp[j].dynamic.dfs_state;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return dfs_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Convert rateid in IEEE format to MRVL format
|
||||
*
|
||||
|
@ -3279,10 +3345,12 @@ void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left)
|
|||
pmadapter->domain_reg.country_code[1] =
|
||||
pmadapter->otp_region->country_code[1];
|
||||
pmadapter->domain_reg.country_code[2] = '\0';
|
||||
PRINTM(MCMND, "OTP region: region_code=%d %c%c\n",
|
||||
PRINTM(MCMND,
|
||||
"OTP region: region_code=%d %c%c dfs_region=%d\n",
|
||||
pmadapter->otp_region->region_code,
|
||||
pmadapter->country_code[0],
|
||||
pmadapter->country_code[1]);
|
||||
pmadapter->country_code[1],
|
||||
pmadapter->otp_region->dfs_region);
|
||||
pmadapter->cfp_code_bg =
|
||||
pmadapter->otp_region->region_code;
|
||||
pmadapter->cfp_code_a =
|
||||
|
@ -3367,6 +3435,8 @@ void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left)
|
|||
data++;
|
||||
(pmadapter->cfp_otp_a + i)->dynamic.flags =
|
||||
*data;
|
||||
(pmadapter->cfp_otp_a + i)->dynamic.dfs_state =
|
||||
DFS_USABLE;
|
||||
if (*data & NXP_CHANNEL_DFS)
|
||||
(pmadapter->cfp_otp_a + i)
|
||||
->passive_scan_or_radar_detect =
|
||||
|
@ -3399,7 +3469,7 @@ void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left)
|
|||
while ((i <
|
||||
pmadapter->tx_power_table_bg_rows *
|
||||
pmadapter->tx_power_table_bg_cols) &&
|
||||
(i < tlv_buf_len) && (*tmp != 36)) {
|
||||
(i < tlv_buf_len)) {
|
||||
i++;
|
||||
tmp++;
|
||||
}
|
||||
|
@ -3451,9 +3521,12 @@ void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left)
|
|||
((power_table_attr_t *)data)->rows_5g;
|
||||
pmadapter->tx_power_table_a_cols =
|
||||
((power_table_attr_t *)data)->cols_5g;
|
||||
PRINTM(MCMD_D, "OTP region: bg_row=%d, a_row=%d\n",
|
||||
PRINTM(MCMD_D,
|
||||
"OTP region: bg_row=%d,bg_cols=%d a_row=%d, a_cols=%d\n",
|
||||
pmadapter->tx_power_table_bg_rows,
|
||||
pmadapter->tx_power_table_a_rows);
|
||||
pmadapter->tx_power_table_bg_cols,
|
||||
pmadapter->tx_power_table_a_rows,
|
||||
pmadapter->tx_power_table_a_cols);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* @brief This file contains the handling of CMD/EVENT in MLAN
|
||||
*
|
||||
*
|
||||
* Copyright 2009-2021 NXP
|
||||
* Copyright 2009-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -131,7 +131,7 @@ static t_u8 wlan_is_cmd_allowed_during_scan(t_u16 cmd_id)
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief This function move the cmd from scan_pending_q to
|
||||
* @brief This function move the cmd from ext_cmd_pending_q to
|
||||
* cmd_pending_q
|
||||
*
|
||||
* @param cmd_id cmd id
|
||||
|
@ -146,10 +146,10 @@ t_void wlan_move_cmd_to_cmd_pending_q(pmlan_adapter pmadapter)
|
|||
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
while ((pcmd_node = (cmd_ctrl_node *)util_peek_list(
|
||||
pmadapter->pmoal_handle, &pmadapter->scan_pending_q,
|
||||
pmadapter->pmoal_handle, &pmadapter->ext_cmd_pending_q,
|
||||
MNULL, MNULL))) {
|
||||
util_unlink_list(pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q,
|
||||
&pmadapter->ext_cmd_pending_q,
|
||||
(pmlan_linked_list)pcmd_node, MNULL, MNULL);
|
||||
wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node, MTRUE);
|
||||
}
|
||||
|
@ -157,6 +157,71 @@ t_void wlan_move_cmd_to_cmd_pending_q(pmlan_adapter pmadapter)
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function inserts scan command node to scan_cmd_pending_q.
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param pcmd_node A pointer to cmd_ctrl_node structure
|
||||
* @return N/A
|
||||
*/
|
||||
static t_void wlan_queue_cmd_to_ext_cmd_pending_queue(mlan_private *pmpriv,
|
||||
cmd_ctrl_node *pcmd_node)
|
||||
{
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pcmd_node == MNULL)
|
||||
goto done;
|
||||
|
||||
util_enqueue_list_tail(pmadapter->pmoal_handle,
|
||||
&pmadapter->ext_cmd_pending_q,
|
||||
(pmlan_linked_list)pcmd_node, MNULL, MNULL);
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Internal function used to flush the scan cmd pending queue
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
t_void wlan_flush_ext_cmd_pending_queue(pmlan_adapter pmadapter)
|
||||
{
|
||||
cmd_ctrl_node *pcmd_node = MNULL;
|
||||
HostCmd_DS_COMMAND *pcmd = MNULL;
|
||||
mlan_ioctl_req *pioctl_buf = MNULL;
|
||||
pmlan_callbacks pcb = &pmadapter->callbacks;
|
||||
ENTER();
|
||||
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
while ((pcmd_node = (cmd_ctrl_node *)util_peek_list(
|
||||
pmadapter->pmoal_handle, &pmadapter->ext_cmd_pending_q,
|
||||
MNULL, MNULL))) {
|
||||
util_unlink_list(pmadapter->pmoal_handle,
|
||||
&pmadapter->ext_cmd_pending_q,
|
||||
(pmlan_linked_list)pcmd_node, MNULL, MNULL);
|
||||
pcmd = (HostCmd_DS_COMMAND *)(pcmd_node->cmdbuf->pbuf +
|
||||
pcmd_node->cmdbuf->data_offset);
|
||||
PRINTM(MCMND, "flush ext_cmd_pending_queue: cmd 0x%02x\n",
|
||||
wlan_le16_to_cpu(pcmd->command));
|
||||
if (pcmd_node->pioctl_buf) {
|
||||
pioctl_buf = (mlan_ioctl_req *)pcmd_node->pioctl_buf;
|
||||
pcmd_node->pioctl_buf = MNULL;
|
||||
pioctl_buf->status_code = MLAN_ERROR_CMD_CANCEL;
|
||||
pcb->moal_ioctl_complete(pmadapter->pmoal_handle,
|
||||
pioctl_buf,
|
||||
MLAN_STATUS_FAILURE);
|
||||
}
|
||||
wlan_insert_cmd_to_free_q(pmadapter, pcmd_node);
|
||||
}
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function inserts command node to scan_pending_q or
|
||||
* cmd_pending_q
|
||||
|
@ -173,9 +238,10 @@ static t_void wlan_queue_cmd(mlan_private *pmpriv, cmd_ctrl_node *pcmd_node,
|
|||
if (pmpriv->adapter->scan_processing &&
|
||||
pmpriv->adapter->ext_scan_type == EXT_SCAN_ENHANCE) {
|
||||
if (MFALSE == wlan_is_cmd_allowed_during_scan(cmd_no)) {
|
||||
PRINTM(MCMND, "QUEUE_CMD: cmd=0x%x scan_pending_q\n",
|
||||
PRINTM(MCMND, "QUEUE_CMD: cmd=0x%x ext_cmd_pending_q\n",
|
||||
cmd_no);
|
||||
wlan_queue_scan_cmd(pmpriv, pcmd_node);
|
||||
wlan_queue_cmd_to_ext_cmd_pending_queue(pmpriv,
|
||||
pcmd_node);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -1634,20 +1700,28 @@ mlan_status wlan_process_event(pmlan_adapter pmadapter)
|
|||
(t_u16)eventcause;
|
||||
|
||||
if ((eventcause & EVENT_ID_MASK) == EVENT_RADAR_DETECTED) {
|
||||
if (wlan_11h_dfs_event_preprocessing(pmadapter) ==
|
||||
MLAN_STATUS_SUCCESS) {
|
||||
memcpy_ext(pmadapter, (t_u8 *)&eventcause,
|
||||
pmbuf->pbuf + pmbuf->data_offset,
|
||||
sizeof(eventcause), sizeof(eventcause));
|
||||
} else {
|
||||
priv = wlan_get_priv_by_id(
|
||||
pmadapter, EVENT_GET_BSS_NUM(eventcause),
|
||||
EVENT_GET_BSS_TYPE(eventcause));
|
||||
if (priv)
|
||||
PRINTM_NETINTF(MEVENT, priv);
|
||||
PRINTM(MERROR, "Error processing DFS Event: 0x%x\n",
|
||||
eventcause);
|
||||
goto done;
|
||||
priv = wlan_get_priv_by_id(pmadapter,
|
||||
EVENT_GET_BSS_NUM(eventcause),
|
||||
EVENT_GET_BSS_TYPE(eventcause));
|
||||
if (priv && priv->bss_type != MLAN_BSS_TYPE_DFS) {
|
||||
if (wlan_11h_dfs_event_preprocessing(pmadapter) ==
|
||||
MLAN_STATUS_SUCCESS) {
|
||||
memcpy_ext(pmadapter, (t_u8 *)&eventcause,
|
||||
pmbuf->pbuf + pmbuf->data_offset,
|
||||
sizeof(eventcause),
|
||||
sizeof(eventcause));
|
||||
} else {
|
||||
priv = wlan_get_priv_by_id(
|
||||
pmadapter,
|
||||
EVENT_GET_BSS_NUM(eventcause),
|
||||
EVENT_GET_BSS_TYPE(eventcause));
|
||||
if (priv)
|
||||
PRINTM_NETINTF(MEVENT, priv);
|
||||
PRINTM(MERROR,
|
||||
"Error processing DFS Event: 0x%x\n",
|
||||
eventcause);
|
||||
goto done;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Get BSS number and corresponding priv */
|
||||
|
@ -1845,13 +1919,7 @@ mlan_status wlan_prepare_cmd(mlan_private *pmpriv, t_u16 cmd_no,
|
|||
#ifdef STA_SUPPORT
|
||||
if (cmd_no == HostCmd_CMD_802_11_SCAN ||
|
||||
cmd_no == HostCmd_CMD_802_11_SCAN_EXT) {
|
||||
if (cmd_no == HostCmd_CMD_802_11_SCAN_EXT &&
|
||||
pmadapter->ext_scan && pmadapter->ext_scan_enh &&
|
||||
pmadapter->ext_scan_type == EXT_SCAN_ENHANCE) {
|
||||
wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node,
|
||||
MTRUE);
|
||||
} else
|
||||
wlan_queue_scan_cmd(pmpriv, pcmd_node);
|
||||
wlan_queue_scan_cmd(pmpriv, pcmd_node);
|
||||
} else {
|
||||
#endif
|
||||
if ((cmd_no == HostCmd_CMD_802_11_HS_CFG_ENH) &&
|
||||
|
@ -2214,7 +2282,7 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter)
|
|||
if (IS_PCIE(pmadapter->card_type) &&
|
||||
cmdresp_no == HostCmd_CMD_FUNC_SHUTDOWN &&
|
||||
pmadapter->pwarm_reset_ioctl_req) {
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
#endif
|
||||
wlan_pcie_init_fw(pmadapter);
|
||||
|
@ -2244,7 +2312,8 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter)
|
|||
i = pmpriv->bss_index + 1;
|
||||
while (i < pmadapter->priv_num &&
|
||||
(!(pmpriv_next = pmadapter->priv[i]) ||
|
||||
pmpriv_next->bss_virtual))
|
||||
pmpriv_next->bss_virtual ||
|
||||
pmpriv_next->bss_type == MLAN_BSS_TYPE_DFS))
|
||||
i++;
|
||||
if (!pmpriv_next || i >= pmadapter->priv_num) {
|
||||
#ifdef STA_SUPPORT
|
||||
|
@ -2477,9 +2546,9 @@ mlan_status wlan_cancel_pending_scan_cmd(pmlan_adapter pmadapter,
|
|||
status = MLAN_STATUS_PENDING;
|
||||
}
|
||||
}
|
||||
} else
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
}
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
LEAVE();
|
||||
return status;
|
||||
}
|
||||
|
@ -2552,6 +2621,8 @@ t_void wlan_cancel_all_pending_cmd(pmlan_adapter pmadapter, t_u8 flag)
|
|||
wlan_release_cmd_lock(pmadapter);
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
/* Cancel all pending command in scan_cmd_pending_q command */
|
||||
wlan_flush_ext_cmd_pending_queue(pmadapter);
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
|
@ -2641,9 +2712,9 @@ t_void wlan_cancel_bss_pending_cmd(pmlan_adapter pmadapter, t_u32 bss_index)
|
|||
priv, MLAN_EVENT_ID_DRV_DEFER_HANDLING,
|
||||
MNULL);
|
||||
}
|
||||
} else
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
}
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
}
|
||||
#endif
|
||||
LEAVE();
|
||||
|
@ -2718,9 +2789,9 @@ t_void wlan_cancel_pending_ioctl(pmlan_adapter pmadapter,
|
|||
priv, MLAN_EVENT_ID_DRV_DEFER_HANDLING,
|
||||
MNULL);
|
||||
}
|
||||
} else
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
}
|
||||
/* Cancel all pending scan command */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
}
|
||||
#endif
|
||||
if (find) {
|
||||
|
@ -4672,6 +4743,62 @@ mlan_status wlan_process_vdll_event(pmlan_private pmpriv, pmlan_buffer pevent)
|
|||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handle the csi event
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_process_csi_event(pmlan_private pmpriv)
|
||||
{
|
||||
pmlan_adapter pmadapter = pmpriv->adapter;
|
||||
mlan_status status;
|
||||
t_u32 eventcause = pmadapter->event_cause;
|
||||
t_u8 *evt_buf = MNULL;
|
||||
pmlan_buffer pmbuf = pmadapter->pmlan_buffer_event;
|
||||
pmlan_callbacks pcb = &pmadapter->callbacks;
|
||||
pmlan_event pevent;
|
||||
|
||||
ENTER();
|
||||
|
||||
/* Allocate memory for event buffer */
|
||||
status = pcb->moal_malloc(pmadapter->pmoal_handle, MAX_EVENT_SIZE,
|
||||
MLAN_MEM_DEF, &evt_buf);
|
||||
if ((status == MLAN_STATUS_SUCCESS) && evt_buf) {
|
||||
t_u16 csi_sig;
|
||||
pcsi_record_ds csi_record = (pcsi_record_ds)(
|
||||
pmbuf->pbuf + pmbuf->data_offset + sizeof(eventcause));
|
||||
/* Check CSI signature */
|
||||
csi_sig = csi_record->CSI_Sign;
|
||||
if (csi_sig != CSI_SIGNATURE) {
|
||||
PRINTM(MERROR,
|
||||
"Wrong CSI signature 0x%04x. Should be 0x%04x",
|
||||
csi_sig, CSI_SIGNATURE);
|
||||
status = MLAN_STATUS_FAILURE;
|
||||
} else {
|
||||
/* Send event to moal */
|
||||
pevent = (pmlan_event)evt_buf;
|
||||
pevent->bss_index = pmpriv->bss_index;
|
||||
pevent->event_id = MLAN_EVENT_ID_CSI;
|
||||
/* Event length is the CSI record length in byte */
|
||||
pevent->event_len = csi_record->Len * 4;
|
||||
if (pevent->event_len >
|
||||
pmbuf->data_len - sizeof(eventcause))
|
||||
pevent->event_len =
|
||||
pmbuf->data_len - sizeof(eventcause);
|
||||
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
|
||||
csi_record, pevent->event_len,
|
||||
pevent->event_len);
|
||||
wlan_recv_event(pmpriv, pevent->event_id, pevent);
|
||||
}
|
||||
pcb->moal_mfree(pmadapter->pmoal_handle, evt_buf);
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of get_hw_spec.
|
||||
*
|
||||
|
@ -5020,7 +5147,8 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
wlan_show_dot11ndevcap(pmadapter, pmadapter->hw_dot_11n_dev_cap);
|
||||
wlan_show_devmcssupport(pmadapter, pmadapter->hw_dev_mcs_support);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
pmadapter->user_htstream = pmadapter->hw_dev_mcs_support;
|
||||
/** separate stream config for 2.4G and 5G, will be changed according to
|
||||
* antenna cfg*/
|
||||
|
@ -5211,7 +5339,6 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
pmadapter,
|
||||
(MrvlIEtypes_Extension_t *)ext_tlv);
|
||||
}
|
||||
|
||||
break;
|
||||
case TLV_TYPE_FW_CAP_INFO:
|
||||
fw_cap_tlv = (MrvlIEtypes_fw_cap_info_t *)tlv;
|
||||
|
@ -6166,7 +6293,8 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
|
|||
t_u16 tx_ant_mode = wlan_le16_to_cpu(pantenna->tx_antenna_mode);
|
||||
t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
#endif
|
||||
typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 {
|
||||
|
@ -6195,8 +6323,10 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
|
|||
wlan_le16_to_cpu(pantenna->action_tx), tx_ant_mode,
|
||||
wlan_le16_to_cpu(pantenna->action_rx), rx_ant_mode);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
tx_ant_mode &= 0x0303;
|
||||
rx_ant_mode &= 0x0303;
|
||||
|
@ -6267,7 +6397,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
{
|
||||
mlan_ds_reg_rw *reg_rw;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
MrvlIEtypes_Reg_type_t *tlv;
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
#endif
|
||||
|
@ -6285,9 +6416,11 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
mac_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
|
||||
mac_reg->value = wlan_cpu_to_le32(reg_rw->value);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
if ((reg_rw->type == MLAN_REG_MAC2) &&
|
||||
(IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type))) {
|
||||
tlv = (MrvlIEtypes_Reg_type_t
|
||||
*)((t_u8 *)cmd +
|
||||
|
@ -6304,6 +6437,17 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
#endif
|
||||
break;
|
||||
}
|
||||
case HostCmd_CMD_REG_ACCESS: {
|
||||
HostCmd_DS_REG_ACCESS *reg;
|
||||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_REG_ACCESS) +
|
||||
S_DS_GEN);
|
||||
reg = (HostCmd_DS_REG_ACCESS *)&cmd->params.reg;
|
||||
reg->action = wlan_cpu_to_le16(cmd_action);
|
||||
reg->reg_type = wlan_cpu_to_le16((t_u16)reg_rw->type);
|
||||
reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
|
||||
reg->value = wlan_cpu_to_le32(reg_rw->value);
|
||||
break;
|
||||
}
|
||||
case HostCmd_CMD_BBP_REG_ACCESS: {
|
||||
HostCmd_DS_BBP_REG_ACCESS *bbp_reg;
|
||||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_BBP_REG_ACCESS) +
|
||||
|
@ -6313,9 +6457,11 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
bbp_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
|
||||
bbp_reg->value = (t_u8)reg_rw->value;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
if ((reg_rw->type == MLAN_REG_BBP2) &&
|
||||
(IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type))) {
|
||||
tlv = (MrvlIEtypes_Reg_type_t
|
||||
*)((t_u8 *)cmd +
|
||||
|
@ -6341,9 +6487,11 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
rf_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
|
||||
rf_reg->value = (t_u8)reg_rw->value;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
if ((reg_rw->type == MLAN_REG_RF2) &&
|
||||
(IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type))) {
|
||||
tlv = (MrvlIEtypes_Reg_type_t
|
||||
*)((t_u8 *)cmd +
|
||||
|
@ -6404,9 +6552,11 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
bca_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
|
||||
bca_reg->value = wlan_cpu_to_le32(reg_rw->value);
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
if ((reg_rw->type == MLAN_REG_BCA2) &&
|
||||
(IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARDNW62X(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type))) {
|
||||
tlv = (MrvlIEtypes_Reg_type_t
|
||||
*)((t_u8 *)cmd +
|
||||
|
@ -6463,6 +6613,13 @@ mlan_status wlan_ret_reg_access(mlan_adapter *pmadapter, t_u16 type,
|
|||
reg_rw->value = wlan_le32_to_cpu(reg->value);
|
||||
break;
|
||||
}
|
||||
case HostCmd_CMD_REG_ACCESS: {
|
||||
HostCmd_DS_REG_ACCESS *reg;
|
||||
reg = (HostCmd_DS_REG_ACCESS *)&resp->params.reg;
|
||||
reg_rw->offset = (t_u32)wlan_le16_to_cpu(reg->offset);
|
||||
reg_rw->value = wlan_le32_to_cpu(reg->value);
|
||||
break;
|
||||
}
|
||||
case HostCmd_CMD_BBP_REG_ACCESS: {
|
||||
HostCmd_DS_BBP_REG_ACCESS *reg;
|
||||
reg = (HostCmd_DS_BBP_REG_ACCESS *)&resp->params.bbp_reg;
|
||||
|
@ -6685,35 +6842,64 @@ mlan_status wlan_cmd_802_11_supplicant_pmk(pmlan_private pmpriv,
|
|||
t_u8 zero_mac[] = {0, 0, 0, 0, 0, 0};
|
||||
t_u8 ssid_flag = 0, bssid_flag = 0, pmk_flag = 0, passphrase_flag = 0;
|
||||
t_u8 sae_password_flag = 0;
|
||||
t_u8 zero[MLAN_MAX_KEY_LENGTH] = {0};
|
||||
MrvlIEtypes_fw_roam_enable_t *proam_tlv = MNULL;
|
||||
MrvlIEtypes_keyParams_t *key_tlv = MNULL;
|
||||
int length = 0;
|
||||
t_u8 userset_passphrase = 0;
|
||||
|
||||
ENTER();
|
||||
psk = (mlan_ds_passphrase *)&sec->param.passphrase;
|
||||
if (sec->multi_passphrase)
|
||||
psk = (mlan_ds_passphrase *)&sec->param
|
||||
.roam_passphrase[userset_passphrase];
|
||||
else
|
||||
psk = (mlan_ds_passphrase *)&sec->param.passphrase;
|
||||
if (cmd_action == HostCmd_ACT_GEN_REMOVE) {
|
||||
cmd->size =
|
||||
sizeof(HostCmd_DS_802_11_SUPPLICANT_PMK) + S_DS_GEN - 1;
|
||||
proam_tlv = (MrvlIEtypes_fw_roam_enable_t *)ptlv_buffer;
|
||||
proam_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_ROAM);
|
||||
proam_tlv->header.len = sizeof(MrvlIEtypes_fw_roam_enable_t) -
|
||||
sizeof(MrvlIEtypesHeader_t);
|
||||
proam_tlv->roam_enable = MTRUE;
|
||||
ptlv_buffer +=
|
||||
(proam_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size +=
|
||||
(proam_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
proam_tlv->header.len = wlan_cpu_to_le16(proam_tlv->header.len);
|
||||
|
||||
/*
|
||||
* Parse the rest of the buf here
|
||||
* 1) <ssid="valid ssid"> - This will get the passphrase, AKMP
|
||||
* for specified ssid, if none specified then it will get all.
|
||||
* Eg: iwpriv <mlanX> passphrase 0:ssid=nxp
|
||||
* 2) <psk="psk">:<passphrase="passphare">:<bssid="00:50:43:ef:23:f3">
|
||||
* <ssid="valid ssid"> - passphrase and psk cannot be provided to
|
||||
* the same SSID, Takes one SSID at a time, If ssid= is present
|
||||
* the it should contain a passphrase or psk. If no arguments are
|
||||
* provided then AKMP=802.1x, and passphrase should be provided
|
||||
* after association.
|
||||
* End of each parameter should be followed by a ':'(except for the
|
||||
* last parameter) as the delimiter. If ':' has to be used in
|
||||
* an SSID then a '/' should be preceded to ':' as a escape.
|
||||
* Eg:iwpriv <mlanX> passphrase
|
||||
* "1:ssid=mrvl AP:psk=abcdefgh:bssid=00:50:43:ef:23:f3"
|
||||
* iwpriv <mlanX> passphrase
|
||||
* "1:ssid=nxp/: AP:psk=abcdefgd:bssid=00:50:43:ef:23:f3"
|
||||
* iwpriv <mlanX> passphrase "1:ssid=mrvlAP:psk=abcdefgd"
|
||||
* 3) <ssid="valid ssid"> - This will clear the passphrase
|
||||
* for specified ssid, if none specified then it will clear all.
|
||||
* Eg: iwpriv <mlanX> passphrase 2:ssid=nxp
|
||||
*/
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_SUPPLICANT_PMK);
|
||||
pesupplicant_psk->action = wlan_cpu_to_le16(cmd_action);
|
||||
pesupplicant_psk->cache_result = 0;
|
||||
cmd->size = wlan_cpu_to_le16(cmd->size);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/* -1 is for t_u8 TlvBuffer[1] as this should not be included */
|
||||
// Parse the rest of the buf here
|
||||
// 1) <ssid="valid ssid"> - This will get the passphrase, AKMP
|
||||
// for specified ssid, if none specified then it will get all.
|
||||
// Eg: iwpriv <mlanX> passphrase 0:ssid=nxp
|
||||
// 2) <psk="psk">:<passphrase="passphare">:<bssid="00:50:43:ef:23:f3">
|
||||
// <ssid="valid ssid"> - passphrase and psk cannot be provided to
|
||||
// the same SSID, Takes one SSID at a time, If ssid= is present
|
||||
// the it should contain a passphrase or psk. If no arguments are
|
||||
// provided then AKMP=802.1x, and passphrase should be provided
|
||||
// after association.
|
||||
// End of each parameter should be followed by a ':'(except for the
|
||||
// last parameter) as the delimiter. If ':' has to be used in
|
||||
// an SSID then a '/' should be preceded to ':' as a escape.
|
||||
// Eg:iwpriv <mlanX> passphrase
|
||||
// "1:ssid=mrvl AP:psk=abcdefgh:bssid=00:50:43:ef:23:f3"
|
||||
// iwpriv <mlanX> passphrase
|
||||
// "1:ssid=nxp/: AP:psk=abcdefgd:bssid=00:50:43:ef:23:f3"
|
||||
// iwpriv <mlanX> passphrase "1:ssid=mrvlAP:psk=abcdefgd"
|
||||
// 3) <ssid="valid ssid"> - This will clear the passphrase
|
||||
// for specified ssid, if none specified then it will clear all.
|
||||
// Eg: iwpriv <mlanX> passphrase 2:ssid=nxp
|
||||
//
|
||||
//
|
||||
// -1 is for t_u8 TlvBuffer[1] as this should not be included */
|
||||
cmd->size = sizeof(HostCmd_DS_802_11_SUPPLICANT_PMK) + S_DS_GEN - 1;
|
||||
if (psk && memcmp(pmpriv->adapter, (t_u8 *)&psk->bssid, zero_mac,
|
||||
sizeof(zero_mac))) {
|
||||
|
@ -6743,60 +6929,133 @@ mlan_status wlan_cmd_802_11_supplicant_pmk(pmlan_private pmpriv,
|
|||
(ppmk_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
ppmk_tlv->header.len = wlan_cpu_to_le16(ppmk_tlv->header.len);
|
||||
pmk_flag = 1;
|
||||
if (memcmp(pmpriv->adapter, psk->psk.pmk.pmk_r0, zero,
|
||||
MLAN_MAX_KEY_LENGTH)) {
|
||||
ppmk_tlv = (MrvlIEtypes_PMK_t *)ptlv_buffer;
|
||||
ppmk_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_PMK_R0);
|
||||
ppmk_tlv->header.len = MLAN_MAX_KEY_LENGTH;
|
||||
memcpy_ext(pmpriv->adapter, ppmk_tlv->pmk,
|
||||
psk->psk.pmk.pmk_r0, MLAN_MAX_KEY_LENGTH,
|
||||
MLAN_MAX_KEY_LENGTH);
|
||||
ptlv_buffer += (ppmk_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (ppmk_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
ppmk_tlv->header.len =
|
||||
wlan_cpu_to_le16(ppmk_tlv->header.len);
|
||||
}
|
||||
if (memcmp(pmpriv->adapter, psk->psk.pmk.pmk_r0_name, zero,
|
||||
MLAN_MAX_PMKR0_NAME_LENGTH)) {
|
||||
ppmk_tlv = (MrvlIEtypes_PMK_t *)ptlv_buffer;
|
||||
ppmk_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_PMK_R0_NAME);
|
||||
ppmk_tlv->header.len = MLAN_MAX_PMKR0_NAME_LENGTH;
|
||||
memcpy_ext(pmpriv->adapter, ppmk_tlv->pmk,
|
||||
psk->psk.pmk.pmk_r0_name,
|
||||
MLAN_MAX_PMKR0_NAME_LENGTH,
|
||||
MLAN_MAX_PMKR0_NAME_LENGTH);
|
||||
ptlv_buffer += (ppmk_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (ppmk_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
ppmk_tlv->header.len =
|
||||
wlan_cpu_to_le16(ppmk_tlv->header.len);
|
||||
}
|
||||
}
|
||||
if (psk->ssid.ssid_len) {
|
||||
pssid_tlv = (MrvlIEtypes_SsIdParamSet_t *)ptlv_buffer;
|
||||
pssid_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_SSID);
|
||||
pssid_tlv->header.len =
|
||||
(t_u16)MIN(MLAN_MAX_SSID_LENGTH, psk->ssid.ssid_len);
|
||||
memcpy_ext(pmpriv->adapter, (t_u8 *)pssid_tlv->ssid,
|
||||
(t_u8 *)psk->ssid.ssid, psk->ssid.ssid_len,
|
||||
MLAN_MAX_SSID_LENGTH);
|
||||
if (pmpriv->adapter->fw_roaming &&
|
||||
(pmpriv->adapter->userset_passphrase ||
|
||||
(psk && psk->psk_type == MLAN_PSK_PMK))) {
|
||||
proam_tlv = (MrvlIEtypes_fw_roam_enable_t *)ptlv_buffer;
|
||||
proam_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_ROAM);
|
||||
proam_tlv->header.len = sizeof(MrvlIEtypes_fw_roam_enable_t) -
|
||||
sizeof(MrvlIEtypesHeader_t);
|
||||
proam_tlv->roam_enable = MTRUE;
|
||||
proam_tlv->userset_passphrase =
|
||||
pmpriv->adapter->userset_passphrase;
|
||||
ptlv_buffer +=
|
||||
(pssid_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
(proam_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size +=
|
||||
(pssid_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
pssid_tlv->header.len = wlan_cpu_to_le16(pssid_tlv->header.len);
|
||||
ssid_flag = 1;
|
||||
}
|
||||
if (psk->psk_type == MLAN_PSK_PASSPHRASE) {
|
||||
ppassphrase_tlv = (MrvlIEtypes_Passphrase_t *)ptlv_buffer;
|
||||
ppassphrase_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_PASSPHRASE);
|
||||
ppassphrase_tlv->header.len =
|
||||
(t_u16)MIN(MLAN_MAX_PASSPHRASE_LENGTH,
|
||||
psk->psk.passphrase.passphrase_len);
|
||||
memcpy_ext(pmpriv->adapter, ppassphrase_tlv->passphrase,
|
||||
psk->psk.passphrase.passphrase,
|
||||
psk->psk.passphrase.passphrase_len,
|
||||
MLAN_MAX_PASSPHRASE_LENGTH);
|
||||
ptlv_buffer += (ppassphrase_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (ppassphrase_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
ppassphrase_tlv->header.len =
|
||||
wlan_cpu_to_le16(ppassphrase_tlv->header.len);
|
||||
passphrase_flag = 1;
|
||||
}
|
||||
if (psk->psk_type == MLAN_PSK_SAE_PASSWORD) {
|
||||
psae_password_tlv = (MrvlIEtypes_SAE_Password_t *)ptlv_buffer;
|
||||
psae_password_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_SAE_PASSWORD);
|
||||
psae_password_tlv->header.len =
|
||||
(t_u16)MIN(MLAN_MAX_SAE_PASSWORD_LENGTH,
|
||||
psk->psk.sae_password.sae_password_len);
|
||||
memcpy_ext(pmpriv->adapter, psae_password_tlv->sae_password,
|
||||
psk->psk.sae_password.sae_password,
|
||||
psk->psk.sae_password.sae_password_len,
|
||||
MLAN_MAX_SAE_PASSWORD_LENGTH);
|
||||
ptlv_buffer += (psae_password_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (psae_password_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
psae_password_tlv->header.len =
|
||||
wlan_cpu_to_le16(psae_password_tlv->header.len);
|
||||
sae_password_flag = 1;
|
||||
(proam_tlv->header.len + sizeof(MrvlIEtypesHeader_t));
|
||||
proam_tlv->header.len = wlan_cpu_to_le16(proam_tlv->header.len);
|
||||
}
|
||||
do {
|
||||
if (pmpriv->adapter->userset_passphrase &&
|
||||
sec->multi_passphrase) {
|
||||
key_tlv = (MrvlIEtypes_keyParams_t *)ptlv_buffer;
|
||||
key_tlv->header.type = wlan_cpu_to_le16(
|
||||
TLV_TYPE_ROAM_OFFLOAD_USER_SET_PMK);
|
||||
ptlv_buffer += sizeof(MrvlIEtypesHeader_t);
|
||||
cmd->size += sizeof(MrvlIEtypesHeader_t);
|
||||
length = cmd->size;
|
||||
}
|
||||
if (psk->ssid.ssid_len) {
|
||||
pssid_tlv = (MrvlIEtypes_SsIdParamSet_t *)ptlv_buffer;
|
||||
pssid_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_SSID);
|
||||
pssid_tlv->header.len = (t_u16)MIN(MLAN_MAX_SSID_LENGTH,
|
||||
psk->ssid.ssid_len);
|
||||
memcpy_ext(pmpriv->adapter, (t_u8 *)pssid_tlv->ssid,
|
||||
(t_u8 *)psk->ssid.ssid, psk->ssid.ssid_len,
|
||||
MLAN_MAX_SSID_LENGTH);
|
||||
ptlv_buffer += (pssid_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (pssid_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
pssid_tlv->header.len =
|
||||
wlan_cpu_to_le16(pssid_tlv->header.len);
|
||||
ssid_flag = 1;
|
||||
}
|
||||
if (psk->psk_type == MLAN_PSK_PASSPHRASE) {
|
||||
ppassphrase_tlv =
|
||||
(MrvlIEtypes_Passphrase_t *)ptlv_buffer;
|
||||
ppassphrase_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_PASSPHRASE);
|
||||
ppassphrase_tlv->header.len =
|
||||
(t_u16)MIN(MLAN_MAX_PASSPHRASE_LENGTH,
|
||||
psk->psk.passphrase.passphrase_len);
|
||||
memcpy_ext(pmpriv->adapter, ppassphrase_tlv->passphrase,
|
||||
psk->psk.passphrase.passphrase,
|
||||
psk->psk.passphrase.passphrase_len,
|
||||
MLAN_MAX_PASSPHRASE_LENGTH);
|
||||
ptlv_buffer += (ppassphrase_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (ppassphrase_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
ppassphrase_tlv->header.len =
|
||||
wlan_cpu_to_le16(ppassphrase_tlv->header.len);
|
||||
passphrase_flag = 1;
|
||||
}
|
||||
if (psk->psk_type == MLAN_PSK_SAE_PASSWORD) {
|
||||
psae_password_tlv =
|
||||
(MrvlIEtypes_SAE_Password_t *)ptlv_buffer;
|
||||
psae_password_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_SAE_PASSWORD);
|
||||
psae_password_tlv->header.len = (t_u16)MIN(
|
||||
MLAN_MAX_SAE_PASSWORD_LENGTH,
|
||||
psk->psk.sae_password.sae_password_len);
|
||||
memcpy_ext(pmpriv->adapter,
|
||||
psae_password_tlv->sae_password,
|
||||
psk->psk.sae_password.sae_password,
|
||||
psk->psk.sae_password.sae_password_len,
|
||||
MLAN_MAX_SAE_PASSWORD_LENGTH);
|
||||
ptlv_buffer += (psae_password_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
cmd->size += (psae_password_tlv->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
psae_password_tlv->header.len =
|
||||
wlan_cpu_to_le16(psae_password_tlv->header.len);
|
||||
sae_password_flag = 1;
|
||||
}
|
||||
if (key_tlv)
|
||||
key_tlv->header.len =
|
||||
wlan_cpu_to_le16(cmd->size - length);
|
||||
userset_passphrase++;
|
||||
psk = (mlan_ds_passphrase *)&sec->param
|
||||
.roam_passphrase[userset_passphrase];
|
||||
} while (psk && sec->multi_passphrase &&
|
||||
userset_passphrase < pmpriv->adapter->userset_passphrase);
|
||||
pmpriv->adapter->userset_passphrase = 0;
|
||||
if ((cmd_action == HostCmd_ACT_GEN_SET) &&
|
||||
((ssid_flag || bssid_flag) && (!pmk_flag && !passphrase_flag) &&
|
||||
(!pmk_flag && !sae_password_flag))) {
|
||||
|
@ -8819,6 +9078,115 @@ mlan_status wlan_ret_get_chan_trpc_config(pmlan_private pmpriv,
|
|||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of mc_aggr_cfg
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @param cmd_action the action: GET or SET
|
||||
* @param pdata_buf A pointer to data buffer
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_cmd_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf)
|
||||
{
|
||||
HostCmd_DS_MC_AGGR_CFG *cfg_cmd =
|
||||
(HostCmd_DS_MC_AGGR_CFG *)&cmd->params.mc_aggr_cfg;
|
||||
mlan_ds_mc_aggr_cfg *cfg = (mlan_ds_mc_aggr_cfg *)pdata_buf;
|
||||
|
||||
ENTER();
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_MC_AGGR_CFG);
|
||||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_MC_AGGR_CFG) + S_DS_GEN);
|
||||
cfg_cmd->action = wlan_cpu_to_le16(cmd_action);
|
||||
|
||||
cfg_cmd->enable_bitmap = (t_u8)cfg->enable_bitmap;
|
||||
cfg_cmd->mask_bitmap = (t_u8)cfg->mask_bitmap;
|
||||
cfg_cmd->cts2self_offset = wlan_cpu_to_le16(cfg->cts2self_offset);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of mc_aggr_cfg
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to mlan_ioctl_req structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_ret_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
HostCmd_DS_MC_AGGR_CFG *cfg_cmd =
|
||||
(HostCmd_DS_MC_AGGR_CFG *)&resp->params.mc_aggr_cfg;
|
||||
mlan_ds_misc_cfg *misc_cfg = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_buf) {
|
||||
misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
misc_cfg->param.mc_aggr_cfg.enable_bitmap =
|
||||
(t_u8)cfg_cmd->enable_bitmap;
|
||||
misc_cfg->param.mc_aggr_cfg.mask_bitmap =
|
||||
(t_u8)cfg_cmd->mask_bitmap;
|
||||
misc_cfg->param.mc_aggr_cfg.cts2self_offset =
|
||||
(t_u8)cfg_cmd->cts2self_offset;
|
||||
}
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
/**
|
||||
* @brief This function prepares command of ch_load
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @param cmd_action the action: GET or SET
|
||||
* @param pdata_buf A pointer to data buffer
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf)
|
||||
{
|
||||
HostCmd_DS_GET_CH_LOAD *cfg_cmd =
|
||||
(HostCmd_DS_GET_CH_LOAD *)&cmd->params.ch_load;
|
||||
mlan_ds_ch_load *cfg = (mlan_ds_ch_load *)pdata_buf;
|
||||
|
||||
ENTER();
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_GET_CH_LOAD);
|
||||
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_GET_CH_LOAD) + S_DS_GEN);
|
||||
cfg_cmd->action = wlan_cpu_to_le16(cmd_action);
|
||||
cfg_cmd->ch_load = wlan_cpu_to_le16(cfg->ch_load_param);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
/**
|
||||
* @brief This function handles the command response of ch_load
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to mlan_ioctl_req structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
HostCmd_DS_GET_CH_LOAD *cfg_cmd =
|
||||
(HostCmd_DS_GET_CH_LOAD *)&resp->params.ch_load;
|
||||
mlan_ds_misc_cfg *misc_cfg = MNULL;
|
||||
ENTER();
|
||||
if (pioctl_buf) {
|
||||
misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
misc_cfg->param.ch_load.ch_load_param =
|
||||
wlan_le16_to_cpu(cfg_cmd->ch_load);
|
||||
}
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of RANGE_EXT
|
||||
*
|
||||
|
@ -8875,3 +9243,59 @@ mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of get_sensor_temp
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @param cmd_action the action: GET or SET
|
||||
* @param pdata_buf A pointer to data buffer
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_cmd_get_sensor_temp(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *cmd, t_u16 cmd_action)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
if (cmd_action != HostCmd_ACT_GEN_GET) {
|
||||
PRINTM(MERROR, "wlan_cmd_get_sensor_temp: support GET only.\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_DS_GET_SENSOR_TEMP);
|
||||
cmd->size = wlan_cpu_to_le16(S_DS_GEN + 4);
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
/**
|
||||
* @brief This function handles the command response of get_sensor_temp
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to mlan_ioctl_req structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
mlan_ds_misc_cfg *pcfg = MNULL;
|
||||
const HostCmd_DS_SENSOR_TEMP *pSensorT = &resp->params.temp_sensor;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_buf) {
|
||||
pcfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
pcfg->param.sensor_temp.temperature =
|
||||
wlan_le32_to_cpu(pSensorT->temperature);
|
||||
PRINTM(MCMND, "get SOC temperature %u C \n",
|
||||
pSensorT->temperature);
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file declares the generic data structures and APIs.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -24,7 +24,7 @@
|
|||
#define _MLAN_DECL_H_
|
||||
|
||||
/** MLAN release version */
|
||||
#define MLAN_RELEASE_VERSION "299.p1"
|
||||
#define MLAN_RELEASE_VERSION "322"
|
||||
|
||||
/** Re-define generic data types for MLAN/MOAL */
|
||||
/** Signed char (1-byte) */
|
||||
|
@ -98,6 +98,8 @@ typedef t_s32 t_sval;
|
|||
/** MLAN FALSE */
|
||||
#define MFALSE (0)
|
||||
|
||||
#define CHANNEL_SPEC_SNIFFER_MODE 1
|
||||
|
||||
#ifndef MACSTR
|
||||
/** MAC address security format */
|
||||
#define MACSTR "%02x:XX:XX:XX:%02x:%02x"
|
||||
|
@ -375,6 +377,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_9177 0x09
|
||||
/** 8801 card type */
|
||||
#define CARD_TYPE_8801 0x0a
|
||||
/** OWL card type */
|
||||
#define CARD_TYPE_NW62X 0x0b
|
||||
|
||||
/** 9098 A0 reverion num */
|
||||
#define CHIP_9098_REV_A0 1
|
||||
|
@ -406,6 +410,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8))
|
||||
/** SD8801 card type */
|
||||
#define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8))
|
||||
/** SD_NW62X card type */
|
||||
#define CARD_TYPE_SDNW62X (CARD_TYPE_NW62X | (INTF_SD << 8))
|
||||
|
||||
#define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct))
|
||||
#define IS_SD8897(ct) (CARD_TYPE_SD8897 == (ct))
|
||||
|
@ -417,6 +423,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct))
|
||||
#define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct))
|
||||
#define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct))
|
||||
#define IS_SDNW62X(ct) (CARD_TYPE_SDNW62X == (ct))
|
||||
|
||||
/** SD8887 Card */
|
||||
#define CARD_SD8887 "SD8887"
|
||||
|
@ -431,15 +438,15 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** SD8987 Card */
|
||||
#define CARD_SD8987 "SD8987"
|
||||
/** SD9097 Card */
|
||||
#define CARD_SD9097 "SD9097"
|
||||
/** SDIW620 Card */
|
||||
#define CARD_SDIW620 "SDIW620"
|
||||
#define CARD_SD9097 "SDIW620"
|
||||
/** SD9098 Card */
|
||||
#define CARD_SD9098 "SD9098"
|
||||
/** SD9177 Card */
|
||||
#define CARD_SD9177 "SD9177"
|
||||
/** SD8801 Card */
|
||||
#define CARD_SD8801 "SD8801"
|
||||
/** SDNW62X Card */
|
||||
#define CARD_SDNW62X "SDNW62X"
|
||||
#endif
|
||||
|
||||
#ifdef PCIE
|
||||
|
@ -451,26 +458,29 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8))
|
||||
/** PCIE9098 card type */
|
||||
#define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8))
|
||||
/** PCIENW62X card type */
|
||||
#define CARD_TYPE_PCIENW62X (CARD_TYPE_NW62X | (INTF_PCIE << 8))
|
||||
|
||||
#define IS_PCIE8897(ct) (CARD_TYPE_PCIE8897 == (ct))
|
||||
#define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct))
|
||||
#define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct))
|
||||
#define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct))
|
||||
#define IS_PCIENW62X(ct) (CARD_TYPE_PCIENW62X == (ct))
|
||||
|
||||
/** PCIE8897 Card */
|
||||
#define CARD_PCIE8897 "PCIE8897"
|
||||
/** PCIE8997 Card */
|
||||
#define CARD_PCIE8997 "PCIE8997"
|
||||
/** PCIE9097 Card */
|
||||
#define CARD_PCIE9097 "PCIE9097"
|
||||
/** PCIEIW620 Card */
|
||||
#define CARD_PCIEIW620 "PCIEIW620"
|
||||
#define CARD_PCIE9097 "PCIEIW620"
|
||||
/** PCIE9000S Card */
|
||||
#define CARD_PCIE9000S "PCIE9000S"
|
||||
/** PCIE9098 Card */
|
||||
#define CARD_PCIE9098 "PCIE9098"
|
||||
/** PCIEAW690 Card */
|
||||
#define CARD_PCIEAW690 "PCIEAW690"
|
||||
/** PCIENW62X Card */
|
||||
#define CARD_PCIENW62X "PCIENW62X"
|
||||
#endif
|
||||
|
||||
#ifdef USB
|
||||
|
@ -486,6 +496,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8))
|
||||
/** USB9097 card type */
|
||||
#define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8))
|
||||
/** USBNW62X card type */
|
||||
#define CARD_TYPE_USBNW62X (CARD_TYPE_NW62X | (INTF_USB << 8))
|
||||
|
||||
#define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct))
|
||||
#define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct))
|
||||
|
@ -493,6 +505,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct))
|
||||
#define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct))
|
||||
#define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct))
|
||||
#define IS_USBNW62X(ct) (CARD_TYPE_USBNW62X == (ct))
|
||||
|
||||
/** USB8801 Card */
|
||||
#define CARD_USB8801 "USB8801"
|
||||
|
@ -505,9 +518,9 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** USB9098 Card */
|
||||
#define CARD_USB9098 "USB9098"
|
||||
/** USB9097 Card */
|
||||
#define CARD_USB9097 "USB9097"
|
||||
/** USBIW620 Card */
|
||||
#define CARD_USBIW620 "USBIW620"
|
||||
#define CARD_USB9097 "USBIW620"
|
||||
/** USBNW62X Card */
|
||||
#define CARD_USBNW62X "USBNW62X"
|
||||
#endif
|
||||
|
||||
#define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf))
|
||||
|
@ -519,6 +532,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf))
|
||||
#define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf))
|
||||
#define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf))
|
||||
#define IS_CARDNW62X(ct) (CARD_TYPE_NW62X == ((ct)&0xf))
|
||||
|
||||
typedef struct _card_type_entry {
|
||||
t_u16 card_type;
|
||||
|
@ -578,6 +592,9 @@ typedef enum {
|
|||
/** Buffer flag for TX_STATUS */
|
||||
#define MLAN_BUF_FLAG_TX_STATUS MBIT(10)
|
||||
|
||||
/** Buffer flag for NET_MONITOR */
|
||||
#define MLAN_BUF_FLAG_NET_MONITOR MBIT(11)
|
||||
|
||||
/** Buffer flag for NULL data packet */
|
||||
#define MLAN_BUF_FLAG_NULL_PKT MBIT(12)
|
||||
/** Buffer flag for Diag pkt */
|
||||
|
@ -585,6 +602,8 @@ typedef enum {
|
|||
|
||||
#define MLAN_BUF_FLAG_TX_CTRL MBIT(14)
|
||||
|
||||
#define MLAN_BUF_FLAG_MC_AGGR_PKT MBIT(17)
|
||||
|
||||
#ifdef DEBUG_LEVEL1
|
||||
/** Debug level bit definition */
|
||||
#define MMSG MBIT(0)
|
||||
|
@ -694,6 +713,7 @@ typedef enum _mlan_bss_type {
|
|||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
MLAN_BSS_TYPE_WIFIDIRECT = 2,
|
||||
#endif
|
||||
MLAN_BSS_TYPE_DFS = 8,
|
||||
MLAN_BSS_TYPE_ANY = 0xff,
|
||||
} mlan_bss_type;
|
||||
|
||||
|
@ -767,6 +787,7 @@ typedef enum _mlan_event_id {
|
|||
#if defined(PCIE)
|
||||
MLAN_EVENT_ID_SSU_DUMP_FILE = 0x00000039,
|
||||
#endif /* SSU_SUPPORT */
|
||||
MLAN_EVENT_ID_CSI = 0x00000040,
|
||||
/* Event generated by MLAN driver (MSB=1) */
|
||||
MLAN_EVENT_ID_DRV_CONNECTED = 0x80000001,
|
||||
MLAN_EVENT_ID_DRV_DEFER_HANDLING = 0x80000002,
|
||||
|
@ -789,6 +810,7 @@ typedef enum _mlan_event_id {
|
|||
#ifdef UAP_SUPPORT
|
||||
MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
|
||||
#endif
|
||||
MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023,
|
||||
MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026,
|
||||
MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027,
|
||||
MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028,
|
||||
|
@ -875,6 +897,7 @@ enum mlan_channel_type {
|
|||
enum { BAND_2GHZ = 0,
|
||||
BAND_5GHZ = 1,
|
||||
BAND_4GHZ = 2,
|
||||
BAND_6GHZ = 3,
|
||||
};
|
||||
|
||||
/** channel offset */
|
||||
|
@ -925,16 +948,6 @@ typedef enum _dfs_w53_cfg_t {
|
|||
|
||||
/** Band_Config_t */
|
||||
typedef MLAN_PACK_START struct _Band_Config_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/
|
||||
t_u8 scanMode : 2;
|
||||
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
|
||||
t_u8 chan2Offset : 2;
|
||||
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
|
||||
t_u8 chanWidth : 2;
|
||||
/** Band Info - (00)=2.4GHz, (01)=5GHz */
|
||||
t_u8 chanBand : 2;
|
||||
#else
|
||||
/** Band Info - (00)=2.4GHz, (01)=5GHz */
|
||||
t_u8 chanBand : 2;
|
||||
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
|
||||
|
@ -943,7 +956,6 @@ typedef MLAN_PACK_START struct _Band_Config_t {
|
|||
t_u8 chan2Offset : 2;
|
||||
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=Adoption mode*/
|
||||
t_u8 scanMode : 2;
|
||||
#endif
|
||||
} MLAN_PACK_END Band_Config_t;
|
||||
|
||||
/** channel_band_t */
|
||||
|
@ -1033,6 +1045,45 @@ typedef struct _mlan_cmdresp_event {
|
|||
} mlan_cmdresp_event, *pmlan_cmdresp_event;
|
||||
|
||||
/** csi event data structure */
|
||||
typedef MLAN_PACK_START struct _csi_record_ds {
|
||||
/** Length in DWORDS, including header */
|
||||
t_u16 Len;
|
||||
/** CSI signature. 0xABCD fixed */
|
||||
t_u16 CSI_Sign;
|
||||
/** User defined HeaderID */
|
||||
t_u32 CSI_HeaderID;
|
||||
/** Packet info field */
|
||||
t_u16 PKT_info;
|
||||
/** Frame control field for the received packet*/
|
||||
t_u16 FCF;
|
||||
/** Timestamp when packet received */
|
||||
t_u64 TSF;
|
||||
/** Received Packet Destination MAC Address */
|
||||
t_u8 Dst_MAC[6];
|
||||
/** Received Packet Source MAC Address */
|
||||
t_u8 Src_MAC[6];
|
||||
/** RSSI for antenna A */
|
||||
t_u8 Rx_RSSI_A;
|
||||
/** RSSI for antenna B */
|
||||
t_u8 Rx_RSSI_B;
|
||||
/** Noise floor for antenna A */
|
||||
t_u8 Rx_NF_A;
|
||||
/** Noise floor for antenna A */
|
||||
t_u8 Rx_NF_B;
|
||||
/** Rx signal strength above noise floor */
|
||||
t_u8 Rx_SINR;
|
||||
/** Channel */
|
||||
t_u8 channel;
|
||||
/** user defined Chip ID */
|
||||
t_u16 chip_id;
|
||||
/** Reserved */
|
||||
t_u32 rsvd;
|
||||
/** CSI data length in DWORDs */
|
||||
t_u32 CSI_Data_Length;
|
||||
/** Start of CSI data */
|
||||
t_u8 CSI_Data[0];
|
||||
/** At the end of CSI raw data, user defined TailID of 4 bytes*/
|
||||
} MLAN_PACK_END csi_record_ds, *pcsi_record_ds;
|
||||
|
||||
/** mlan_ioctl_req data structure */
|
||||
typedef struct _mlan_ioctl_req {
|
||||
|
@ -1060,18 +1111,52 @@ typedef struct _mlan_ioctl_req {
|
|||
t_ptr reserved_1;
|
||||
} mlan_ioctl_req, *pmlan_ioctl_req;
|
||||
|
||||
typedef MLAN_PACK_START struct _mix_rate_info {
|
||||
/** bit0: LGI: gi=0, SGI: gi= 1 */
|
||||
/** bit1-2: 20M: bw=0, 40M: bw=1, 80M: bw=2, 160M: bw=3 */
|
||||
/** bit3-4: LG: format=0, HT: format=1, VHT: format=2 */
|
||||
/** bit5: LDPC: 0-not support, 1-support */
|
||||
/** bit6-7:reserved */
|
||||
t_u8 rate_info;
|
||||
/** MCS index */
|
||||
t_u8 mcs_index;
|
||||
/** bitrate, in 500Kbps */
|
||||
t_u16 bitrate;
|
||||
} MLAN_PACK_END mix_rate_info, *pmix_rate_info;
|
||||
|
||||
typedef MLAN_PACK_START struct _rxpd_extra_info {
|
||||
/** flags */
|
||||
t_u8 flags;
|
||||
/** channel.flags */
|
||||
t_u16 channel_flags;
|
||||
/** mcs.known */
|
||||
t_u8 mcs_known;
|
||||
/** mcs.flags */
|
||||
t_u8 mcs_flags;
|
||||
/** vht sig1 */
|
||||
t_u32 vht_sig1;
|
||||
/** vht sig2 */
|
||||
t_u32 vht_sig2;
|
||||
} MLAN_PACK_END rxpd_extra_info, *prxpd_extra_info;
|
||||
|
||||
typedef MLAN_PACK_START struct _radiotap_info {
|
||||
/** Rate Info */
|
||||
mix_rate_info rate_info;
|
||||
/** SNR */
|
||||
t_s8 snr;
|
||||
/** Noise Floor */
|
||||
t_s8 nf;
|
||||
/** band config */
|
||||
t_u8 band_config;
|
||||
/** chan number */
|
||||
t_u8 chan_num;
|
||||
t_u8 antenna;
|
||||
/** extra rxpd info from FW */
|
||||
rxpd_extra_info extra_info;
|
||||
} MLAN_PACK_END radiotap_info, *pradiotap_info;
|
||||
|
||||
/** txpower structure */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Host tx power ctrl:
|
||||
0x0: use fw setting for TX power
|
||||
0x1: value specified in bit[6] and bit[5:0] are valid */
|
||||
t_u8 hostctl : 1;
|
||||
/** Sign of the power specified in bit[5:0] */
|
||||
t_u8 sign : 1;
|
||||
/** Power to be used for transmission(in dBm) */
|
||||
t_u8 abs_val : 6;
|
||||
#else
|
||||
/** Power to be used for transmission(in dBm) */
|
||||
t_u8 abs_val : 6;
|
||||
/** Sign of the power specified in bit[5:0] */
|
||||
|
@ -1080,7 +1165,6 @@ typedef MLAN_PACK_START struct {
|
|||
0x0: use fw setting for TX power
|
||||
0x1: value specified in bit[6] and bit[5:0] are valid */
|
||||
t_u8 hostctl : 1;
|
||||
#endif
|
||||
} MLAN_PACK_END tx_power_t;
|
||||
/* pkt_txctrl */
|
||||
typedef MLAN_PACK_START struct _pkt_txctrl {
|
||||
|
@ -1111,6 +1195,25 @@ typedef MLAN_PACK_START struct _pkt_rxinfo {
|
|||
t_u8 rssi;
|
||||
} MLAN_PACK_END pkt_rxinfo, *ppkt_rxinfo;
|
||||
|
||||
#define MC_FLAG_RETRY MBIT(0)
|
||||
#define MC_FLAG_START_CYCLE MBIT(1)
|
||||
#define MC_FLAG_END_CYCLE MBIT(2)
|
||||
#define MC_FLAG_START_AMPDU MBIT(3)
|
||||
#define MC_FLAG_END_AMPDU MBIT(4)
|
||||
/* mc pkt txcontrol */
|
||||
typedef MLAN_PACK_START struct _mc_txcontrol {
|
||||
/** Data rate in mcs index, 0-7 */
|
||||
t_u8 mcs_index;
|
||||
/** band width 0-20Mhz, 1-40Mhz */
|
||||
t_u8 bandwidth;
|
||||
/** seq_num */
|
||||
t_u16 seq_num;
|
||||
/** packet expiry time */
|
||||
t_u32 pkt_expiry;
|
||||
/** mc_pkt_flags */
|
||||
t_u8 mc_pkt_flags;
|
||||
} MLAN_PACK_END mc_txcontrol, *pmc_txcontrol;
|
||||
|
||||
/** mlan_buffer data structure */
|
||||
typedef struct _mlan_buffer {
|
||||
/** Pointer to previous mlan_buffer */
|
||||
|
@ -1162,6 +1265,7 @@ typedef struct _mlan_buffer {
|
|||
/** Use count for this buffer */
|
||||
t_u32 use_count;
|
||||
union {
|
||||
mc_txcontrol mc_tx_info;
|
||||
pkt_txctrl tx_info;
|
||||
pkt_rxinfo rx_info;
|
||||
} u;
|
||||
|
@ -2270,4 +2374,6 @@ MLAN_API mlan_status mlan_disable_host_int(t_void *padapter);
|
|||
/** mlan unmask host interrupt */
|
||||
MLAN_API mlan_status mlan_enable_host_int(t_void *padapter);
|
||||
|
||||
#define CSI_SIGNATURE 0xABCD
|
||||
|
||||
#endif /* !_MLAN_DECL_H_ */
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* in MLAN module.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -421,6 +421,31 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
/** TLV type : BCN miss */
|
||||
#define TLV_TYPE_PRE_BCNMISS (PROPRIETARY_TLV_BASE_ID + 0x49) /* 0x0149 */
|
||||
|
||||
/** TLV type : ENABLE ROAM IE */
|
||||
#define TLV_TYPE_ROAM (PROPRIETARY_TLV_BASE_ID + 245)
|
||||
/** TLV type : AP LIST IE */
|
||||
#define TLV_TYPE_APLIST (PROPRIETARY_TLV_BASE_ID + 246)
|
||||
/** TLV type : PMK */
|
||||
#define TLV_TYPE_PMK_R0 (PROPRIETARY_TLV_BASE_ID + 247)
|
||||
/** TLV type : PMK */
|
||||
#define TLV_TYPE_PMK_R0_NAME (PROPRIETARY_TLV_BASE_ID + 248)
|
||||
/** TLV type : TRIGGER CONDITION*/
|
||||
#define TLV_TYPE_ROM_TRIGGER (PROPRIETARY_TLV_BASE_ID + 264)
|
||||
/** TLV type : RETRY_COUNT*/
|
||||
#define TLV_TYPE_ROM_RETRY_COUNT (PROPRIETARY_TLV_BASE_ID + 265)
|
||||
/** TLV type : BGSCAN SETTING*/
|
||||
#define TLV_TYPE_ROM_BGSCAN (PROPRIETARY_TLV_BASE_ID + 266)
|
||||
/** TLV type : PARA RSSI*/
|
||||
#define TLV_TYPE_ROM_PARA_RSSI (PROPRIETARY_TLV_BASE_ID + 267)
|
||||
/** TLV type : BSSID blacklist*/
|
||||
#define TLV_TYPE_BLACKLIST_BSSID (PROPRIETARY_TLV_BASE_ID + 0x11d)
|
||||
/** TLV type : BAND & RSSI*/
|
||||
#define TLV_TYPE_BAND_RSSI (PROPRIETARY_TLV_BASE_ID + 0x11e)
|
||||
/** TLV type : ESS scan*/
|
||||
#define TLV_TYPE_ENERGYEFFICIENTSCAN (PROPRIETARY_TLV_BASE_ID + 0xda)
|
||||
/** TLV type : KEY params*/
|
||||
#define TLV_TYPE_ROAM_OFFLOAD_USER_SET_PMK (PROPRIETARY_TLV_BASE_ID + 291)
|
||||
|
||||
/** TLV type: WAPI IE */
|
||||
#define TLV_TYPE_WAPI_IE (PROPRIETARY_TLV_BASE_ID + 0x5e) /* 0x015e */
|
||||
|
||||
|
@ -429,6 +454,10 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
/** TLV type: MAX_MGMT_IE */
|
||||
#define TLV_TYPE_MAX_MGMT_IE (PROPRIETARY_TLV_BASE_ID + 0xaa) /* 0x01aa */
|
||||
|
||||
/** TLV : Region Domain Code */
|
||||
#define TLV_TYPE_REGION_DOMAIN_CODE \
|
||||
(PROPRIETARY_TLV_BASE_ID + 0xab) /* 0x01ab */
|
||||
|
||||
/** TLV type: key param v2 */
|
||||
#define TLV_TYPE_KEY_PARAM_V2 (PROPRIETARY_TLV_BASE_ID + 0x9C) /* 0x019C */
|
||||
|
||||
|
@ -1062,6 +1091,8 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
(PROPRIETARY_TLV_BASE_ID + 0x5b) /* 0x015b \
|
||||
*/
|
||||
|
||||
/** TLV type : ZERO DFS Operation */
|
||||
#define TLV_TYPE_ZERO_DFS_OPERATION (PROPRIETARY_TLV_BASE_ID + 0x13b) // + 315
|
||||
/** TLV type : DFS W53 Configuration */
|
||||
#define TLV_TYPE_DFS_W53_CFG (PROPRIETARY_TLV_BASE_ID + 0x145) // + 325
|
||||
#ifdef OPCHAN
|
||||
|
@ -1261,6 +1292,8 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
|
||||
/** Host Command ID : 802.11 RSSI INFO EXT*/
|
||||
#define HostCmd_CMD_RSSI_INFO_EXT 0x0237
|
||||
/** Host Command ID : ROAMING OFFLOAD TO FW*/
|
||||
#define HostCmd_CMD_ROAM_OFFLOAD 0x0245
|
||||
|
||||
#ifdef RX_PACKET_COALESCE
|
||||
/** TLV ID for RX pkt coalesce config */
|
||||
|
@ -1316,6 +1349,10 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
#define HostCmd_CMD_MGMT_IE_LIST 0x00f2
|
||||
|
||||
#define HostCmd_CMD_802_11_BAND_STEERING 0x026f
|
||||
/*** Host Command ID " MC_AGGR_CFG */
|
||||
#define HostCmd_CMD_MC_AGGR_CFG 0x027a
|
||||
#define HostCmd_CMD_GET_CH_LOAD 0x027b
|
||||
|
||||
/** Host Command ID : TDLS configuration */
|
||||
#define HostCmd_CMD_TDLS_CONFIG 0x0100
|
||||
/** Host Command ID : TDLS operation */
|
||||
|
@ -1342,6 +1379,9 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
/** fw_cap_info bit23 for embedded authenticator support*/
|
||||
#define FW_CAPINFO_AUTH_SUPPORT MBIT(22)
|
||||
|
||||
/** fw_cap_info bit23 for firmware roaming*/
|
||||
#define FW_ROAMING_SUPPORT MBIT(23)
|
||||
|
||||
/** fw_cap_info bit25 for adhoc support*/
|
||||
#define FW_CAPINFO_ADHOC_SUPPORT MBIT(25)
|
||||
/** Check if adhoc is supported by firmware */
|
||||
|
@ -1382,6 +1422,10 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
#define FW_CAPINFO_EXT_OTP_CALDATA MBIT(11)
|
||||
/** FW cap info bit 12: RTT Support */
|
||||
#define FW_CAPINFO_EXT_RTT MBIT(12)
|
||||
/** FW cap info bit 13: Channel Tracking Support */
|
||||
#define FW_CAPINFO_EXT_CHAN_TRACK MBIT(13)
|
||||
/** FW cap info bit 14: 6G Support */
|
||||
#define FW_CAPINFO_EXT_6G MBIT(14)
|
||||
|
||||
/** Check if 5G 1x1 only is supported by firmware */
|
||||
#define IS_FW_SUPPORT_5G_1X1_ONLY(_adapter) \
|
||||
|
@ -1415,6 +1459,11 @@ typedef enum _WLAN_802_11_WEP_STATUS {
|
|||
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_BEACON_PROT)
|
||||
/** Check if RTT supported by firmware */
|
||||
#define IS_FW_SUPPORT_RTT(_adapter) (_adapter->fw_cap_ext & FW_CAPINFO_EXT_RTT)
|
||||
/** Check if Channel Tracking supported by firmware */
|
||||
#define IS_FW_SUPPORT_CHAN_TRACK(_adapter) \
|
||||
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_CHAN_TRACK)
|
||||
/** Check if 6G supported by firmware */
|
||||
#define IS_FW_SUPPORT_6G(_adapter) (_adapter->fw_cap_ext & FW_CAPINFO_EXT_6G)
|
||||
|
||||
/** MrvlIEtypes_PrevBssid_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_PrevBssid_t {
|
||||
|
@ -1482,6 +1531,24 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_He_cap_t {
|
|||
t_u8 val[20];
|
||||
} MLAN_PACK_END MrvlIEtypes_He_cap_t, *pMrvlIEtypes_he_cap_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_He_Op_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Element id extension */
|
||||
t_u8 ext_id;
|
||||
/** HE Operation Parameters */
|
||||
t_u16 he_op_param1;
|
||||
/** HE Operation Parameters */
|
||||
t_u8 he_op_param2;
|
||||
/** BSS Color Info */
|
||||
t_u8 bss_color_info;
|
||||
/** Basic HE-MCS and NSS Set */
|
||||
t_u16 basic_he_mcs_nss;
|
||||
/** Optional Field, including VHT Operation Info Max Co-Hosted BSSID
|
||||
* Indicator, and 6Ghz Operation Info */
|
||||
t_u8 option[9];
|
||||
} MLAN_PACK_END MrvlIEtypes_He_Op_t;
|
||||
|
||||
#ifdef RX_PACKET_COALESCE
|
||||
/** Host Command ID : Rx packet coalescing configuration */
|
||||
#define HostCmd_CMD_RX_PKT_COALESCE_CFG 0x012c
|
||||
|
@ -1526,6 +1593,9 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_He_cap_t {
|
|||
/** Host Command id: PMIC CONFIGURE*/
|
||||
#define HOST_CMD_PMIC_CONFIGURE 0x23E
|
||||
|
||||
/** Host Command ID: 802.11 Network Monitor */
|
||||
#define HostCmd_CMD_802_11_NET_MONITOR 0x0102
|
||||
|
||||
/** Host Command ID: Tx data pause */
|
||||
#define HostCmd_CMD_CFG_TX_DATA_PAUSE 0x0103
|
||||
|
||||
|
@ -1564,6 +1634,8 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_He_cap_t {
|
|||
|
||||
/** Host Command ID: BCA device access */
|
||||
#define HostCmd_CMD_BCA_REG_ACCESS 0x0272
|
||||
/** Host Command ID: register device access */
|
||||
#define HostCmd_CMD_REG_ACCESS 0x027C
|
||||
|
||||
/** Host Command ID: DFS repeater mode */
|
||||
#define HostCmd_DFS_REPEATER_MODE 0x012b
|
||||
|
@ -1588,7 +1660,8 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_He_cap_t {
|
|||
#define HostCmd_CMD_INDEPENDENT_RESET_CFG 0x0243
|
||||
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
/* TLV type: reg type */
|
||||
#define TLV_TYPE_REG_ACCESS_CTRL (PROPRIETARY_TLV_BASE_ID + 0x13C) /* 0x023c*/
|
||||
/** MrvlIEtypes_Reg_type_t*/
|
||||
|
@ -1598,7 +1671,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Reg_type_t {
|
|||
/** type: 0x81/0x82/0x83 */
|
||||
t_u8 type;
|
||||
} MLAN_PACK_END MrvlIEtypes_Reg_type_t;
|
||||
|
||||
#endif
|
||||
/** use to query chan region cfg setting in firmware */
|
||||
#define HostCmd_CMD_CHAN_REGION_CFG 0x0242
|
||||
|
@ -1669,6 +1741,9 @@ typedef MLAN_PACK_START struct _power_table_attr {
|
|||
#if defined(PCIE)
|
||||
#define HostCmd_CMD_SSU 0x0259
|
||||
#endif
|
||||
#define HostCmd_CMD_CSI 0x025b
|
||||
#define CSI_CMD_ENABLE 0x0001
|
||||
#define CSI_CMD_DISABLE 0x0002
|
||||
|
||||
#define HostCmd_CMD_DMCS_CONFIG 0x0260
|
||||
|
||||
|
@ -1989,12 +2064,15 @@ typedef enum _ENH_PS_MODES {
|
|||
|
||||
#define EVENT_VDLL_IND 0x00000081
|
||||
|
||||
#define EVENT_ROAM_OFFLOAD 0x00000083
|
||||
|
||||
#define EVENT_EXCEED_MAX_P2P_CONN 0x00000089
|
||||
|
||||
#if defined(PCIE)
|
||||
#define EVENT_SSU_DUMP_DMA 0x0000008C
|
||||
#endif
|
||||
|
||||
#define EVENT_CSI 0x0000008D
|
||||
#define EVENT_FW_HANG_REPORT 0x0000008F
|
||||
/** Card Event definition : RESET PN */
|
||||
|
||||
|
@ -2082,6 +2160,8 @@ typedef enum _tdls_error_code_e {
|
|||
TDLS_PEER_STA_UNREACHABLE = 25,
|
||||
} tdls_error_code_e;
|
||||
|
||||
#define RXPD_FLAG_EXTRA_HEADER (1 << 1)
|
||||
|
||||
/** Event_WEP_ICV_ERR structure */
|
||||
typedef MLAN_PACK_START struct _Event_WEP_ICV_ERR {
|
||||
/** Reason code */
|
||||
|
@ -2159,6 +2239,8 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_TDLS_Idle_Timeout_t {
|
|||
/** Packet type: debugging */
|
||||
#define PKT_TYPE_DEBUG 0xEF
|
||||
|
||||
#define PKT_TYPE_802DOT11_MC_AGGR 11
|
||||
|
||||
/** channel number at bit 5-13 */
|
||||
#define RXPD_CHAN_MASK 0x3FE0
|
||||
/** Rate control mask 15-23 */
|
||||
|
@ -2175,43 +2257,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_TDLS_Idle_Timeout_t {
|
|||
#define TXPD_RETRY_ENABLE MBIT(12)
|
||||
|
||||
/** tx_control*/
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
typedef MLAN_PACK_START struct _tx_ctrl {
|
||||
/** reserved */
|
||||
t_u32 reserved : 3;
|
||||
/** mc retry packet */
|
||||
t_u32 mc_pkt_retry : 1;
|
||||
/** end of mc AMPDU */
|
||||
t_u32 mc_ampdu_end : 1;
|
||||
/** start of mc AMPDU */
|
||||
t_u32 mc_ampdu_start : 1;
|
||||
/** End of mc cycle */
|
||||
t_u32 mc_cycle_end : 1;
|
||||
/** start of mc cycle */
|
||||
t_u32 mc_cycle_start : 1;
|
||||
/** bw 0-20MHz, 1-40MHz */
|
||||
t_u32 bw : 3;
|
||||
/** Rate used for transmission MCS0-7*/
|
||||
t_u32 tx_rate : 5;
|
||||
/** Control the use of txRate. 0 - use FW setting, 1 - use the specified
|
||||
* txRate;*/
|
||||
t_u32 host_txrate_ctrl : 1;
|
||||
/** 0/1 - use FW setting, 2 - ACK_IMMD, 3 - NO_ACK.*/
|
||||
t_u32 ack_policy : 2;
|
||||
/** Control the use of retryLimit. 0 - use FW setting, 1 - use the
|
||||
* specified retryLimit.*/
|
||||
t_u32 host_retry_ctrl : 1;
|
||||
/** retry limit */
|
||||
t_u32 retry_limit : 4;
|
||||
/** Control the use of txPower. 0 - use FW power setting, 1 - use the
|
||||
* specified txPower.*/
|
||||
t_u32 host_tx_powerctrl : 1;
|
||||
/** Sign of the txPower, 0 - positive_sign(+), 1 - negative_sign(-). */
|
||||
t_u32 tx_power_sign : 1;
|
||||
/** Power used for transmission(in dBm); */
|
||||
t_u32 tx_power : 6;
|
||||
} MLAN_PACK_END tx_ctrl;
|
||||
#else
|
||||
typedef MLAN_PACK_START struct _tx_ctrl {
|
||||
/** Power used for transmission(in dBm); */
|
||||
t_u32 tx_power : 6;
|
||||
|
@ -2247,7 +2292,14 @@ typedef MLAN_PACK_START struct _tx_ctrl {
|
|||
/** reserved */
|
||||
t_u32 reserved : 3;
|
||||
} MLAN_PACK_END tx_ctrl;
|
||||
#endif
|
||||
|
||||
/** mc tx ctrl */
|
||||
typedef MLAN_PACK_START struct _mc_tx_ctrl {
|
||||
/** mc seq */
|
||||
t_u16 mc_seq;
|
||||
/** abs_tsf_expirytime*/
|
||||
t_u32 abs_tsf_expirytime;
|
||||
} MLAN_PACK_END mc_tx_ctrl;
|
||||
|
||||
/** TxPD descriptor */
|
||||
typedef MLAN_PACK_START struct _TxPD {
|
||||
|
@ -2322,32 +2374,6 @@ typedef MLAN_PACK_START struct _RxPD {
|
|||
} MLAN_PACK_END RxPD, *PRxPD;
|
||||
|
||||
/** IEEEtypes_FrameCtl_t*/
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_FrameCtl_t {
|
||||
/** Order */
|
||||
t_u8 order : 1;
|
||||
/** Wep */
|
||||
t_u8 wep : 1;
|
||||
/** More Data */
|
||||
t_u8 more_data : 1;
|
||||
/** Power Mgmt */
|
||||
t_u8 pwr_mgmt : 1;
|
||||
/** Retry */
|
||||
t_u8 retry : 1;
|
||||
/** More Frag */
|
||||
t_u8 more_frag : 1;
|
||||
/** From DS */
|
||||
t_u8 from_ds : 1;
|
||||
/** To DS */
|
||||
t_u8 to_ds : 1;
|
||||
/** Sub Type */
|
||||
t_u8 sub_type : 4;
|
||||
/** Type */
|
||||
t_u8 type : 2;
|
||||
/** Protocol Version */
|
||||
t_u8 protocol_version : 2;
|
||||
} MLAN_PACK_END IEEEtypes_FrameCtl_t;
|
||||
#else
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_FrameCtl_t {
|
||||
/** Protocol Version */
|
||||
t_u8 protocol_version : 2;
|
||||
|
@ -2372,7 +2398,6 @@ typedef MLAN_PACK_START struct _IEEEtypes_FrameCtl_t {
|
|||
/** Order */
|
||||
t_u8 order : 1;
|
||||
} MLAN_PACK_END IEEEtypes_FrameCtl_t;
|
||||
#endif
|
||||
|
||||
/** MrvlIETypes_MgmtFrameSet_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIETypes_MgmtFrameSet_t {
|
||||
|
@ -2465,7 +2490,7 @@ typedef MLAN_PACK_START struct _chan_power_11d {
|
|||
/** 11D channel */
|
||||
t_u8 chan;
|
||||
/** Band for channel */
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
/** 11D channel power */
|
||||
t_u8 pwr;
|
||||
/** AP seen on channel */
|
||||
|
@ -2483,24 +2508,6 @@ typedef MLAN_PACK_START struct _parsed_region_chan_11d {
|
|||
|
||||
/** ChanScanMode_t */
|
||||
typedef MLAN_PACK_START struct _ChanScanMode_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved_7 : 1;
|
||||
/** First passive scan then active scan */
|
||||
t_u8 passive_to_active_scan : 1;
|
||||
/** First channel in scan */
|
||||
t_u8 first_chan : 1;
|
||||
/** Enable hidden ssid report */
|
||||
t_u8 hidden_ssid_report : 1;
|
||||
/** Enable probe response timeout */
|
||||
t_u8 rsp_timeout_en : 1;
|
||||
/** Multidomain scan mode */
|
||||
t_u8 multidomain_scan : 1;
|
||||
/** Disble channel filtering flag */
|
||||
t_u8 disable_chan_filt : 1;
|
||||
/** Channel scan mode passive flag */
|
||||
t_u8 passive_scan : 1;
|
||||
#else
|
||||
/** Channel scan mode passive flag */
|
||||
t_u8 passive_scan : 1;
|
||||
/** Disble channel filtering flag */
|
||||
|
@ -2517,7 +2524,6 @@ typedef MLAN_PACK_START struct _ChanScanMode_t {
|
|||
t_u8 passive_to_active_scan : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved_7 : 1;
|
||||
#endif
|
||||
} MLAN_PACK_END ChanScanMode_t;
|
||||
|
||||
/** ChanScanParamSet_t */
|
||||
|
@ -2974,50 +2980,24 @@ typedef MLAN_PACK_START struct _HostCmd_DS_GTK_REKEY_PARAMS {
|
|||
|
||||
/** Data structure of WMM QoS information */
|
||||
typedef MLAN_PACK_START struct _WmmQosInfo_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
#else
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END WmmQosInfo_t, *pWmmQosInfo_t;
|
||||
|
||||
/** Data structure of WMM ECW */
|
||||
typedef MLAN_PACK_START struct _WmmEcw_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
#else
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END WmmEcw_t, *pWmmEcw_t;
|
||||
|
||||
/** Data structure of WMM Aci/Aifsn */
|
||||
typedef MLAN_PACK_START struct _WmmAciAifsn_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
/** Aci */
|
||||
t_u8 aci : 2;
|
||||
/** Acm */
|
||||
t_u8 acm : 1;
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
#else
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
/** Acm */
|
||||
|
@ -3026,7 +3006,6 @@ typedef MLAN_PACK_START struct _WmmAciAifsn_t {
|
|||
t_u8 aci : 2;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END WmmAciAifsn_t, *pWmmAciAifsn_t;
|
||||
|
||||
/** Data structure of WMM AC parameters */
|
||||
|
@ -3497,6 +3476,33 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_RSSI_EXT_t {
|
|||
t_s16 bcn_nf_avg;
|
||||
} MLAN_PACK_END MrvlIEtypes_RSSI_EXT_t;
|
||||
|
||||
/** HostCmd_DS_CMD_MC_AGGR_CFG */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_MC_AGGR_CFG {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** Reserved field 1 */
|
||||
t_u16 reserved_1;
|
||||
/* 1 enable, 0 disable
|
||||
* bit 0 MC aggregation
|
||||
* bit 1 packet expiry
|
||||
* bit 2 CTS2Self
|
||||
* bit 3 CTS2Self duration offset*/
|
||||
t_u8 enable_bitmap;
|
||||
/* 1 valid, 0 invalid
|
||||
* bit 0 MC aggregation
|
||||
* bit 1 packet expiry
|
||||
* bit 2 CTS2Self
|
||||
* bit 3 CTS2Self duration offset*/
|
||||
t_u8 mask_bitmap;
|
||||
/** CTS2Self duration offset */
|
||||
t_u16 cts2self_offset;
|
||||
} MLAN_PACK_END HostCmd_DS_MC_AGGR_CFG;
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_GET_CH_LOAD {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
t_u16 ch_load;
|
||||
} MLAN_PACK_END HostCmd_DS_GET_CH_LOAD;
|
||||
|
||||
/** HostCmd_DS_CMD_802_11_RSSI_INFO */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_RSSI_INFO {
|
||||
/** Action */
|
||||
|
@ -3553,6 +3559,18 @@ typedef MLAN_PACK_START struct _HostCmd_DS_MAC_CONTROL {
|
|||
t_u32 action;
|
||||
} MLAN_PACK_END HostCmd_DS_MAC_CONTROL;
|
||||
|
||||
/** HostCmd_DS_802_11_NET_MONITOR */
|
||||
typedef MLAN_PACK_START struct _HostCmd_802_11_DS_NET_MONITOR {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** Enable/disable net monitor */
|
||||
t_u16 enable_net_mon;
|
||||
/** set net monitor filer flag */
|
||||
t_u16 filter_flag;
|
||||
/** Channel to monitor */
|
||||
MrvlIEtypes_ChanBandListParamSet_t monitor_chan;
|
||||
} MLAN_PACK_END HostCmd_DS_802_11_NET_MONITOR;
|
||||
|
||||
/** HostCmd_DS_CMD_TX_DATA_PAUSE */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_CMD_TX_DATA_PAUSE {
|
||||
/** Action */
|
||||
|
@ -4246,6 +4264,22 @@ typedef MLAN_PACK_START struct _HostCmd_DS_SSU_CFG {
|
|||
} MLAN_PACK_END HostCmd_DS_SSU_CFG;
|
||||
#endif
|
||||
|
||||
/** HostCmd_CMD_CSI_START */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_CSI_CFG {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** Header ID*/
|
||||
t_u32 head_id;
|
||||
/** Tail ID */
|
||||
t_u32 tail_id;
|
||||
/** Number of CSI filters */
|
||||
t_u8 csi_filter_cnt;
|
||||
/** Chip ID */
|
||||
t_u8 chip_id;
|
||||
/** CSI filters */
|
||||
mlan_csi_filter_t csi_filter[CSI_FILTER_MAX];
|
||||
} MLAN_PACK_END HostCmd_DS_CSI_CFG;
|
||||
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_HAL_PHY_CFG {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
|
@ -4271,6 +4305,8 @@ typedef enum _SNMP_MIB_INDEX {
|
|||
SignalextEnable_i = 41,
|
||||
ECSAEnable_i = 42,
|
||||
StopDeauth_i = 44,
|
||||
Dot11H_fakeRadar = 45,
|
||||
ChanTrackParam_i = 46,
|
||||
} SNMP_MIB_INDEX;
|
||||
|
||||
/** max SNMP buf size */
|
||||
|
@ -5223,15 +5259,9 @@ typedef MLAN_PACK_START struct {
|
|||
*/
|
||||
typedef MLAN_PACK_START struct {
|
||||
mlan_wmm_queue_stats_action_e action; /**< Start, Stop, or Get */
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u8 select_bin : 7; /**< WMM_AC_BK(0) to WMM_AC_VO(3), or TID */
|
||||
t_u8 select_is_userpri : 1; /**< Set if select_bin is UP, Clear for AC
|
||||
*/
|
||||
#else
|
||||
t_u8 select_is_userpri : 1; /**< Set if select_bin is UP, Clear for AC
|
||||
*/
|
||||
t_u8 select_bin : 7; /**< WMM_AC_BK(0) to WMM_AC_VO(3), or TID */
|
||||
#endif
|
||||
t_u16 pkt_count; /**< Number of successful packets transmitted */
|
||||
t_u16 pkt_loss; /**< Packets lost; not included in pktCount */
|
||||
t_u32 avg_queue_delay; /**< Average Queue delay in microsec */
|
||||
|
@ -5858,6 +5888,20 @@ typedef MLAN_PACK_START struct _HostCmd_DS_MEM_ACCESS {
|
|||
t_u32 value;
|
||||
} MLAN_PACK_END HostCmd_DS_MEM_ACCESS;
|
||||
|
||||
/** HostCmd_CMD_REG_ACCESS */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_REG_ACCESS {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** reg type */
|
||||
t_u16 reg_type;
|
||||
/** reserved */
|
||||
t_u16 reserved;
|
||||
/** register offset */
|
||||
t_u16 offset;
|
||||
/** register value */
|
||||
t_u32 value;
|
||||
} MLAN_PACK_END HostCmd_DS_REG_ACCESS;
|
||||
|
||||
/** HostCmd_DS_TARGET_ACCESS */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_TARGET_ACCESS {
|
||||
/** Action */
|
||||
|
@ -6313,7 +6357,11 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_action_chan_switch_t {
|
|||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/* 0 send broadcast CSA action frame, 1 send unicast CSA action frame */
|
||||
t_u32 mode;
|
||||
t_u8 mode;
|
||||
/* number of frame */
|
||||
t_u8 num_pkt;
|
||||
/** reserved */
|
||||
t_u16 reserved;
|
||||
/**ie buf*/
|
||||
t_u8 ie_buf[];
|
||||
} MLAN_PACK_END MrvlIEtypes_action_chan_switch_t;
|
||||
|
@ -6408,6 +6456,10 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_auth_type_t {
|
|||
MrvlIEtypesHeader_t header;
|
||||
/** Authentication type */
|
||||
t_u8 auth_type;
|
||||
/** PWE derivation */
|
||||
t_u8 PWE_derivation;
|
||||
/** transition disable */
|
||||
t_u8 transition_disable;
|
||||
} MLAN_PACK_END MrvlIEtypes_auth_type_t;
|
||||
|
||||
/** MrvlIEtypes_encrypt_protocol_t */
|
||||
|
@ -6751,6 +6803,111 @@ typedef MLAN_PACK_START struct _HostCmd_DS_RX_PKT_COAL_CFG {
|
|||
} MLAN_PACK_END HostCmd_DS_RX_PKT_COAL_CFG;
|
||||
#endif
|
||||
|
||||
/** TLV buffer : firmware roam keys */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_keyParams_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Tlv buffer */
|
||||
t_u8 tlv_buffer[];
|
||||
} MLAN_PACK_END MrvlIEtypes_keyParams_t;
|
||||
|
||||
/** TLV buffer : firmware roam enable */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_fw_roam_enable_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Enable */
|
||||
t_u8 roam_enable;
|
||||
/** User set passphrase*/
|
||||
t_u8 userset_passphrase;
|
||||
} MLAN_PACK_END MrvlIEtypes_fw_roam_enable_t;
|
||||
/** HostCmd_DS_ROAM_OFFLOAD */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_ROAM_OFFLOAD {
|
||||
/** Action */
|
||||
t_u16 action;
|
||||
/** tlv */
|
||||
t_u8 tlv[];
|
||||
} MLAN_PACK_END HostCmd_DS_ROAM_OFFLOAD;
|
||||
/** HostCmd_DS_ROAM_OFFLOAD_APLIST */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_roam_aplist_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** AP mac addrs**/
|
||||
t_u8 ap_mac[][MLAN_MAC_ADDR_LENGTH];
|
||||
} MLAN_PACK_END MrvlIEtypes_roam_aplist_t;
|
||||
/** MrvlIEtypes_fw_roam_trigger_condition_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_fw_roam_trigger_condition_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Roam offload trigger condition**/
|
||||
t_u16 trigger_condition;
|
||||
} MLAN_PACK_END MrvlIEtypes_fw_roam_trigger_condition_t;
|
||||
/** MrvlIEtypes_fw_roam_retry_count_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_fw_roam_retry_count_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Roam offload retry count**/
|
||||
t_u16 retry_count;
|
||||
} MLAN_PACK_END MrvlIEtypes_fw_roam_retry_count_t;
|
||||
/** MrvlIEtypes_fw_roam_bgscan_setting_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_fw_roam_bgscan_setting_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Bss type of BG scan during fw roam**/
|
||||
t_u8 bss_type;
|
||||
/** Number of channels scanned during each scan**/
|
||||
t_u8 channels_perscan;
|
||||
/** Interval between consecutive scans**/
|
||||
t_u32 scan_interval;
|
||||
/** Condition to trigger report to host**/
|
||||
t_u32 report_condition;
|
||||
} MLAN_PACK_END MrvlIEtypes_fw_roam_bgscan_setting_t;
|
||||
/** MrvlIEtypes_para_rssi_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_para_rssi_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Max value of RSSI threshold**/
|
||||
t_u8 max_rssi;
|
||||
/** Min value of RSSI threshold**/
|
||||
t_u8 min_rssi;
|
||||
/** Adjusting step value of RSSI threshold**/
|
||||
t_u8 step_rssi;
|
||||
} MLAN_PACK_END MrvlIEtypes_para_rssi_t;
|
||||
/** MrvlIEtypes_band_rssi_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_band_rssi_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** BAND and RSSI gap*/
|
||||
mlan_ds_misc_band_rssi band_rssi;
|
||||
} MLAN_PACK_END MrvlIEtypes_band_rssi_t;
|
||||
/** MrvlIEtypes_ees_param_set_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_ees_param_set_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** ees params*/
|
||||
mlan_ds_misc_ees_cfg ees_cfg;
|
||||
} MLAN_PACK_END MrvlIEtypes_ees_param_set_t;
|
||||
/** MrvlIEtypes_roam_blacklist_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_roam_blacklist_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/* Black list(BSSID list)*/
|
||||
mlan_ds_misc_roam_offload_aplist blacklist;
|
||||
} MLAN_PACK_END MrvlIEtypes_roam_blacklist_t;
|
||||
/** MrvlIEtypes_beacon_miss_threshold_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_beacon_miss_threshold_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 bcn_miss_threshold;
|
||||
} MLAN_PACK_END MrvlIEtypes_beacon_miss_threshold_t;
|
||||
/** MrvlIEtypes_pre_beacon_miss_threshold_t */
|
||||
typedef MLAN_PACK_START struct _MrvlIEtypes_pre_beacon_miss_threshold_t {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/* Pre-Beacon miss threshold*/
|
||||
t_u8 pre_bcn_miss_threshold;
|
||||
} MLAN_PACK_END MrvlIEtypes_pre_beacon_miss_threshold_t;
|
||||
|
||||
/** HostCmd_DS_DYN_BW */
|
||||
typedef MLAN_PACK_START struct _HostCmd_DS_DYN_BW {
|
||||
/** Action */
|
||||
|
@ -6933,20 +7090,6 @@ typedef MLAN_PACK_START enum _MeasType_t {
|
|||
* @brief Mode octet of the measurement request element (7.3.2.21)
|
||||
*/
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/**< Reserved */
|
||||
t_u8 rsvd5_7 : 3;
|
||||
/**< 11k: duration spec. for meas. is mandatory */
|
||||
t_u8 duration_mandatory : 1;
|
||||
/**< 11h: en/disable report rcpt. of spec. type */
|
||||
t_u8 report : 1;
|
||||
/**< 11h: en/disable requests of specified type */
|
||||
t_u8 request : 1;
|
||||
/**< 11h: enable report/request bits */
|
||||
t_u8 enable : 1;
|
||||
/**< 11k: series or parallel with previous meas */
|
||||
t_u8 parallel : 1;
|
||||
#else
|
||||
/**< 11k: series or parallel with previous meas */
|
||||
t_u8 parallel : 1;
|
||||
/**< 11h: enable report/request bits */
|
||||
|
@ -6959,7 +7102,6 @@ typedef MLAN_PACK_START struct {
|
|||
t_u8 duration_mandatory : 1;
|
||||
/**< Reserved */
|
||||
t_u8 rsvd5_7 : 3;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
} MLAN_PACK_END MeasReqMode_t;
|
||||
|
||||
|
@ -7004,17 +7146,10 @@ typedef union {
|
|||
* @brief Mode octet of the measurement report element (7.3.2.22)
|
||||
*/
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u8 rsvd3_7 : 5; /**< Reserved */
|
||||
t_u8 refused : 1; /**< Measurement refused */
|
||||
t_u8 incapable : 1; /**< Incapable of performing measurement */
|
||||
t_u8 late : 1; /**< Start TSF time missed for measurement */
|
||||
#else
|
||||
t_u8 late : 1; /**< Start TSF time missed for measurement */
|
||||
t_u8 incapable : 1; /**< Incapable of performing measurement */
|
||||
t_u8 refused : 1; /**< Measurement refused */
|
||||
t_u8 rsvd3_7 : 5; /**< Reserved */
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
} MLAN_PACK_END MeasRptMode_t;
|
||||
|
||||
|
@ -7146,6 +7281,15 @@ typedef MLAN_PACK_START struct {
|
|||
MeasRptBasicMap_t map; /**< IEEE 802.11h basic meas report */
|
||||
} MLAN_PACK_END MrvlIEtypes_ChanRpt11hBasic_t;
|
||||
|
||||
/* MrvlIEtypes_ZeroDfsOperation_t */
|
||||
typedef MLAN_PACK_START struct {
|
||||
/* header */
|
||||
MrvlIEtypesHeader_t Header;
|
||||
/**< 0-DFS Enable/Disable> */
|
||||
t_u8 zero_dfs_enbl;
|
||||
|
||||
} MLAN_PACK_END MrvlIEtypes_ZeroDfsOperation_t;
|
||||
|
||||
/* MrvlIEtypes_DfsW53Cfg_t*/
|
||||
typedef MLAN_PACK_START struct {
|
||||
/* header */
|
||||
|
@ -7154,6 +7298,16 @@ typedef MLAN_PACK_START struct {
|
|||
t_u8 dfs53cfg;
|
||||
} MLAN_PACK_END MrvlIEtypes_DfsW53Cfg_t;
|
||||
|
||||
/* MrvlIEtypes_Rgn_dom_code_t*/
|
||||
typedef MLAN_PACK_START struct {
|
||||
/* header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Domain Code */
|
||||
t_u8 domain_code;
|
||||
/** Reserved field */
|
||||
t_u8 reserved;
|
||||
} MLAN_PACK_END MrvlIEtypes_Rgn_dom_code_t;
|
||||
|
||||
typedef MLAN_PACK_START struct {
|
||||
MrvlChannelDesc_t chan_desc; /**< Channel band, number */
|
||||
t_u32 millisec_dwell_time; /**< Channel dwell time in milliseconds */
|
||||
|
@ -7736,6 +7890,8 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
HostCmd_DS_TARGET_ACCESS target;
|
||||
/** BCA register access */
|
||||
HostCmd_DS_BCA_REG_ACCESS bca_reg;
|
||||
/** register access */
|
||||
HostCmd_DS_REG_ACCESS reg;
|
||||
/** Inactivity timeout extend */
|
||||
HostCmd_DS_INACTIVITY_TIMEOUT_EXT inactivity_to;
|
||||
#ifdef UAP_SUPPORT
|
||||
|
@ -7760,6 +7916,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
HostCmd_DS_SDIO_PULL_CTRL sdio_pull_ctl;
|
||||
#endif
|
||||
HostCmd_DS_SET_BSS_MODE bss_mode;
|
||||
HostCmd_DS_802_11_NET_MONITOR net_mon;
|
||||
HostCmd_DS_CMD_TX_DATA_PAUSE tx_data_pause;
|
||||
#if defined(PCIE)
|
||||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
|
@ -7795,6 +7952,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
/** GPIO Independent reset configure */
|
||||
HostCmd_DS_INDEPENDENT_RESET_CFG ind_rst_cfg;
|
||||
HostCmd_DS_802_11_PS_INACTIVITY_TIMEOUT ps_inact_tmo;
|
||||
HostCmd_DS_ROAM_OFFLOAD roam_offload;
|
||||
HostCmd_DS_CHAN_REGION_CFG reg_cfg;
|
||||
HostCmd_DS_AUTO_TX auto_tx;
|
||||
HostCmd_DS_DYN_BW dyn_bw;
|
||||
|
@ -7803,6 +7961,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
#if defined(PCIE)
|
||||
HostCmd_DS_SSU_CFG ssu_params;
|
||||
#endif
|
||||
HostCmd_DS_CSI_CFG csi_params;
|
||||
/** boot sleep configure */
|
||||
HostCmd_DS_BOOT_SLEEP boot_sleep;
|
||||
#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
|
||||
|
@ -7839,6 +7998,8 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
|
|||
HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG dot11mc_unassoc_ftm_cfg;
|
||||
HostCmd_DS_HAL_PHY_CFG hal_phy_cfg_params;
|
||||
HostCmd_DS_IPS_CONFIG ips_cfg;
|
||||
HostCmd_DS_MC_AGGR_CFG mc_aggr_cfg;
|
||||
HostCmd_DS_GET_CH_LOAD ch_load;
|
||||
} params;
|
||||
} MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND;
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* definitions used in MLAN and MOAL module.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -46,17 +46,10 @@ typedef enum _WLAN_802_11_NETWORK_TYPE {
|
|||
Wlan802_11NetworkTypeMax
|
||||
} WLAN_802_11_NETWORK_TYPE;
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Frame control: Type Mgmt frame */
|
||||
#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x3000
|
||||
/** Frame control: SubType Mgmt frame */
|
||||
#define IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(fc) (((fc)&0xF000) >> 12)
|
||||
#else
|
||||
/** Frame control: Type Mgmt frame */
|
||||
#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x000C
|
||||
/** Frame control: SubType Mgmt frame */
|
||||
#define IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(fc) (((fc)&0x00F0) >> 4)
|
||||
#endif
|
||||
|
||||
#ifdef PRAGMA_PACK
|
||||
#pragma pack(push, 1)
|
||||
|
@ -67,7 +60,8 @@ typedef enum _WLAN_802_11_NETWORK_TYPE {
|
|||
|
||||
typedef enum _IEEEtypes_Ext_ElementId_e {
|
||||
HE_CAPABILITY = 35,
|
||||
HE_OPERATION = 36
|
||||
HE_OPERATION = 36,
|
||||
HE_6G_CAPABILITY = 59
|
||||
} IEEEtypes_Ext_ElementId_e;
|
||||
|
||||
/** IEEE Type definitions */
|
||||
|
@ -178,21 +172,12 @@ typedef MLAN_PACK_START struct _IEEEtypes_Generic_t {
|
|||
|
||||
/**ft capability policy*/
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_FtCapPolicy_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 6;
|
||||
/** RIC support */
|
||||
t_u8 ric : 1;
|
||||
/** FT over the DS capable */
|
||||
t_u8 ft_over_ds : 1;
|
||||
#else
|
||||
/** FT over the DS capable */
|
||||
t_u8 ft_over_ds : 1;
|
||||
/** RIC support */
|
||||
t_u8 ric : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 6;
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_FtCapPolicy_t;
|
||||
|
||||
/** Mobility domain IE */
|
||||
|
@ -325,25 +310,6 @@ typedef MLAN_PACK_START struct _TLV_Generic_t {
|
|||
#define CAPINFO_MASK (~(MBIT(15) | MBIT(14) | MBIT(11) | MBIT(9)))
|
||||
|
||||
/** Capability Bit Map*/
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
|
||||
t_u8 rsrvd1 : 2;
|
||||
t_u8 dsss_ofdm : 1;
|
||||
t_u8 radio_measurement : 1;
|
||||
t_u8 rsvrd2 : 1;
|
||||
t_u8 short_slot_time : 1;
|
||||
t_u8 rsrvd3 : 1;
|
||||
t_u8 spectrum_mgmt : 1;
|
||||
t_u8 chan_agility : 1;
|
||||
t_u8 pbcc : 1;
|
||||
t_u8 short_preamble : 1;
|
||||
t_u8 privacy : 1;
|
||||
t_u8 cf_poll_rqst : 1;
|
||||
t_u8 cf_pollable : 1;
|
||||
t_u8 ibss : 1;
|
||||
t_u8 ess : 1;
|
||||
} MLAN_PACK_END IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
|
||||
#else
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
|
||||
/** Capability Bit Map : ESS */
|
||||
t_u8 ess : 1;
|
||||
|
@ -376,7 +342,6 @@ typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
|
|||
/** Capability Bit Map : Reserved */
|
||||
t_u8 rsrvd1 : 2;
|
||||
} MLAN_PACK_END IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
/** IEEEtypes_Ssid_t */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_Ssid_t {
|
||||
|
@ -591,35 +556,16 @@ typedef MLAN_PACK_START struct _IEEEtypes_Wpa_t {
|
|||
|
||||
/** Data structure of WMM QoS information */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_WmmQosInfo_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
#else
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END IEEEtypes_WmmQosInfo_t, *pIEEEtypes_WmmQosInfo_t;
|
||||
|
||||
/** Data structure of WMM Aci/Aifsn */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_WmmAciAifsn_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
/** Aci */
|
||||
t_u8 aci : 2;
|
||||
/** Acm */
|
||||
t_u8 acm : 1;
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
#else
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
/** Acm */
|
||||
|
@ -628,22 +574,14 @@ typedef MLAN_PACK_START struct _IEEEtypes_WmmAciAifsn_t {
|
|||
t_u8 aci : 2;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END IEEEtypes_WmmAciAifsn_t, *pIEEEtypes_WmmAciAifsn_t;
|
||||
|
||||
/** Data structure of WMM ECW */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_WmmEcw_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
#else
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END IEEEtypes_WmmEcw_t, *pIEEEtypes_WmmEcw_t;
|
||||
|
||||
/** Data structure of WMM AC parameters */
|
||||
|
@ -731,22 +669,6 @@ typedef MLAN_PACK_START enum _IEEEtypes_WMM_TSPEC_TS_TRAFFIC_TYPE_e {
|
|||
|
||||
/** Data structure of WMM TSPEC information */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u8 Reserved17_23 : 7; /* ! Reserved */
|
||||
t_u8 Schedule : 1;
|
||||
IEEEtypes_WMM_TSPEC_TS_Info_AckPolicy_e AckPolicy : 2;
|
||||
t_u8 UserPri : 3; /* ! 802.1d User Priority */
|
||||
// IEEEtypes_WMM_TSPEC_TS_Info_PSB_e PowerSaveBehavior : 1; /*
|
||||
// !Legacy/Trigg*/
|
||||
t_u8 PowerSaveBehavior : 1;
|
||||
t_u8 Aggregation : 1; /* ! Reserved */
|
||||
t_u8 AccessPolicy2 : 1; /* ! */
|
||||
t_u8 AccessPolicy1 : 1; /* ! */
|
||||
IEEEtypes_WMM_TSPEC_TS_Info_Direction_e Direction : 2;
|
||||
t_u8 TID : 4; /* ! Unique identifier */
|
||||
// IEEEtypes_WMM_TSPEC_TS_TRAFFIC_TYPE_e TrafficType : 1;
|
||||
t_u8 TrafficType : 1;
|
||||
#else
|
||||
// IEEEtypes_WMM_TSPEC_TS_TRAFFIC_TYPE_e TrafficType : 1;
|
||||
t_u8 TrafficType : 1;
|
||||
t_u8 TID : 4; /* ! Unique identifier */
|
||||
|
@ -761,31 +683,19 @@ typedef MLAN_PACK_START struct {
|
|||
IEEEtypes_WMM_TSPEC_TS_Info_AckPolicy_e AckPolicy : 2;
|
||||
t_u8 Schedule : 1;
|
||||
t_u8 Reserved17_23 : 7; /* ! Reserved */
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_WMM_TSPEC_TS_Info_t;
|
||||
|
||||
/** Data structure of WMM TSPEC Nominal Size */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u16 Fixed : 1; /* ! 1: Fixed size given in Size, 0: Var, size is
|
||||
nominal */
|
||||
t_u16 Size : 15; /* ! Nominal size in octets */
|
||||
#else
|
||||
t_u16 Size : 15; /* ! Nominal size in octets */
|
||||
t_u16 Fixed : 1; /* ! 1: Fixed size given in Size, 0: Var, size is
|
||||
nominal */
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_WMM_TSPEC_NomMSDUSize_t;
|
||||
|
||||
/** Data structure of WMM TSPEC SBWA */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u16 Whole : 3; /* ! Whole portion */
|
||||
t_u16 Fractional : 13; /* ! Fractional portion */
|
||||
#else
|
||||
t_u16 Fractional : 13; /* ! Fractional portion */
|
||||
t_u16 Whole : 3; /* ! Whole portion */
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_WMM_TSPEC_SBWA;
|
||||
|
||||
/** Data structure of WMM TSPEC Body */
|
||||
|
@ -1126,26 +1036,6 @@ typedef MLAN_PACK_START struct _VHT_MCS_set {
|
|||
/** VHT Capabilities info field, reference 802.11ac D1.4 p89 */
|
||||
typedef MLAN_PACK_START struct _VHT_capa {
|
||||
#if 0
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u8 mpdu_max_len:2;
|
||||
t_u8 chan_width:2;
|
||||
t_u8 rx_LDPC:1;
|
||||
t_u8 sgi_80:1;
|
||||
t_u8 sgi_160:1;
|
||||
t_u8 tx_STBC:1;
|
||||
t_u8 rx_STBC:3;
|
||||
t_u8 SU_beamformer_capa:1;
|
||||
t_u8 SU_beamformee_capa:1;
|
||||
t_u8 beamformer_ante_num:3;
|
||||
t_u8 sounding_dim_num:3;
|
||||
t_u8 MU_beamformer_capa:1;
|
||||
t_u8 MU_beamformee_capa:1;
|
||||
t_u8 VHT_TXOP_ps:1;
|
||||
t_u8 HTC_VHT_capa:1;
|
||||
t_u8 max_ampdu_len:3;
|
||||
t_u8 link_apapt_capa:2;
|
||||
t_u8 reserved_1:4;
|
||||
#else
|
||||
t_u8 reserved_1:4;
|
||||
t_u8 link_apapt_capa:2;
|
||||
t_u8 max_ampdu_len:3;
|
||||
|
@ -1164,7 +1054,6 @@ typedef MLAN_PACK_START struct _VHT_capa {
|
|||
t_u8 rx_LDPC:1;
|
||||
t_u8 chan_width:2;
|
||||
t_u8 mpdu_max_len:2;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
#endif
|
||||
t_u32 vht_cap_info;
|
||||
VHT_MCS_set_t mcs_sets;
|
||||
|
@ -1272,6 +1161,32 @@ typedef MLAN_PACK_START struct _IEEEtypes_Extension_t {
|
|||
t_u8 data[];
|
||||
} MLAN_PACK_END IEEEtypes_Extension_t, *pIEEEtypes_Extension_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeMcsMap_t {
|
||||
/** Max HE-MAC for 1 SS */
|
||||
t_u8 max_mcs_1ss : 2;
|
||||
/** Max HE-MAC for 2 SS */
|
||||
t_u8 max_mcs_2ss : 2;
|
||||
/** Max HE-MAC for 3 SS */
|
||||
t_u8 max_mcs_3ss : 2;
|
||||
/** Max HE-MAC for 4 SS */
|
||||
t_u8 max_mcs_4ss : 2;
|
||||
/** Max HE-MAC for 5 SS */
|
||||
t_u8 max_mcs_5ss : 2;
|
||||
/** Max HE-MAC for 6 SS */
|
||||
t_u8 max_mcs_6ss : 2;
|
||||
/** Max HE-MAC for 7 SS */
|
||||
t_u8 max_mcs_7ss : 2;
|
||||
/** Max HE-MAC for 8 SS */
|
||||
t_u8 max_mcs_8ss : 2;
|
||||
} MLAN_PACK_END IEEEtypes_HeMcsMap_t, *pIEEEtypes_HeMcsMap_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeMcsNss_t {
|
||||
/** HE Rx MCS and NSS Set */
|
||||
t_u16 rx_mcs;
|
||||
/** HE Tx MCS and NSS Set*/
|
||||
t_u16 tx_mcs;
|
||||
} MLAN_PACK_END IEEEtypes_HeMcsNss_t, *pIEEEtypes_HeMcsNss_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HECap_t {
|
||||
/** Generic IE header */
|
||||
IEEEtypes_Header_t ieee_hdr;
|
||||
|
@ -1281,11 +1196,55 @@ typedef MLAN_PACK_START struct _IEEEtypes_HECap_t {
|
|||
t_u8 he_mac_cap[6];
|
||||
/** he phy capability info */
|
||||
t_u8 he_phy_cap[11];
|
||||
/** he txrx mcs support , size would be 4 or 8 or 12 */
|
||||
/** he txrx mcs support (for 80 MHz) */
|
||||
t_u8 he_txrx_mcs_support[4];
|
||||
/** PPE Thresholds (optional) */
|
||||
/** Optional Field, including he_txrx_mcs_support for 160 and 80+80 MHz,
|
||||
* and PPE Thresholds */
|
||||
t_u8 option[28];
|
||||
} MLAN_PACK_END IEEEtypes_HECap_t, *pIEEEtypes_HECap_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeOpParam_t {
|
||||
/** Default PE Duration */
|
||||
t_u16 default_pe_dur : 3; /* bit 0-2 */
|
||||
/** TWT Required */
|
||||
t_u16 twt_req : 1; /* bit 3 */
|
||||
/** TXOP Duration RTS Threshold */
|
||||
t_u16 txop_dur_rts_threshold : 10; /* bit 4-13 */
|
||||
/** VHT Operation Info Present */
|
||||
t_u16 vht_op_info_present : 1; /* bit 14 */
|
||||
/** Co-Hosted BSS */
|
||||
t_u16 co_located_bss : 1; /* bit 15 */
|
||||
/** ER SU Disable */
|
||||
t_u8 er_su_disable : 1; /* bit 16 */
|
||||
/** Reserved, including 6G Operation Info Pressent (bit17) */
|
||||
t_u8 reserved : 7; /* bit 17-23 */
|
||||
} MLAN_PACK_END IEEEtypes_HeOpParam_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeBssColorInfo_t {
|
||||
/** BSS Color */
|
||||
t_u8 bss_color : 6; /* bit 0-5 */
|
||||
/** Partial BSS Color */
|
||||
t_u8 partial_bss_color : 1; /* bit 6 */
|
||||
/** BSS Color Disabled */
|
||||
t_u8 bss_color_disabled : 1; /* bit 7 */
|
||||
} MLAN_PACK_END IEEEtypes_HeBssColorInfo_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeOp_t {
|
||||
/** Generic IE header */
|
||||
IEEEtypes_Header_t ieee_hdr;
|
||||
/** Element id extension */
|
||||
t_u8 ext_id;
|
||||
/** HE Operation Parameters */
|
||||
IEEEtypes_HeOpParam_t he_op_param;
|
||||
/** BSS Color Info */
|
||||
IEEEtypes_HeBssColorInfo_t bss_color_info;
|
||||
/** Basic HE-MCS and NSS Set */
|
||||
IEEEtypes_HeMcsMap_t basic_he_mcs_nss;
|
||||
/** Optional Field, including VHT Operation Info Max Co-Hosted BSSID
|
||||
* Indicator, and 6Ghz Operation Info */
|
||||
t_u8 option[9];
|
||||
} MLAN_PACK_END IEEEtypes_HeOp_t;
|
||||
|
||||
/** default channel switch count */
|
||||
#define DEF_CHAN_SWITCH_COUNT 5
|
||||
|
||||
|
@ -1321,7 +1280,7 @@ typedef MLAN_PACK_START struct {
|
|||
} MLAN_PACK_END IEEEtypes_ExtChanSwitchAnn_t;
|
||||
|
||||
/** Maximum number of subbands in the IEEEtypes_SupportedChannels_t structure */
|
||||
#define WLAN_11H_MAX_SUBBANDS 5
|
||||
#define WLAN_11H_MAX_SUBBANDS 6
|
||||
/** Maximum number of DFS channels configured in IEEEtypes_IBSS_DFS_t */
|
||||
#define WLAN_11H_MAX_IBSS_DFS_CHANNELS 25
|
||||
|
||||
|
@ -1429,20 +1388,6 @@ typedef MLAN_PACK_START struct {
|
|||
*** @brief Map octet of the basic measurement report (7.3.2.22.1)
|
||||
**/
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/**< Reserved */
|
||||
t_u8 rsvd5_7 : 3;
|
||||
/**< Channel is unmeasured */
|
||||
t_u8 unmeasured : 1;
|
||||
/**< Radar detected on channel */
|
||||
t_u8 radar : 1;
|
||||
/**< Unidentified signal found on channel */
|
||||
t_u8 unidentified_sig : 1;
|
||||
/**< OFDM preamble detected on channel */
|
||||
t_u8 ofdm_preamble : 1;
|
||||
/**< At least one valid MPDU received on channel */
|
||||
t_u8 bss : 1;
|
||||
#else
|
||||
/**< At least one valid MPDU received on channel */
|
||||
t_u8 bss : 1;
|
||||
/**< OFDM preamble detected on channel */
|
||||
|
@ -1455,7 +1400,6 @@ typedef MLAN_PACK_START struct {
|
|||
t_u8 unmeasured : 1;
|
||||
/**< Reserved */
|
||||
t_u8 rsvd5_7 : 3;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
} MLAN_PACK_END MeasRptBasicMap_t;
|
||||
|
||||
|
|
|
@ -240,9 +240,10 @@ mlan_status wlan_allocate_adapter(pmlan_adapter pmadapter)
|
|||
t_u32 buf_size;
|
||||
BSSDescriptor_t *ptemp_scan_table = MNULL;
|
||||
t_u8 chan_2g[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
|
||||
t_u8 chan_5g[] = {12, 16, 34, 38, 42, 46, 36, 40, 44, 48, 52,
|
||||
56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128,
|
||||
132, 136, 140, 144, 149, 153, 157, 161, 165};
|
||||
t_u8 chan_5g[] = {12, 16, 34, 38, 42, 46, 36, 40, 44,
|
||||
48, 52, 56, 60, 64, 100, 104, 108, 112,
|
||||
116, 120, 124, 128, 132, 136, 140, 144, 149,
|
||||
153, 157, 161, 165, 169, 173, 177};
|
||||
#endif
|
||||
#ifdef SDIO
|
||||
t_u32 max_mp_regs = 0;
|
||||
|
@ -603,6 +604,7 @@ mlan_status wlan_init_priv(pmlan_private priv)
|
|||
priv->hotspot_cfg = 0;
|
||||
|
||||
priv->intf_hr_len = pmadapter->ops.intf_header_len;
|
||||
memset(pmadapter, &priv->chan_rep_req, 0, sizeof(priv->chan_rep_req));
|
||||
#ifdef USB
|
||||
if (IS_USB(pmadapter->card_type)) {
|
||||
pusb_tx_aggr =
|
||||
|
@ -722,6 +724,8 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter)
|
|||
pmadapter->last_init_cmd = 0;
|
||||
pmadapter->pending_ioctl = MFALSE;
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pmadapter->fw_roaming = MFALSE;
|
||||
pmadapter->userset_passphrase = MFALSE;
|
||||
pmadapter->cmd_timer_is_set = MFALSE;
|
||||
pmadapter->dnld_cmd_in_secs = 0;
|
||||
|
||||
|
@ -957,7 +961,7 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter)
|
|||
EVT_RW_PTR_ROLLOVER_IND;
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
pmadapter->pcard_pcie->rxbd_wrptr =
|
||||
pmadapter->pcard_pcie->txrx_bd_size;
|
||||
|
@ -1154,7 +1158,10 @@ mlan_status wlan_init_lock_list(pmlan_adapter pmadapter)
|
|||
util_init_list_head((t_void *)pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q, MTRUE,
|
||||
pmadapter->callbacks.moal_init_lock);
|
||||
|
||||
/* Initialize ext_cmd_pending_q */
|
||||
util_init_list_head((t_void *)pmadapter->pmoal_handle,
|
||||
&pmadapter->ext_cmd_pending_q, MTRUE,
|
||||
pmadapter->callbacks.moal_init_lock);
|
||||
/* Initialize ioctl_pending_q */
|
||||
util_init_list_head((t_void *)pmadapter->pmoal_handle,
|
||||
&pmadapter->ioctl_pending_q, MTRUE,
|
||||
|
@ -1246,6 +1253,10 @@ t_void wlan_free_lock_list(pmlan_adapter pmadapter)
|
|||
&pmadapter->scan_pending_q,
|
||||
pmadapter->callbacks.moal_free_lock);
|
||||
|
||||
util_free_list_head((t_void *)pmadapter->pmoal_handle,
|
||||
&pmadapter->ext_cmd_pending_q,
|
||||
pmadapter->callbacks.moal_free_lock);
|
||||
|
||||
util_free_list_head((t_void *)pmadapter->pmoal_handle,
|
||||
&pmadapter->ioctl_pending_q,
|
||||
pmadapter->callbacks.moal_free_lock);
|
||||
|
@ -1896,7 +1907,9 @@ static mlan_status wlan_init_interface(pmlan_adapter pmadapter)
|
|||
pmadapter->priv[i]->bss_role =
|
||||
MLAN_BSS_ROLE_STA;
|
||||
else if (pmadapter->bss_attr[i].bss_type ==
|
||||
MLAN_BSS_TYPE_UAP)
|
||||
MLAN_BSS_TYPE_UAP ||
|
||||
pmadapter->bss_attr[i].bss_type ==
|
||||
MLAN_BSS_TYPE_DFS)
|
||||
pmadapter->priv[i]->bss_role =
|
||||
MLAN_BSS_ROLE_UAP;
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* structures.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -104,22 +104,9 @@ typedef MLAN_PACK_START struct _FWSyncPkt {
|
|||
t_u32 fw_ready;
|
||||
} MLAN_PACK_END FWSyncPkt;
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Convert sequence number and command fields
|
||||
* of fwheader to correct endian format
|
||||
*/
|
||||
#define endian_convert_syncfwheader(x) \
|
||||
{ \
|
||||
(x)->cmd = wlan_le32_to_cpu((x)->cmd); \
|
||||
(x)->seq_num = wlan_le32_to_cpu((x)->seq_num); \
|
||||
(x)->status = wlan_le32_to_cpu((x)->status); \
|
||||
(x)->offset = wlan_le32_to_cpu((x)->offset); \
|
||||
}
|
||||
#else
|
||||
/** Convert sequence number and command fields
|
||||
* of fwheader to correct endian format
|
||||
*/
|
||||
#define endian_convert_syncfwheader(x)
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
#endif /* _MLAN_INIT_H_ */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file declares the IOCTL data structures and APIs.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -110,6 +110,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_SNMP_MIB_DTIM_PERIOD = 0x00040006,
|
||||
MLAN_OID_SNMP_MIB_SIGNALEXT_ENABLE = 0x00040007,
|
||||
MLAN_OID_SNMP_MIB_CTRL_DEAUTH = 0x00040008,
|
||||
MLAN_OID_SNMP_MIB_DOT11H_FAKERADAR = 0x00040009,
|
||||
MLAN_OID_SNMP_MIB_CHAN_TRACK = 0x0004000A,
|
||||
|
||||
/* Status Information Group */
|
||||
MLAN_IOCTL_GET_INFO = 0x00050000,
|
||||
|
@ -232,6 +234,7 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_11H_CHAN_REPORT_REQUEST = 0x00110004,
|
||||
MLAN_OID_11H_CHAN_SWITCH_COUNT = 0x00110005,
|
||||
MLAN_OID_11H_CHAN_NOP_INFO = 0x00110006,
|
||||
MLAN_OID_11H_CHAN_DFS_STATE = 0x00110007,
|
||||
MLAN_OID_11H_DFS_W53_CFG = 0x00110008,
|
||||
|
||||
/* 802.11n Configuration Group RANDYTODO for value assign */
|
||||
|
@ -262,6 +265,7 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_INIT_SHUTDOWN = 0x0020000D,
|
||||
MLAN_OID_MISC_CUSTOM_IE = 0x0020000F,
|
||||
MLAN_OID_MISC_TDLS_CONFIG = 0x00200010,
|
||||
MLAN_OID_MISC_NET_MONITOR = 0x00200011,
|
||||
MLAN_OID_MISC_TX_DATAPAUSE = 0x00200012,
|
||||
MLAN_OID_MISC_IP_ADDR = 0x00200013,
|
||||
MLAN_OID_MISC_MAC_CONTROL = 0x00200014,
|
||||
|
@ -306,6 +310,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_OPER_CLASS = 0x00200038,
|
||||
MLAN_OID_MISC_PMIC_CFG = 0x00200039,
|
||||
MLAN_OID_MISC_IND_RST_CFG = 0x00200040,
|
||||
MLAN_OID_MISC_ROAM_OFFLOAD = 0x00200042,
|
||||
MLAN_OID_MISC_ROAM_OFFLOAD_APLIST = 0x00200043,
|
||||
MLAN_OID_MISC_GET_TSF = 0x00200045,
|
||||
MLAN_OID_MISC_GET_CHAN_REGION_CFG = 0x00200046,
|
||||
MLAN_OID_MISC_CLOUD_KEEP_ALIVE = 0x00200048,
|
||||
|
@ -324,6 +330,7 @@ enum _mlan_ioctl_req_id {
|
|||
#if defined(PCIE)
|
||||
MLAN_OID_MISC_SSU = 0x00200062,
|
||||
#endif
|
||||
MLAN_OID_MISC_CSI = 0x00200064,
|
||||
MLAN_OID_MISC_DMCS_CONFIG = 0x00200065,
|
||||
MLAN_OID_MISC_RX_ABORT_CFG = 0x00200066,
|
||||
MLAN_OID_MISC_RX_ABORT_CFG_EXT = 0x00200067,
|
||||
|
@ -351,6 +358,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_GET_TSF_INFO = 0x00200083,
|
||||
MLAN_OID_MISC_ASSOC_REQ = 0x00200084,
|
||||
MLAN_OID_MISC_IPS_CFG = 0x00200085,
|
||||
MLAN_OID_MISC_MC_AGGR_CFG = 0x00200086,
|
||||
MLAN_OID_MISC_CH_LOAD = 0x00200087,
|
||||
};
|
||||
|
||||
/** Sub command size */
|
||||
|
@ -600,6 +609,8 @@ enum _mlan_bss_mode {
|
|||
|
||||
/** Maximum key length */
|
||||
#define MLAN_MAX_KEY_LENGTH 32
|
||||
/** Maximum PMK R0 NAME key length */
|
||||
#define MLAN_MAX_PMKR0_NAME_LENGTH 16
|
||||
|
||||
/** Maximum atim window in milliseconds */
|
||||
#define MLAN_MAX_ATIM_WINDOW 50
|
||||
|
@ -632,7 +643,7 @@ typedef struct _mlan_multicast_list {
|
|||
} mlan_multicast_list, *pmlan_multicast_list;
|
||||
|
||||
/** Max channel */
|
||||
#define MLAN_MAX_CHANNEL 165
|
||||
#define MLAN_MAX_CHANNEL 177
|
||||
/** Maximum number of channels in table */
|
||||
#define MLAN_MAX_CHANNEL_NUM 128
|
||||
|
||||
|
@ -746,31 +757,14 @@ typedef struct _mlan_ssid_bssid {
|
|||
|
||||
/** Data structure of WMM ECW */
|
||||
typedef struct _wmm_ecw_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
#else
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} wmm_ecw_t, *pwmm_ecw_t;
|
||||
|
||||
/** Data structure of WMM Aci/Aifsn */
|
||||
typedef struct _wmm_aci_aifsn_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
/** Aci */
|
||||
t_u8 aci : 2;
|
||||
/** Acm */
|
||||
t_u8 acm : 1;
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
#else
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
/** Acm */
|
||||
|
@ -779,7 +773,6 @@ typedef struct _wmm_aci_aifsn_t {
|
|||
t_u8 aci : 2;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} wmm_aci_aifsn_t, *pwmm_aci_aifsn_t;
|
||||
|
||||
/** Data structure of WMM AC parameters */
|
||||
|
@ -986,21 +979,12 @@ typedef struct _wep_param {
|
|||
|
||||
/** Data structure of WMM QoS information */
|
||||
typedef struct _wmm_qos_info_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
#else
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} wmm_qos_info_t, *pwmm_qos_info_t;
|
||||
|
||||
/** Data structure of WMM parameter IE */
|
||||
|
@ -1086,6 +1070,10 @@ typedef struct _mlan_uap_bss_param {
|
|||
t_u8 channel;
|
||||
/** auth mode */
|
||||
t_u16 auth_mode;
|
||||
/** PWE derivation */
|
||||
t_u8 pwe_derivation;
|
||||
/** transition disable */
|
||||
t_u8 transition_disable;
|
||||
/** encryption protocol */
|
||||
t_u16 protocol;
|
||||
/** key managment type */
|
||||
|
@ -1144,6 +1132,8 @@ typedef struct _mlan_uap_scan_channels {
|
|||
scan_chan_list chan_list[MLAN_MAX_CHANNEL];
|
||||
} mlan_uap_scan_channels;
|
||||
|
||||
#define MAX_NUM_PKTS 9
|
||||
#define DEF_NUM_PKTS 3
|
||||
/** mlan_chan_switch_param */
|
||||
typedef struct _mlan_action_chan_switch {
|
||||
/** mode*/
|
||||
|
@ -1335,7 +1325,6 @@ enum _mlan_band_def {
|
|||
BAND_AAC = 64,
|
||||
BAND_GAX = 256,
|
||||
BAND_AAX = 512,
|
||||
|
||||
};
|
||||
|
||||
/** Channel bandwidth */
|
||||
|
@ -1482,6 +1471,7 @@ typedef struct _mlan_ds_snmp_mib {
|
|||
t_u8 signalext_enable;
|
||||
/** Control deauth when uap switch channel */
|
||||
t_u8 deauthctrl;
|
||||
t_u8 chan_track;
|
||||
} param;
|
||||
} mlan_ds_snmp_mib, *pmlan_ds_snmp_mib;
|
||||
|
||||
|
@ -1882,6 +1872,8 @@ typedef struct _mlan_fw_info {
|
|||
t_u8 antinfo;
|
||||
/** max AP associated sta count supported by fw */
|
||||
t_u8 max_ap_assoc_sta;
|
||||
/** FW support roaming offload */
|
||||
t_u8 fw_roaming_support;
|
||||
/** Bandwidth not support 80Mhz */
|
||||
t_u8 prohibit_80mhz;
|
||||
/** FW support beacon protection */
|
||||
|
@ -1899,100 +1891,6 @@ typedef struct _mlan_ver_ext {
|
|||
char version_str[MLAN_MAX_VER_STR_LEN];
|
||||
} mlan_ver_ext, *pmlan_ver_ext;
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Extended Capabilities Data */
|
||||
typedef struct MLAN_PACK_START _ExtCap_t {
|
||||
/** Extended Capabilities value */
|
||||
t_u8 rsvdBit87 : 1; /* bit 87 */
|
||||
t_u8 rsvdBit86 : 1; /* bit 86 */
|
||||
t_u8 rsvdBit85 : 1; /* bit 85 */
|
||||
t_u8 beacon_prot : 1; /* bit 84 */
|
||||
t_u8 rsvdBit83 : 1; /* bit 83 */
|
||||
t_u8 rsvdBit82 : 1; /* bit 82 */
|
||||
t_u8 rsvdBit81 : 1; /* bit 81 */
|
||||
t_u8 rsvdBit80 : 1; /* bit 80 */
|
||||
t_u8 rsvdBit79 : 1; /* bit 79 */
|
||||
t_u8 TWTResp : 1; /* bit 78 */
|
||||
t_u8 TWTReq : 1; /* bit 77 */
|
||||
t_u8 rsvdBit76 : 1; /* bit 76 */
|
||||
t_u8 rsvdBit75 : 1; /* bit 75 */
|
||||
t_u8 rsvdBit74 : 1; /* bit 74 */
|
||||
t_u8 rsvdBit73 : 1; /* bit 73 */
|
||||
t_u8 FILS : 1; /* bit 72 */
|
||||
t_u8 FTMI : 1; /* bit 71 */
|
||||
t_u8 FTMR : 1; /* bit 70 */
|
||||
t_u8 CAQ : 1; /* bit 69 */
|
||||
t_u8 rsvdBit68 : 1; /* bit 68 */
|
||||
t_u8 NCC : 1; /* bit 67 */
|
||||
t_u8 rsvdBit66 : 1; /* bit 66 */
|
||||
t_u8 chanSchedMgnt : 1; /* bit 65 */
|
||||
t_u8 MaxAMSDU1 : 1; /* bit 64 */
|
||||
t_u8 MaxAMSDU0 : 1; /* bit 63 */
|
||||
t_u8 OperModeNtf : 1; /* bit 62 */
|
||||
t_u8 TDLSWildBandwidth : 1; /* bit 61 */
|
||||
t_u8 rsvdBit60 : 1; /* bit 60 */
|
||||
t_u8 rsvdBit59 : 1; /* bit 59 */
|
||||
t_u8 rsvdBit58 : 1; /* bit 58 */
|
||||
t_u8 rsvdBit57 : 1; /* bit 57 */
|
||||
t_u8 rsvdBit56 : 1; /* bit 56 */
|
||||
t_u8 rsvdBit55 : 1; /* bit 55 */
|
||||
t_u8 rsvdBit54 : 1; /* bit 54 */
|
||||
t_u8 rsvdBit53 : 1; /* bit 53 */
|
||||
t_u8 rsvdBit52 : 1; /* bit 52 */
|
||||
t_u8 rsvdBit51 : 1; /* bit 51 */
|
||||
t_u8 rsvdBit50 : 1; /* bit 50 */
|
||||
t_u8 rsvdBit49 : 1; /* bit 49 */
|
||||
t_u8 rsvdBit48 : 1; /* bit 48 */
|
||||
t_u8 rsvdBit47 : 1; /* bit 47 */
|
||||
t_u8 rsvdBit46 : 1; /* bit 46 */
|
||||
t_u8 rsvdBit45 : 1; /* bit 45 */
|
||||
t_u8 rsvdBit44 : 1; /* bit 44 */
|
||||
t_u8 rsvdBit43 : 1; /* bit 43 */
|
||||
t_u8 rsvdBit42 : 1; /* bit 42 */
|
||||
t_u8 rsvdBit41 : 1; /* bit 41 */
|
||||
t_u8 rsvdBit40 : 1; /* bit 40 */
|
||||
t_u8 TDLSChlSwitchProhib : 1; /* bit 39 */
|
||||
t_u8 TDLSProhibited : 1; /* bit 38 */
|
||||
t_u8 TDLSSupport : 1; /* bit 37 */
|
||||
t_u8 MSGCF_Capa : 1; /* bit 36 */
|
||||
t_u8 Reserved35 : 1; /* bit 35 */
|
||||
t_u8 SSPN_Interface : 1; /* bit 34 */
|
||||
t_u8 EBR : 1; /* bit 33 */
|
||||
t_u8 Qos_Map : 1; /* bit 32 */
|
||||
t_u8 Interworking : 1; /* bit 31 */
|
||||
t_u8 TDLSChannelSwitching : 1; /* bit 30 */
|
||||
t_u8 TDLSPeerPSMSupport : 1; /* bit 29 */
|
||||
t_u8 TDLSPeerUAPSDSupport : 1; /* bit 28 */
|
||||
t_u8 UTC : 1; /* bit 27 */
|
||||
t_u8 DMS : 1; /* bit 26 */
|
||||
t_u8 SSID_List : 1; /* bit 25 */
|
||||
t_u8 ChannelUsage : 1; /* bit 24 */
|
||||
t_u8 TimingMeasurement : 1; /* bit 23 */
|
||||
t_u8 MultipleBSSID : 1; /* bit 22 */
|
||||
t_u8 AC_StationCount : 1; /* bit 21 */
|
||||
t_u8 QoSTrafficCap : 1; /* bit 20 */
|
||||
t_u8 BSS_Transition : 1; /* bit 19 */
|
||||
t_u8 TIM_Broadcast : 1; /* bit 18 */
|
||||
t_u8 WNM_Sleep : 1; /* bit 17 */
|
||||
t_u8 TFS : 1; /* bit 16 */
|
||||
t_u8 GeospatialLocation : 1; /* bit 15 */
|
||||
t_u8 CivicLocation : 1; /* bit 14 */
|
||||
t_u8 CollocatedIntf : 1; /* bit 13 */
|
||||
t_u8 ProxyARPService : 1; /* bit 12 */
|
||||
t_u8 FMS : 1; /* bit 11 */
|
||||
t_u8 LocationTracking : 1; /* bit 10 */
|
||||
t_u8 MulticastDiagnostics : 1; /* bit 9 */
|
||||
t_u8 Diagnostics : 1; /* bit 8 */
|
||||
t_u8 Event : 1; /* bit 7 */
|
||||
t_u8 SPSMP_Support : 1; /* bit 6 */
|
||||
t_u8 Reserved5 : 1; /* bit 5 */
|
||||
t_u8 PSMP_Capable : 1; /* bit 4 */
|
||||
t_u8 RejectUnadmFrame : 1; /* bit 3 */
|
||||
t_u8 ExtChanSwitching : 1; /* bit 2 */
|
||||
t_u8 Reserved1 : 1; /* bit 1 */
|
||||
t_u8 BSS_CoexistSupport : 1; /* bit 0 */
|
||||
} MLAN_PACK_END ExtCap_t, *pExtCap_t;
|
||||
#else
|
||||
/** Extended Capabilities Data */
|
||||
typedef struct MLAN_PACK_START _ExtCap_t {
|
||||
/** Extended Capabilities value */
|
||||
|
@ -2085,7 +1983,6 @@ typedef struct MLAN_PACK_START _ExtCap_t {
|
|||
t_u8 rsvdBit86 : 1; /* bit 86 */
|
||||
t_u8 rsvdBit87 : 1; /* bit 87 */
|
||||
} MLAN_PACK_END ExtCap_t, *pExtCap_t;
|
||||
#endif
|
||||
|
||||
/** ExtCap : TDLS prohibited */
|
||||
#define IS_EXTCAP_TDLS_PROHIBITED(ext_cap) (ext_cap.TDLSProhibited)
|
||||
|
@ -2211,6 +2108,8 @@ typedef struct _tdls_peer_info {
|
|||
t_u8 ht_cap[IEEE_MAX_IE_SIZE];
|
||||
/** VHT Capabilities IE */
|
||||
t_u8 vht_cap[IEEE_MAX_IE_SIZE];
|
||||
/** HE Capabilities IE */
|
||||
t_u8 he_cap[IEEE_MAX_IE_SIZE];
|
||||
} tdls_peer_info;
|
||||
|
||||
/** max ralist num */
|
||||
|
@ -2682,6 +2581,8 @@ typedef struct _mlan_sae_password_t {
|
|||
typedef struct _mlan_pmk_t {
|
||||
/** PMK */
|
||||
t_u8 pmk[MLAN_MAX_KEY_LENGTH];
|
||||
t_u8 pmk_r0[MLAN_MAX_KEY_LENGTH];
|
||||
t_u8 pmk_r0_name[MLAN_MAX_PMKR0_NAME_LENGTH];
|
||||
} mlan_pmk_t;
|
||||
|
||||
/** Embedded supplicant RSN type: No RSN */
|
||||
|
@ -2732,10 +2633,20 @@ typedef struct _mlan_ds_ewpa_mode {
|
|||
t_u32 act_groupcipher;
|
||||
} mlan_ds_esupp_mode, *pmlan_ds_esupp_mode;
|
||||
|
||||
/* Security SSID MAX number support by firmware*/
|
||||
#define MAX_SEC_SSID_NUM 6
|
||||
|
||||
/** Type definition of mlan_ds_sec_cfg for MLAN_IOCTL_SEC_CFG */
|
||||
typedef struct _mlan_ds_sec_cfg {
|
||||
/** Sub-command */
|
||||
t_u32 sub_command;
|
||||
/** Flag to extend some structures to support multiple values.
|
||||
** For example, mlan_ds_passphrase can only contain one value,
|
||||
** if need use mlan_ds_passphrase[N], just set this flag and
|
||||
** use mlan_ds_passphrase[] instead to avoid modify
|
||||
** more already exist code.
|
||||
*/
|
||||
t_u8 multi_passphrase;
|
||||
/** Security configuration parameter */
|
||||
union {
|
||||
/** Authentication mode for MLAN_OID_SEC_CFG_AUTH_MODE */
|
||||
|
@ -2761,6 +2672,7 @@ typedef struct _mlan_ds_sec_cfg {
|
|||
#ifdef UAP_SUPPORT
|
||||
t_u8 sta_mac[MLAN_MAC_ADDR_LENGTH];
|
||||
#endif
|
||||
mlan_ds_passphrase roam_passphrase[MAX_SEC_SSID_NUM];
|
||||
} param;
|
||||
} mlan_ds_sec_cfg, *pmlan_ds_sec_cfg;
|
||||
|
||||
|
@ -3075,6 +2987,8 @@ typedef struct _mlan_ds_hs_cfg {
|
|||
t_u8 ext_gap;
|
||||
/** GPIO wave level for extend hscfg*/
|
||||
t_u8 gpio_wave;
|
||||
/** Minimum delay between HsActive and HostWake (in msec) */
|
||||
t_u16 min_wake_holdoff;
|
||||
} mlan_ds_hs_cfg, *pmlan_ds_hs_cfg;
|
||||
|
||||
#define MAX_MGMT_FRAME_FILTER 2
|
||||
|
@ -3922,7 +3836,7 @@ typedef MLAN_PACK_START struct _mlan_ds_11ax_he_capa {
|
|||
|
||||
/** Type definition of mlan_ds_11ax_he_cfg for MLAN_OID_11AX_HE_CFG */
|
||||
typedef struct _mlan_ds_11ax_he_cfg {
|
||||
/** band, BIT0:2.4G, BIT1:5G*/
|
||||
/** band, BIT0:2.4G, BIT1:5G BIT2:6G*/
|
||||
t_u8 band;
|
||||
/** mlan_ds_11ax_he_capa */
|
||||
mlan_ds_11ax_he_capa he_cap;
|
||||
|
@ -4117,12 +4031,19 @@ typedef struct _mlan_ds_subband_set_t {
|
|||
t_u8 max_tx_pwr;
|
||||
} mlan_ds_subband_set_t;
|
||||
|
||||
#define NXP_DFS_UNSET 0
|
||||
#define NXP_DFS_FCC 1
|
||||
#define NXP_DFS_ETSI 2
|
||||
#define NXP_DFS_JP 3
|
||||
#define NXP_DFS_UNKNOWN 0xFF
|
||||
/** Domain regulatory information */
|
||||
typedef struct _mlan_ds_11d_domain_info {
|
||||
/** DFS region code */
|
||||
t_u8 dfs_region;
|
||||
/** Country Code */
|
||||
t_u8 country_code[COUNTRY_CODE_LEN];
|
||||
/** Band that channels in sub_band belong to */
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
/** No. of subband in below */
|
||||
t_u8 no_of_sub_band;
|
||||
/** Subband data to send/last sent */
|
||||
|
@ -4166,7 +4087,14 @@ enum _mlan_reg_type {
|
|||
MLAN_REG_PSU = 6,
|
||||
MLAN_REG_BCA = 7,
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) || \
|
||||
defined(SD9177)
|
||||
MLAN_REG_CIU = 8,
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
MLAN_REG_MAC2 = 0x81,
|
||||
MLAN_REG_BBP2 = 0x82,
|
||||
MLAN_REG_RF2 = 0x83,
|
||||
|
@ -4261,6 +4189,16 @@ typedef struct _mlan_ds_11h_chan_rep_req {
|
|||
t_u8 host_based;
|
||||
} mlan_ds_11h_chan_rep_req;
|
||||
|
||||
/** channel dfs state for MLAN_OID_11H_CHAN_DFS_STATE */
|
||||
typedef struct _mlan_ds_11h_chan_dfs_state {
|
||||
/** channel */
|
||||
t_u8 channel;
|
||||
/** is dfs channel */
|
||||
t_u8 dfs_required;
|
||||
/** dfs state */
|
||||
dfs_state_t dfs_state;
|
||||
} mlan_ds_11h_chan_dfs_state;
|
||||
|
||||
typedef struct _mlan_ds_11h_dfs_w53_cfg {
|
||||
/** dfs w53 cfg */
|
||||
t_u8 dfs53cfg;
|
||||
|
@ -4282,6 +4220,8 @@ typedef struct _mlan_ds_11h_cfg {
|
|||
mlan_ds_11h_chan_rep_req chan_rpt_req;
|
||||
/** channel switch count for MLAN_OID_11H_CHAN_SWITCH_COUNT*/
|
||||
t_s8 cs_count;
|
||||
/** channel dfs state for MLAN_OID_11H_CHAN_DFS_STATE */
|
||||
mlan_ds_11h_chan_dfs_state ch_dfs_state;
|
||||
mlan_ds_11h_dfs_w53_cfg dfs_w53_cfg;
|
||||
} param;
|
||||
} mlan_ds_11h_cfg, *pmlan_ds_11h_cfg;
|
||||
|
@ -4370,6 +4310,26 @@ enum _mlan_func_cmd {
|
|||
MLAN_FUNC_SHUTDOWN,
|
||||
};
|
||||
|
||||
/** Net monitor filter: management frame */
|
||||
#define MLAN_NETMON_MANAGEMENT_FRAME MBIT(0)
|
||||
/** Net monitor filter: control frame */
|
||||
#define MLAN_NETMON_CONTROL_FRAME MBIT(1)
|
||||
/** Net monitor filter: data frame */
|
||||
#define MLAN_NETMON_DATA_FRAME MBIT(2)
|
||||
|
||||
typedef struct _mlan_ds_misc_net_monitor {
|
||||
/** Enable/disable network monitor */
|
||||
t_u32 enable_net_mon;
|
||||
/** Set net monitor filer flag */
|
||||
t_u32 filter_flag;
|
||||
/** Radio type */
|
||||
t_u32 band;
|
||||
/** Channel */
|
||||
t_u32 channel;
|
||||
/** Secondary channel bandwidth */
|
||||
t_u32 chan_bandwidth;
|
||||
} mlan_ds_misc_net_monitor;
|
||||
|
||||
/** Type definition of mlan_ds_misc_tx_datapause
|
||||
* for MLAN_OID_MISC_TX_DATAPAUSE
|
||||
*/
|
||||
|
@ -4780,6 +4740,166 @@ typedef struct _mlan_ds_misc_pmfcfg {
|
|||
|
||||
#define MAX_SSID_NUM 16
|
||||
#define MAX_AP_LIST 8
|
||||
#define RETRY_UNLIMITED_TIME 0xFF
|
||||
|
||||
#define FW_ROAM_ENABLE MBIT(0)
|
||||
#define FW_ROAM_TRIGGER_COND MBIT(1)
|
||||
#define FW_ROAM_BSSID MBIT(2)
|
||||
#define FW_ROAM_SSID MBIT(3)
|
||||
#define FW_ROAM_RETRY_COUNT MBIT(4)
|
||||
#define FW_ROAM_RSSI_PARA MBIT(5)
|
||||
#define FW_ROAM_BAND_RSSI MBIT(6)
|
||||
#define FW_ROAM_BGSCAN_PARAM MBIT(7)
|
||||
#define FW_ROAM_EES_PARAM MBIT(8)
|
||||
#define FW_ROAM_BCN_MISS_THRESHOLD MBIT(9)
|
||||
#define FW_ROAM_PRE_BCN_MISS_THRESHOLD MBIT(10)
|
||||
#define FW_ROAM_BLACKLIST MBIT(11)
|
||||
#define FW_ROAM_REPEAT_CNT MBIT(12)
|
||||
|
||||
/*Roam offload configuration for auto reconnection when suspend and resume*/
|
||||
typedef enum _roam_offload_config_mode {
|
||||
ROAM_OFFLOAD_ENABLE = 1,
|
||||
ROAM_OFFLOAD_SUSPEND_CFG,
|
||||
ROAM_OFFLOAD_RESUME_CFG,
|
||||
ROAM_OFFLOAD_PARAM_CFG,
|
||||
} roam_offload_config_mode;
|
||||
|
||||
typedef enum _roam_offload_set_mode {
|
||||
ROAM_OFFLOAD_DISABLE = 0,
|
||||
ROAM_OFFLOAD_WITH_APLIST,
|
||||
ROAM_OFFLOAD_WITHOUT_APLIST,
|
||||
ROAM_OFFLOAD_WITH_BSSID,
|
||||
ROAM_OFFLOAD_WITH_SSID,
|
||||
AUTO_RECONNECT,
|
||||
} roam_offload_set_mode;
|
||||
|
||||
typedef enum _roam_offload_trigger_mode {
|
||||
NO_TRIGGER = 0x00,
|
||||
RSSI_LOW_TRIGGER = 0x01,
|
||||
PRE_BEACON_LOST_TRIGGER = 0x02,
|
||||
LINK_LOST_TRIGGER = 0x04,
|
||||
DEAUTH_WITH_EXT_AP_TRIGGER = 0x08,
|
||||
} roam_offload_trigger_mode;
|
||||
|
||||
/** mlan_ds_misc_ees_cfg structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_ees_cfg {
|
||||
/* EES mode*/
|
||||
t_u16 ees_mode;
|
||||
/* EES report condition*/
|
||||
t_u16 ees_rpt_condition;
|
||||
/* High scan period(milliseconds)*/
|
||||
t_u16 high_scan_period;
|
||||
/* High scan count*/
|
||||
t_u16 high_scan_count;
|
||||
/* Middle scan period(milliseconds)*/
|
||||
t_u16 mid_scan_period;
|
||||
/* Middle scan count*/
|
||||
t_u16 mid_scan_count;
|
||||
/* Low scan period(milliseconds)*/
|
||||
t_u16 low_scan_period;
|
||||
/* Low scan count*/
|
||||
t_u16 low_scan_count;
|
||||
} MLAN_PACK_END mlan_ds_misc_ees_cfg;
|
||||
|
||||
/** mlan_ds_misc_bgscan_cfg structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_bgscan_cfg {
|
||||
/* BSS Type 0x1-bss independent, 0x2-bss infrastructure, 0x3-bss any*/
|
||||
t_u8 bss_type;
|
||||
/* Number of channels scanned for each scan*/
|
||||
t_u8 channels_per_scan;
|
||||
/* Interval between consective scans*/
|
||||
t_u32 scan_interval;
|
||||
/* Conditons to trigger report to host*/
|
||||
t_u32 bg_rpt_condition;
|
||||
} MLAN_PACK_END mlan_ds_misc_bgscan_cfg;
|
||||
|
||||
/** mlan_ds_misc_band_rssi structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_band_rssi {
|
||||
/* RSSI hysteresis*/
|
||||
t_u8 rssi_hysteresis;
|
||||
/* Preferred channel band for fw roaming
|
||||
* 0:2.4G band; 1: 5G band; 2:4G band; 0xFF:band not set(invalid)
|
||||
*/
|
||||
t_u8 band_preferred;
|
||||
} MLAN_PACK_END mlan_ds_misc_band_rssi;
|
||||
|
||||
/** mlan_ds_misc_ssid_list structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_ssid_list {
|
||||
/* SSID number*/
|
||||
t_u8 ssid_num;
|
||||
/* SSID for fw roaming/auto_reconnect*/
|
||||
mlan_802_11_ssid ssids[MAX_SSID_NUM];
|
||||
} MLAN_PACK_END mlan_ds_misc_ssid_list;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_roam_offload_aplist {
|
||||
/** Number of AP**/
|
||||
t_u8 ap_num;
|
||||
/** AP mac addrs**/
|
||||
t_u8 ap_mac[MAX_AP_LIST][MLAN_MAC_ADDR_LENGTH];
|
||||
} MLAN_PACK_END mlan_ds_misc_roam_offload_aplist;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_roam_offload_para_rssi {
|
||||
/** Setting flag**/
|
||||
t_u8 set_flag;
|
||||
/** Max value of RSSI threshold**/
|
||||
t_u8 max_rssi;
|
||||
/** Min value of RSSI threshold**/
|
||||
t_u8 min_rssi;
|
||||
/** Adjusting step value of RSSI threshold**/
|
||||
t_u8 step_rssi;
|
||||
} MLAN_PACK_END mlan_ds_misc_roam_offload_para_rssi;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_roam_offload {
|
||||
/** Enable roam offload**/
|
||||
t_u8 enable;
|
||||
/** User set passphrase**/
|
||||
t_u8 userset_passphrase;
|
||||
/* Condition to trigger roaming
|
||||
* Bit0 : RSSI low trigger
|
||||
* Bit1 : Pre-beacon lost trigger
|
||||
* Bit2 : Link Lost trigger
|
||||
* Bit3 : Deauth by ext-AP trigger
|
||||
* Bit4 ~ Bit15 : Reserved
|
||||
* value 0 : no trigger
|
||||
* value 0xff : invalid
|
||||
*/
|
||||
t_u16 trigger_condition;
|
||||
/** AP list**/
|
||||
mlan_ds_misc_roam_offload_aplist aplist;
|
||||
/*Roam offload configuration mode for auto connection when suspend and
|
||||
* resume*/
|
||||
roam_offload_config_mode config_mode;
|
||||
/** Retry count**/
|
||||
t_u8 retry_count;
|
||||
/** RSSI para**/
|
||||
mlan_ds_misc_roam_offload_para_rssi para_rssi;
|
||||
/** BSSID of reconnection**/
|
||||
mlan_802_11_mac_addr bssid_reconnect;
|
||||
/* SSID List(White list)*/
|
||||
mlan_ds_misc_ssid_list ssid_list;
|
||||
/* Black list(BSSID list)*/
|
||||
mlan_ds_misc_roam_offload_aplist black_list;
|
||||
/* BAND and RSSI_HYSTERESIS set flag*/
|
||||
t_u8 band_rssi_flag;
|
||||
mlan_ds_misc_band_rssi band_rssi;
|
||||
|
||||
/* BGSCAN params set flag*/
|
||||
t_u8 bgscan_set_flag;
|
||||
mlan_ds_misc_bgscan_cfg bgscan_cfg;
|
||||
|
||||
/* EES mode params set flag*/
|
||||
t_u8 ees_param_set_flag;
|
||||
mlan_ds_misc_ees_cfg ees_cfg;
|
||||
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 bcn_miss_threshold;
|
||||
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 pre_bcn_miss_threshold;
|
||||
|
||||
/* Scan repeat count*/
|
||||
t_u16 repeat_count;
|
||||
} MLAN_PACK_END mlan_ds_misc_roam_offload;
|
||||
|
||||
/**Action ID for TDLS disable link*/
|
||||
#define WLAN_TDLS_DISABLE_LINK 0x00
|
||||
|
@ -4833,6 +4953,8 @@ typedef struct _mlan_ds_misc_tdls_oper {
|
|||
#define TDLS_IE_FLAGS_QOS_INFO 0x0080
|
||||
/** flag for TDLS SETUP */
|
||||
#define TDLS_IE_FLAGS_SETUP 0x0100
|
||||
#define TDLS_IE_FLAGS_HECAP 0x0200
|
||||
#define TDLS_IE_FLAGS_HEOP 0x0400
|
||||
|
||||
/** TDLS ie buffer */
|
||||
typedef struct _mlan_ds_misc_tdls_ies {
|
||||
|
@ -4854,6 +4976,10 @@ typedef struct _mlan_ds_misc_tdls_ies {
|
|||
t_u8 vht_oprat[IEEE_MAX_IE_SIZE];
|
||||
/** aid Info */
|
||||
t_u8 aid_info[IEEE_MAX_IE_SIZE];
|
||||
/** HE Capabilities IE */
|
||||
t_u8 he_cap[IEEE_MAX_IE_SIZE];
|
||||
/** HE Operation IE */
|
||||
t_u8 he_op[IEEE_MAX_IE_SIZE];
|
||||
/** supported channels */
|
||||
t_u8 supp_chan[IEEE_MAX_IE_SIZE];
|
||||
/** supported regulatory class */
|
||||
|
@ -5112,6 +5238,34 @@ typedef struct _mlan_ds_ssu_params {
|
|||
} mlan_ds_ssu_params;
|
||||
#endif
|
||||
|
||||
#define CSI_FILTER_MAX 16
|
||||
/** Structure of CSI filters */
|
||||
typedef MLAN_PACK_START struct _mlan_csi_filter_t {
|
||||
/** Source address of the packet to receive */
|
||||
t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
|
||||
/** Pakcet type of the interested CSI */
|
||||
t_u8 pkt_type;
|
||||
/* Packet subtype of the interested CSI */
|
||||
t_u8 subtype;
|
||||
/* Other filter flags */
|
||||
t_u8 flags;
|
||||
} MLAN_PACK_END mlan_csi_filter_t;
|
||||
/** Structure of CSI parameters */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_csi_params {
|
||||
/** CSI enable flag. 1: enable, 0: disable */
|
||||
t_u16 csi_enable;
|
||||
/** Header ID*/
|
||||
t_u32 head_id;
|
||||
/** Tail ID */
|
||||
t_u32 tail_id;
|
||||
/** Number of CSI filters */
|
||||
t_u8 csi_filter_cnt;
|
||||
/** Chip ID */
|
||||
t_u8 chip_id;
|
||||
/** CSI filters */
|
||||
mlan_csi_filter_t csi_filter[CSI_FILTER_MAX];
|
||||
} MLAN_PACK_END mlan_ds_csi_params;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_hal_phy_cfg_params {
|
||||
/** 11b pwr spectral density mask enable/disable */
|
||||
t_u8 dot11b_psd_mask_cfg;
|
||||
|
@ -5319,6 +5473,31 @@ typedef struct _mlan_ds_misc_cfp_tbl {
|
|||
chan_freq_power_t cfp_tbl[];
|
||||
} mlan_ds_misc_cfp_tbl;
|
||||
|
||||
/** mlan_ds_mc_aggr_cfg for MLAN_OID_MISC_MC_AGGR_CFG */
|
||||
typedef struct _mlan_ds_mc_aggr_cfg {
|
||||
/** action */
|
||||
t_u8 action;
|
||||
/* 1 enable, 0 disable
|
||||
* bit 0 MC aggregation
|
||||
* bit 1 packet expiry
|
||||
* bit 2 CTS2Self
|
||||
* bit 3 CTS2Self duration offset*/
|
||||
t_u8 enable_bitmap;
|
||||
/* 1 valid, 0 invalid
|
||||
* bit 0 MC aggregation
|
||||
* bit 1 packet expiry
|
||||
* bit 2 CTS2Self
|
||||
* bit 3 CTS2Self duration offset*/
|
||||
t_u8 mask_bitmap;
|
||||
/** CTS2Self duration offset */
|
||||
t_u16 cts2self_offset;
|
||||
} mlan_ds_mc_aggr_cfg;
|
||||
typedef struct _mlan_ds_ch_load {
|
||||
/** action */
|
||||
t_u8 action;
|
||||
t_u16 ch_load_param;
|
||||
} mlan_ds_ch_load;
|
||||
|
||||
/** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */
|
||||
typedef struct _mlan_ds_misc_cfg {
|
||||
/** Sub-command */
|
||||
|
@ -5358,6 +5537,8 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_tdls_ies tdls_ies;
|
||||
/**tdls cs off channel*/
|
||||
t_u8 tdls_cs_channel;
|
||||
/** Net monitor for MLAN_OID_MISC_NET_MONITOR */
|
||||
mlan_ds_misc_net_monitor net_mon;
|
||||
/** Tx data pause for MLAN_OID_MISC_TX_DATAPAUSE */
|
||||
mlan_ds_misc_tx_datapause tx_datapause;
|
||||
/** IP address configuration */
|
||||
|
@ -5419,6 +5600,8 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_gtk_rekey_data gtk_rekey;
|
||||
mlan_ds_bw_chan_oper bw_chan_oper;
|
||||
mlan_ds_ind_rst_cfg ind_rst_cfg;
|
||||
/** Roam offload */
|
||||
mlan_ds_misc_roam_offload roam_offload;
|
||||
t_u64 misc_tsf;
|
||||
mlan_ds_custom_reg_domain custom_reg_domain;
|
||||
mlan_ds_misc_keep_alive keep_alive;
|
||||
|
@ -5430,6 +5613,7 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
#if defined(PCIE)
|
||||
mlan_ds_ssu_params ssu_params;
|
||||
#endif
|
||||
mlan_ds_csi_params csi_params;
|
||||
/** boot sleep enable or disable */
|
||||
t_u16 boot_sleep;
|
||||
/** Mapping Policy */
|
||||
|
@ -5455,10 +5639,12 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_dot11mc_unassoc_ftm_cfg dot11mc_unassoc_ftm_cfg;
|
||||
mlan_ds_misc_tp_state tp_state;
|
||||
mlan_ds_hal_phy_cfg_params hal_phy_cfg_params;
|
||||
mlan_ds_mc_aggr_cfg mc_aggr_cfg;
|
||||
#ifdef UAP_SUPPORT
|
||||
t_u8 wacp_mode;
|
||||
#endif
|
||||
t_u32 ips_ctrl;
|
||||
mlan_ds_ch_load ch_load;
|
||||
} param;
|
||||
} mlan_ds_misc_cfg, *pmlan_ds_misc_cfg;
|
||||
|
||||
|
|
|
@ -1027,7 +1027,7 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
pchan_tlv->chan_scan_param[0].chan_number);
|
||||
|
||||
pchan_tlv->chan_scan_param[0].bandcfg.chanBand =
|
||||
wlan_band_to_radio_type((t_u8)pbss_desc->bss_band);
|
||||
wlan_band_to_radio_type(pbss_desc->bss_band);
|
||||
|
||||
PRINTM(MINFO, "Assoc: TLV Bandcfg = %x\n",
|
||||
pchan_tlv->chan_scan_param[0].bandcfg);
|
||||
|
@ -1205,8 +1205,8 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
wlan_11ac_bandconfig_allowed(pmpriv, pbss_desc->bss_band))
|
||||
wlan_cmd_append_11ac_tlv(pmpriv, pbss_desc, &pos);
|
||||
|
||||
if ((IS_FW_SUPPORT_11AX(pmadapter)) && (!pbss_desc->disable_11n) &&
|
||||
wlan_11ax_bandconfig_allowed(pmpriv, pbss_desc->bss_band))
|
||||
if ((IS_FW_SUPPORT_11AX(pmadapter)) &&
|
||||
wlan_11ax_bandconfig_allowed(pmpriv, pbss_desc))
|
||||
wlan_cmd_append_11ax_tlv(pmpriv, pbss_desc, &pos);
|
||||
|
||||
wlan_wmm_process_association_req(pmpriv, &pos, &pbss_desc->wmm_ie,
|
||||
|
@ -1248,8 +1248,7 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv,
|
|||
pos += sizeof(prev_bssid_tlv->header) + MLAN_MAC_ADDR_LENGTH;
|
||||
}
|
||||
|
||||
if (wlan_11d_create_dnld_countryinfo(pmpriv,
|
||||
(t_u8)pbss_desc->bss_band)) {
|
||||
if (wlan_11d_create_dnld_countryinfo(pmpriv, pbss_desc->bss_band)) {
|
||||
PRINTM(MERROR, "Dnld_countryinfo_11d failed\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
|
@ -2111,7 +2110,7 @@ mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
|
|||
pchan_tlv->chan_scan_param[0].chan_number);
|
||||
|
||||
pchan_tlv->chan_scan_param[0].bandcfg.chanBand =
|
||||
wlan_band_to_radio_type((t_u8)pbss_desc->bss_band);
|
||||
wlan_band_to_radio_type(pbss_desc->bss_band);
|
||||
|
||||
PRINTM(MINFO, "ADHOC_J_CMD: TLV Bandcfg = %x\n",
|
||||
pchan_tlv->chan_scan_param[0].bandcfg);
|
||||
|
@ -2120,8 +2119,7 @@ mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
|
|||
sizeof(pchan_tlv->header) + sizeof(ChanScanParamSet_t);
|
||||
}
|
||||
|
||||
if (wlan_11d_create_dnld_countryinfo(pmpriv,
|
||||
(t_u8)pbss_desc->bss_band)) {
|
||||
if (wlan_11d_create_dnld_countryinfo(pmpriv, pbss_desc->bss_band)) {
|
||||
PRINTM(MERROR, "Dnld_countryinfo_11d failed\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
|
@ -2639,7 +2637,7 @@ mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
|
|||
*
|
||||
* @return Radio type designator for use in a channel TLV
|
||||
*/
|
||||
t_u8 wlan_band_to_radio_type(t_u8 band)
|
||||
t_u8 wlan_band_to_radio_type(t_u16 band)
|
||||
{
|
||||
t_u8 ret_radio_type;
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* both adhoc and infrastructure networks
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* in MLAN module.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -308,48 +308,6 @@ extern t_u32 mlan_drvdbg;
|
|||
(t_u64)(((t_u64)(x)&0x00ff000000000000ULL) >> 40) | \
|
||||
(t_u64)(((t_u64)(x)&0xff00000000000000ULL) >> 56)))
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Convert ulong n/w to host */
|
||||
#define mlan_ntohl(x) x
|
||||
/** Convert host ulong to n/w */
|
||||
#define mlan_htonl(x) x
|
||||
/** Convert n/w to host */
|
||||
#define mlan_ntohs(x) x
|
||||
/** Convert host to n/w */
|
||||
#define mlan_htons(x) x
|
||||
/** Convert from 16 bit little endian format to CPU format */
|
||||
#define wlan_le16_to_cpu(x) swap_byte_16(x)
|
||||
/** Convert from 32 bit little endian format to CPU format */
|
||||
#define wlan_le32_to_cpu(x) swap_byte_32(x)
|
||||
/** Convert from 64 bit little endian format to CPU format */
|
||||
#define wlan_le64_to_cpu(x) swap_byte_64(x)
|
||||
/** Convert to 16 bit little endian format from CPU format */
|
||||
#define wlan_cpu_to_le16(x) swap_byte_16(x)
|
||||
/** Convert to 32 bit little endian format from CPU format */
|
||||
#define wlan_cpu_to_le32(x) swap_byte_32(x)
|
||||
/** Convert to 64 bit little endian format from CPU format */
|
||||
#define wlan_cpu_to_le64(x) swap_byte_64(x)
|
||||
|
||||
/** Convert TxPD to little endian format from CPU format */
|
||||
#define endian_convert_TxPD(x) \
|
||||
{ \
|
||||
(x)->tx_pkt_length = wlan_cpu_to_le16((x)->tx_pkt_length); \
|
||||
(x)->tx_pkt_offset = wlan_cpu_to_le16((x)->tx_pkt_offset); \
|
||||
(x)->tx_pkt_type = wlan_cpu_to_le16((x)->tx_pkt_type); \
|
||||
(x)->tx_control = wlan_cpu_to_le32((x)->tx_control); \
|
||||
(x)->tx_control_1 = wlan_cpu_to_le32((x)->tx_control_1); \
|
||||
}
|
||||
/** Convert RxPD from little endian format to CPU format */
|
||||
#define endian_convert_RxPD(x) \
|
||||
{ \
|
||||
(x)->rx_pkt_length = wlan_le16_to_cpu((x)->rx_pkt_length); \
|
||||
(x)->rx_pkt_offset = wlan_le16_to_cpu((x)->rx_pkt_offset); \
|
||||
(x)->rx_pkt_type = wlan_le16_to_cpu((x)->rx_pkt_type); \
|
||||
(x)->seq_num = wlan_le16_to_cpu((x)->seq_num); \
|
||||
(x)->rx_info = wlan_le32_to_cpu((x)->rx_info);
|
||||
}
|
||||
|
||||
#else
|
||||
/** Convert ulong n/w to host */
|
||||
#define mlan_ntohl(x) swap_byte_32(x)
|
||||
/** Convert host ulong to n/w */
|
||||
|
@ -379,7 +337,10 @@ extern t_u32 mlan_drvdbg;
|
|||
#define endian_convert_RxPD(x) \
|
||||
do { \
|
||||
} while (0)
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
/** Convert RxPD extra header from little endian format to CPU format */
|
||||
#define endian_convert_RxPD_extra_header(x) \
|
||||
do { \
|
||||
} while (0)
|
||||
|
||||
/** Global moal_assert_callback */
|
||||
extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);
|
||||
|
@ -558,7 +519,7 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);
|
|||
/** Maximum numbfer of registers to read for multiple port */
|
||||
#if defined(SD8887) || defined(SD8997) || defined(SD8977) || \
|
||||
defined(SD8987) || defined(SD9098) || defined(SD9097) || \
|
||||
defined(SD8978) || defined(SD9177)
|
||||
defined(SDNW62X) || defined(SD8978) || defined(SD9177)
|
||||
#define MAX_MP_REGS 196
|
||||
#else
|
||||
/* upto 0xB7 */
|
||||
|
@ -754,7 +715,7 @@ struct _raListTbl {
|
|||
/** packet count threshold to setup BA */
|
||||
t_u8 ba_packet_threshold;
|
||||
/** is 11n enabled */
|
||||
t_u8 is_11n_enabled;
|
||||
t_u8 is_wmm_enabled;
|
||||
/** max amsdu size */
|
||||
t_u16 max_amsdu;
|
||||
/** BA stream status */
|
||||
|
@ -852,7 +813,7 @@ typedef struct {
|
|||
/** Uapsd enable?*/
|
||||
t_u8 wmm_uapsd_enabled;
|
||||
/** Band */
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
/** Number of rates supported */
|
||||
t_u32 num_of_rates;
|
||||
/** Supported rates*/
|
||||
|
@ -909,7 +870,7 @@ typedef struct _region_chan_t {
|
|||
/** Region code for US, Japan ... */
|
||||
t_u8 region;
|
||||
/** Band B/G/A, used for BAND_CONFIG cmd */
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
/** Actual No. of elements in the array below */
|
||||
t_u8 num_cfp;
|
||||
/** chan-freq-txpower mapping table */
|
||||
|
@ -926,10 +887,12 @@ typedef enum _state_11d_t {
|
|||
|
||||
/** Domain regulatory information */
|
||||
typedef struct _wlan_802_11d_domain_reg {
|
||||
/** dfs_region */
|
||||
t_u8 dfs_region;
|
||||
/** Country Code */
|
||||
t_u8 country_code[COUNTRY_CODE_LEN];
|
||||
/** band that channels in sub_band belong to */
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
/** No. of subband in below */
|
||||
t_u8 no_of_sub_band;
|
||||
/** Subband data to send/last sent */
|
||||
|
@ -1172,6 +1135,7 @@ typedef struct _mlan_private {
|
|||
/** AdHoc previous ssid used for Start */
|
||||
mlan_802_11_ssid adhoc_last_start_ssid;
|
||||
#endif
|
||||
mlan_ds_11h_chan_rep_req chan_rep_req;
|
||||
/** FSM variable for 11d support */
|
||||
wlan_802_11d_state_t state_11d;
|
||||
/** FSM variable for 11h support */
|
||||
|
@ -1545,6 +1509,10 @@ struct _sta_node {
|
|||
IEEEtypes_VHTCap_t vht_cap;
|
||||
/** VHT Operations IE */
|
||||
IEEEtypes_VHTOprat_t vht_oprat;
|
||||
/** HE Capabilities IE */
|
||||
IEEEtypes_HECap_t tdls_he_cap;
|
||||
/** HE Operations IE */
|
||||
IEEEtypes_HeOp_t he_op;
|
||||
/** wapi key on off flag */
|
||||
t_u8 wapi_key_on;
|
||||
/** tx pause status */
|
||||
|
@ -2369,7 +2337,8 @@ typedef struct _mlan_adapter {
|
|||
/** Extended firmware capability information */
|
||||
t_u32 fw_cap_ext;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
/** High byte for 5G, low byte for 2G, like 0x2211 0x22 for 5G, 0x11 for
|
||||
* 2G */
|
||||
t_u16 user_htstream;
|
||||
|
@ -2461,6 +2430,8 @@ typedef struct _mlan_adapter {
|
|||
mlan_list_head cmd_pending_q;
|
||||
/** Command queue for scanning */
|
||||
mlan_list_head scan_pending_q;
|
||||
/** Command pending queue while scanning */
|
||||
mlan_list_head ext_cmd_pending_q;
|
||||
/** ioctl pending queue */
|
||||
mlan_list_head ioctl_pending_q;
|
||||
/** pending_ioctl flag */
|
||||
|
@ -2468,6 +2439,10 @@ typedef struct _mlan_adapter {
|
|||
pmlan_private pending_disconnect_priv;
|
||||
/** mlan_processing */
|
||||
t_u32 scan_processing;
|
||||
/** firmware support for roaming*/
|
||||
t_u8 fw_roaming;
|
||||
/** User set passphrase*/
|
||||
t_u8 userset_passphrase;
|
||||
/** ext_scan enh support flag */
|
||||
t_u8 ext_scan_enh;
|
||||
/** scan type: 0 legacy, 1: enhance scan*/
|
||||
|
@ -2757,6 +2732,8 @@ typedef struct _mlan_adapter {
|
|||
/** tdls status */
|
||||
/* TDLS_NOT_SETUP|TDLS_SWITCHING_CHANNEL|TDLS_IN_BASE_CHANNEL|TDLS_IN_SWITCH_CHANNEL*/
|
||||
tdlsStatus_e tdls_status;
|
||||
/** NetMon enabled */
|
||||
t_u32 enable_net_mon;
|
||||
/** Feature control bitmask */
|
||||
t_u32 feature_control;
|
||||
|
||||
|
@ -2768,6 +2745,7 @@ typedef struct _mlan_adapter {
|
|||
#if defined(PCIE)
|
||||
mlan_buffer *ssu_buf;
|
||||
#endif
|
||||
t_u8 csi_enabled;
|
||||
/** maximum sta connection */
|
||||
t_u8 max_sta_conn;
|
||||
otp_region_info_t *otp_region;
|
||||
|
@ -2810,6 +2788,18 @@ typedef struct _mlan_adapter {
|
|||
/** Ethernet packet type offset */
|
||||
#define MLAN_ETHER_PKT_TYPE_OFFSET (12)
|
||||
|
||||
mlan_status wlan_cmd_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf);
|
||||
|
||||
mlan_status wlan_ret_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
|
||||
mlan_status wlan_misc_ioctl_net_monitor(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
||||
void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd,
|
||||
radiotap_info *prt_info);
|
||||
|
||||
mlan_status wlan_init_lock_list(pmlan_adapter pmadapter);
|
||||
mlan_status wlan_init_priv_lock_list(pmlan_adapter pmadapter, t_u8 start_index);
|
||||
t_void wlan_free_lock_list(pmlan_adapter pmadapter);
|
||||
|
@ -2893,6 +2883,9 @@ mlan_status wlan_bss_ioctl_bss_role(pmlan_adapter pmadapter,
|
|||
mlan_status wlan_misc_ssu(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
|
||||
#endif
|
||||
|
||||
mlan_status wlan_misc_csi(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req);
|
||||
mlan_status wlan_process_csi_event(pmlan_private pmpriv);
|
||||
|
||||
mlan_status wlan_misc_hal_phy_cfg(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
||||
|
@ -3365,9 +3358,9 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect);
|
|||
t_void wlan_2040_coex_event(pmlan_private pmpriv);
|
||||
|
||||
/** convert band to radio type */
|
||||
t_u8 wlan_band_to_radio_type(t_u8 band);
|
||||
t_u8 wlan_band_to_radio_type(t_u16 band);
|
||||
/** convert radio_type to band */
|
||||
t_u8 radio_type_to_band(t_u8 chanBand);
|
||||
t_u16 radio_type_to_band(t_u8 chanBand);
|
||||
|
||||
/** Disconnect */
|
||||
mlan_status wlan_disconnect(mlan_private *pmpriv, mlan_ioctl_req *pioctl_req,
|
||||
|
@ -3413,18 +3406,19 @@ mlan_status wlan_ret_802_11_bgscan_query(mlan_private *pmpriv,
|
|||
|
||||
/** Get Channel-Frequency-Power by band and channel */
|
||||
chan_freq_power_t *
|
||||
wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u8 band,
|
||||
wlan_get_cfp_by_band_and_channel(pmlan_adapter pmadapter, t_u16 band,
|
||||
t_u16 channel, region_chan_t *region_channel);
|
||||
/** Find Channel-Frequency-Power by band and channel */
|
||||
chan_freq_power_t *wlan_find_cfp_by_band_and_channel(mlan_adapter *pmadapter,
|
||||
t_u8 band, t_u16 channel);
|
||||
t_u16 band, t_u16 channel);
|
||||
/** Find Channel-Frequency-Power by band and frequency */
|
||||
chan_freq_power_t *wlan_find_cfp_by_band_and_freq(mlan_adapter *pmadapter,
|
||||
t_u8 band, t_u32 freq);
|
||||
t_u16 band, t_u32 freq);
|
||||
/** Get Tx power of channel from Channel-Frequency-Power */
|
||||
t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u8 channel);
|
||||
t_u8 wlan_get_txpwr_of_chan_from_cfp(mlan_private *pmpriv, t_u16 band,
|
||||
t_u8 channel);
|
||||
/** find frequency from band and channel */
|
||||
t_u32 wlan_find_freq_from_band_chan(t_u8, t_u8);
|
||||
t_u32 wlan_find_freq_from_band_chan(t_u16 band, t_u8 chan);
|
||||
|
||||
/* Save a beacon buffer of the current bss descriptor */
|
||||
t_void wlan_save_curr_bcn(mlan_private *pmpriv);
|
||||
|
@ -3528,27 +3522,28 @@ mlan_status wlan_misc_ioctl_tp_state(pmlan_adapter pmadapter,
|
|||
/* CFP related functions */
|
||||
/** Region code index table */
|
||||
extern t_u16 region_code_index[MRVDRV_MAX_REGION_CODE];
|
||||
/** The table to keep CFP code for BG */
|
||||
extern t_u16 cfp_code_index_bg[MRVDRV_MAX_CFP_CODE_BG];
|
||||
/** The table to keep CFP code for A */
|
||||
extern t_u16 cfp_code_index_a[MRVDRV_MAX_CFP_CODE_A];
|
||||
|
||||
/** Set region table */
|
||||
mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u8 band);
|
||||
mlan_status wlan_set_regiontable(mlan_private *pmpriv, t_u8 region, t_u16 band);
|
||||
/** Get radar detection requirements*/
|
||||
t_bool wlan_get_cfp_radar_detect(mlan_private *priv, t_u8 chnl);
|
||||
/** check if scan type is passive for b/g band*/
|
||||
t_bool wlan_bg_scan_type_is_passive(mlan_private *priv, t_u8 chnl);
|
||||
/** check if channel is NO_IR (passive) */
|
||||
t_bool wlan_is_chan_passive(mlan_private *priv, t_u8 band, t_u8 chan);
|
||||
t_bool wlan_is_chan_passive(mlan_private *priv, t_u16 band, t_u8 chan);
|
||||
/** check if channel is disabled */
|
||||
t_bool wlan_is_chan_disabled(mlan_private *priv, t_u8 band, t_u8 chan);
|
||||
t_bool wlan_is_chan_disabled(mlan_private *priv, t_u16 band, t_u8 chan);
|
||||
/** check if channel is blacklisted */
|
||||
t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u8 band, t_u8 chan);
|
||||
t_bool wlan_is_chan_blacklisted(mlan_private *priv, t_u16 band, t_u8 chan);
|
||||
/** set blacklist setting for a channel */
|
||||
t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u8 band, t_u8 chan,
|
||||
t_bool wlan_set_chan_blacklist(mlan_private *priv, t_u16 band, t_u8 chan,
|
||||
t_bool bl);
|
||||
|
||||
dfs_state_t wlan_get_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan);
|
||||
t_void wlan_set_chan_dfs_state(mlan_private *priv, t_u16 band, t_u8 chan,
|
||||
dfs_state_t dfs_state);
|
||||
/* 802.11D related functions */
|
||||
/** Initialize 11D */
|
||||
t_void wlan_11d_priv_init(mlan_private *pmpriv);
|
||||
|
@ -3571,16 +3566,16 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
|
|||
mlan_status wlan_ret_802_11d_domain_info(mlan_private *pmpriv,
|
||||
HostCmd_DS_COMMAND *resp);
|
||||
/** Convert channel to frequency */
|
||||
t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u8 band);
|
||||
t_u32 wlan_11d_chan_2_freq(pmlan_adapter pmadapter, t_u8 chan, t_u16 band);
|
||||
#ifdef STA_SUPPORT
|
||||
/** Set 11D universal table */
|
||||
mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u8 band);
|
||||
mlan_status wlan_11d_set_universaltable(mlan_private *pmpriv, t_u16 band);
|
||||
/** Clear 11D region table */
|
||||
mlan_status wlan_11d_clear_parsedtable(mlan_private *pmpriv);
|
||||
/** Create 11D country information for downloading */
|
||||
mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u8 band);
|
||||
mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u16 band);
|
||||
/** Get scan type from 11D info */
|
||||
t_u8 wlan_11d_get_scan_type(pmlan_adapter pmadapter, t_u8 band, t_u8 chan,
|
||||
t_u8 wlan_11d_get_scan_type(pmlan_adapter pmadapter, t_u16 band, t_u8 chan,
|
||||
parsed_region_chan_11d_t *parsed_region_chan);
|
||||
/** Parse 11D country info */
|
||||
mlan_status wlan_11d_parse_dnld_countryinfo(mlan_private *pmpriv,
|
||||
|
@ -3590,11 +3585,11 @@ mlan_status wlan_11d_prepare_dnld_domain_info_cmd(mlan_private *pmpriv);
|
|||
/** Parse 11D country information into domain info */
|
||||
mlan_status wlan_11d_parse_domain_info(
|
||||
pmlan_adapter pmadapter, IEEEtypes_CountryInfoFullSet_t *country_info,
|
||||
t_u8 band, parsed_region_chan_11d_t *parsed_region_chan);
|
||||
t_u16 band, parsed_region_chan_11d_t *parsed_region_chan);
|
||||
#endif /* STA_SUPPORT */
|
||||
#ifdef UAP_SUPPORT
|
||||
/** Handle 11D domain information from UAP */
|
||||
mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u8 band,
|
||||
mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band,
|
||||
t_u8 *domain_tlv,
|
||||
t_void *pioctl_buf);
|
||||
#endif
|
||||
|
@ -3959,6 +3954,19 @@ mlan_status wlan_ret_802_11_supplicant_pmk(pmlan_private pmpriv,
|
|||
mlan_status wlan_sec_ioctl_passphrase(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
|
||||
mlan_status wlan_cmd_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf);
|
||||
mlan_status wlan_ret_mc_aggr_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req);
|
||||
mlan_status wlan_misc_ioctl_ch_load(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req);
|
||||
mlan_status wlan_cmd_get_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf);
|
||||
mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
|
||||
mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left);
|
||||
|
@ -3980,6 +3988,8 @@ mlan_status wlan_ret_get_tsf(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
|
||||
t_u8 wlan_ft_akm_is_used(mlan_private *pmpriv, t_u8 *rsn_ie);
|
||||
|
||||
mlan_status wlan_clear_fw_roaming_pmk(pmlan_private pmpriv);
|
||||
|
||||
mlan_status wlan_get_rgchnpwr_cfg(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req);
|
||||
mlan_status wlan_get_chan_trpc_cfg(pmlan_adapter pmadapter,
|
||||
|
@ -4044,6 +4054,14 @@ mlan_status wlan_cmd_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
|||
mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
|
||||
mlan_status wlan_misc_ioctl_get_sensor_temp(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req);
|
||||
mlan_status wlan_cmd_get_sensor_temp(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *cmd, t_u16 cmd_action);
|
||||
mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf);
|
||||
|
||||
/**
|
||||
* @brief RA based queueing
|
||||
*
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
* - ENABLE_MEAS
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* @sa mlan_meas.c
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* @brief This file include miscellaneous functions for MLAN module
|
||||
*
|
||||
*
|
||||
* Copyright 2009-2021 NXP
|
||||
* Copyright 2009-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -785,6 +785,8 @@ mlan_status wlan_pm_ioctl_hscfg(pmlan_adapter pmadapter,
|
|||
pmadapter->gpio_wave = pm->param.hs_cfg.gpio_wave;
|
||||
pmadapter->hs_wake_interval =
|
||||
pm->param.hs_cfg.hs_wake_interval;
|
||||
pmadapter->min_wake_holdoff =
|
||||
pm->param.hs_cfg.min_wake_holdoff;
|
||||
}
|
||||
break;
|
||||
case MLAN_ACT_GET:
|
||||
|
@ -802,6 +804,7 @@ mlan_status wlan_pm_ioctl_hscfg(pmlan_adapter pmadapter,
|
|||
pm->param.hs_cfg.ext_gap = pmadapter->ext_gap;
|
||||
pm->param.hs_cfg.gpio_wave = pmadapter->gpio_wave;
|
||||
pm->param.hs_cfg.hs_wake_interval = pmadapter->hs_wake_interval;
|
||||
pm->param.hs_cfg.min_wake_holdoff = pmadapter->min_wake_holdoff;
|
||||
break;
|
||||
default:
|
||||
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
|
||||
|
@ -949,6 +952,54 @@ mlan_status wlan_misc_hal_phy_cfg(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enable/disable CSI support
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING --success,
|
||||
* otherwise fail
|
||||
*/
|
||||
mlan_status wlan_misc_csi(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_ds_misc_cfg *csi_cfg = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
t_u16 cmd_act;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (csi_cfg->param.csi_params.csi_enable == 1) {
|
||||
if (pmadapter->csi_enabled) {
|
||||
PRINTM(MERROR,
|
||||
"Enable CSI: CSI was already enabled.\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
cmd_act = CSI_CMD_ENABLE;
|
||||
} else {
|
||||
if (!pmadapter->csi_enabled) {
|
||||
PRINTM(MERROR,
|
||||
"Disable CSI: CSI was already disabled.\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
cmd_act = CSI_CMD_DISABLE;
|
||||
}
|
||||
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CSI, cmd_act, 0,
|
||||
(t_void *)pioctl_req,
|
||||
&csi_cfg->param.csi_params);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function allocates a mlan_buffer.
|
||||
*
|
||||
|
@ -1586,21 +1637,24 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
|
|||
switch (reg_mem->param.reg_rw.type) {
|
||||
case MLAN_REG_MAC:
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
case MLAN_REG_MAC2:
|
||||
#endif
|
||||
cmd_no = HostCmd_CMD_MAC_REG_ACCESS;
|
||||
break;
|
||||
case MLAN_REG_BBP:
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
case MLAN_REG_BBP2:
|
||||
#endif
|
||||
cmd_no = HostCmd_CMD_BBP_REG_ACCESS;
|
||||
break;
|
||||
case MLAN_REG_RF:
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
case MLAN_REG_RF2:
|
||||
#endif
|
||||
cmd_no = HostCmd_CMD_RF_REG_ACCESS;
|
||||
|
@ -1613,11 +1667,20 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
|
|||
break;
|
||||
case MLAN_REG_BCA:
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
case MLAN_REG_BCA2:
|
||||
#endif
|
||||
cmd_no = HostCmd_CMD_BCA_REG_ACCESS;
|
||||
break;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) || \
|
||||
defined(SD9177)
|
||||
case MLAN_REG_CIU:
|
||||
cmd_no = HostCmd_CMD_REG_ACCESS;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
|
@ -1878,6 +1941,7 @@ int wlan_get_tdls_list(mlan_private *priv, tdls_peer_info *buf)
|
|||
tdls_peer_info *peer_info = buf;
|
||||
sta_node *sta_ptr = MNULL;
|
||||
int count = 0;
|
||||
IEEEtypes_Header_t *ieee_hdr;
|
||||
ENTER();
|
||||
if (priv->bss_type != MLAN_BSS_TYPE_STA) {
|
||||
LEAVE();
|
||||
|
@ -1908,6 +1972,11 @@ int wlan_get_tdls_list(mlan_private *priv, tdls_peer_info *buf)
|
|||
&sta_ptr->vht_cap,
|
||||
sizeof(IEEEtypes_VHTCap_t),
|
||||
sizeof(peer_info->vht_cap));
|
||||
ieee_hdr = (IEEEtypes_Header_t *)peer_info->he_cap;
|
||||
memcpy_ext(priv->adapter, peer_info->he_cap,
|
||||
&sta_ptr->he_cap,
|
||||
sizeof(IEEEtypes_Header_t) + ieee_hdr->len,
|
||||
sizeof(peer_info->he_cap));
|
||||
peer_info++;
|
||||
count++;
|
||||
}
|
||||
|
@ -2523,6 +2592,8 @@ mlan_status wlan_misc_ioctl_tdls_get_ies(pmlan_adapter pmadapter,
|
|||
IEEEtypes_VHTOprat_t *vht_oprat = MNULL;
|
||||
IEEEtypes_AssocRsp_t *passoc_rsp = MNULL;
|
||||
IEEEtypes_AID_t *aid_info = MNULL;
|
||||
IEEEtypes_HECap_t *he_cap = MNULL;
|
||||
IEEEtypes_HeOp_t *he_op = MNULL;
|
||||
t_u8 supp_chan[] = {1, 11};
|
||||
t_u8 regulatory_class[] = {1, /**current class*/
|
||||
1, 2, 3, 4, 12, 22, 23, 24,
|
||||
|
@ -2629,7 +2700,7 @@ mlan_status wlan_misc_ioctl_tdls_get_ies(pmlan_adapter pmadapter,
|
|||
wlan_fill_vht_cap_ie(pmpriv, vht_cap, pbss_desc->bss_band);
|
||||
if (ht_cap)
|
||||
SETHT_SUPPCHANWIDTH(ht_cap->ht_cap.ht_cap_info);
|
||||
DBG_HEXDUMP(MCMD_D, "TDLS vhtcap", tdls_ies->vht_cap,
|
||||
DBG_HEXDUMP(MCMD_D, "TDLS VHT Cap IE", tdls_ies->vht_cap,
|
||||
sizeof(IEEEtypes_VHTCap_t));
|
||||
}
|
||||
/** fill the vhtoperation based on hwspec */
|
||||
|
@ -2646,8 +2717,8 @@ mlan_status wlan_misc_ioctl_tdls_get_ies(pmlan_adapter pmadapter,
|
|||
tdls_ies->vht_oprat,
|
||||
sizeof(IEEEtypes_VHTOprat_t),
|
||||
sizeof(IEEEtypes_VHTOprat_t));
|
||||
DBG_HEXDUMP(MCMD_D, "TDLS vht_oprat", tdls_ies->vht_oprat,
|
||||
sizeof(IEEEtypes_VHTOprat_t));
|
||||
DBG_HEXDUMP(MCMD_D, "TDLS VHT Operation IE",
|
||||
tdls_ies->vht_oprat, sizeof(IEEEtypes_VHTOprat_t));
|
||||
}
|
||||
/** fill the AID info */
|
||||
if (tdls_ies->flags & TDLS_IE_FLAGS_AID) {
|
||||
|
@ -2665,6 +2736,26 @@ mlan_status wlan_misc_ioctl_tdls_get_ies(pmlan_adapter pmadapter,
|
|||
aid_info->AID = wlan_le16_to_cpu(passoc_rsp->a_id);
|
||||
PRINTM(MCMND, "TDLS AID=0x%x\n", aid_info->AID);
|
||||
}
|
||||
/** fill the hecap based on hwspec */
|
||||
if (tdls_ies->flags & TDLS_IE_FLAGS_HECAP) {
|
||||
he_cap = (IEEEtypes_HECap_t *)tdls_ies->he_cap;
|
||||
memset(pmadapter, he_cap, 0, sizeof(IEEEtypes_HECap_t));
|
||||
wlan_fill_he_cap_ie(pmpriv, he_cap, pbss_desc->bss_band);
|
||||
DBG_HEXDUMP(MCMD_D, "TDLS HE Cap IE", tdls_ies->he_cap,
|
||||
sizeof(IEEEtypes_Header_t) + he_cap->ieee_hdr.len);
|
||||
}
|
||||
|
||||
if (tdls_ies->flags & TDLS_IE_FLAGS_HEOP) {
|
||||
he_op = (IEEEtypes_HeOp_t *)tdls_ies->he_op;
|
||||
memset(pmadapter, he_op, 0, sizeof(IEEEtypes_HeOp_t));
|
||||
wlan_fill_he_op_ie(pmpriv, he_op);
|
||||
}
|
||||
if (sta_ptr) {
|
||||
memcpy_ext(pmadapter, &sta_ptr->he_op, tdls_ies->he_op,
|
||||
sizeof(IEEEtypes_HeOp_t), sizeof(IEEEtypes_HeOp_t));
|
||||
DBG_HEXDUMP(MCMD_D, "TDLS HE Operation IE", tdls_ies->he_op,
|
||||
sizeof(IEEEtypes_HeOp_t));
|
||||
}
|
||||
/** fill the htinfo */
|
||||
if (tdls_ies->flags & TDLS_IE_FLAGS_HTINFO) {
|
||||
ht_info = (IEEEtypes_HTInfo_t *)tdls_ies->ht_info;
|
||||
|
@ -3874,7 +3965,8 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
|
|||
/* User input validation */
|
||||
if (IS_STREAM_2X2(pmadapter->feature_control)) {
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmadapter->card_type) ||
|
||||
IS_CARD9097(pmadapter->card_type)) {
|
||||
ant_cfg->tx_antenna &= 0x0303;
|
||||
|
@ -3920,7 +4012,8 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
|
|||
ant_cfg->tx_antenna &= 0x0003;
|
||||
ant_cfg->rx_antenna &= 0x0003;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
}
|
||||
#endif
|
||||
if (!ant_cfg->tx_antenna ||
|
||||
|
@ -5936,6 +6029,72 @@ mlan_status wlan_get_rgchnpwr_cfg(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get/Set mc_aggr_cfg
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
*/
|
||||
mlan_status wlan_misc_ioctl_mc_aggr_cfg(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
cmd_action = pioctl_req->action;
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_MC_AGGR_CFG, cmd_action, 0,
|
||||
(t_void *)pioctl_req,
|
||||
(t_void *)&misc->param.mc_aggr_cfg);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief get channel load
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
*/
|
||||
mlan_status wlan_misc_ioctl_ch_load(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
cmd_action = pioctl_req->action;
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_GET_CH_LOAD, cmd_action, 0,
|
||||
(t_void *)pioctl_req,
|
||||
(t_void *)&misc->param.ch_load);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get CHAN_TPRC setting
|
||||
*
|
||||
|
@ -6056,6 +6215,60 @@ mlan_status wlan_misc_ioctl_fw_dump_event(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Get the network monitor configuration.
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
*/
|
||||
mlan_status wlan_misc_ioctl_net_monitor(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_private *pmpriv;
|
||||
mlan_ds_misc_cfg *misc;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!pioctl_req) {
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
|
||||
if (misc->param.net_mon.enable_net_mon == CHANNEL_SPEC_SNIFFER_MODE) {
|
||||
/* Net monitor IOCTL not allowed in connected state */
|
||||
if (pmpriv->media_connected == MTRUE) {
|
||||
PRINTM(MERROR,
|
||||
"IOCTL not allowed in connected state\n");
|
||||
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_SET)
|
||||
cmd_action = HostCmd_ACT_GEN_SET;
|
||||
else
|
||||
cmd_action = HostCmd_ACT_GEN_GET;
|
||||
|
||||
/* Send command to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_NET_MONITOR,
|
||||
cmd_action, 0, (t_void *)pioctl_req,
|
||||
&misc->param.net_mon);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief config boot sleep
|
||||
*
|
||||
|
@ -6639,3 +6852,31 @@ mlan_status wlan_misc_ioctl_wacp_mode(IN pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
mlan_status wlan_misc_ioctl_get_sensor_temp(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_GET)
|
||||
cmd_action = HostCmd_ACT_GEN_GET;
|
||||
else {
|
||||
PRINTM(MERROR, " Sensor temp only support get operation \n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_DS_GET_SENSOR_TEMP, cmd_action,
|
||||
0, (t_void *)pioctl_req, MNULL);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file declares the exported symbols from MLAN.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -118,7 +118,7 @@ static const struct _mlan_card_info mlan_card_info_pcie8997 = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#ifdef PCIE9097
|
||||
#if defined(PCIE9097) || defined(PCIENW62X)
|
||||
static const struct _mlan_pcie_card_reg mlan_reg_pcie9097_b0 = {
|
||||
.reg_txbd_rdptr = PCIE9098_TXBD_RDPTR,
|
||||
.reg_txbd_wrptr = PCIE9098_TXBD_WRPTR,
|
||||
|
@ -152,7 +152,7 @@ static const struct _mlan_pcie_card_reg mlan_reg_pcie9097_b0 = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
static const struct _mlan_pcie_card_reg mlan_reg_pcie9098 = {
|
||||
.reg_txbd_rdptr = PCIE9098_TXBD_RDPTR,
|
||||
.reg_txbd_wrptr = PCIE9098_TXBD_WRPTR,
|
||||
|
@ -204,7 +204,7 @@ static const struct _mlan_card_info mlan_card_info_pcie9098 = {
|
|||
static mlan_status wlan_pcie_delete_evtbd_ring(pmlan_adapter pmadapter);
|
||||
static mlan_status wlan_pcie_delete_rxbd_ring(pmlan_adapter pmadapter);
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/**
|
||||
* @brief This function init the adma setting
|
||||
*
|
||||
|
@ -542,7 +542,7 @@ static void wlan_pcie_init_adma_ring_size(mlan_adapter *pmadapter)
|
|||
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/**
|
||||
* @brief This function set the host interrupt select mask
|
||||
*
|
||||
|
@ -590,7 +590,7 @@ static mlan_status wlan_pcie_set_host_int_select_mask(mlan_adapter *pmadapter,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/**
|
||||
* @brief This function handles command response completion
|
||||
*
|
||||
|
@ -761,8 +761,9 @@ static mlan_status wlan_disable_pcie_host_int(mlan_adapter *pmadapter)
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if ((pmadapter->card_type == CARD_TYPE_PCIE9098) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIENW62X) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIE9097)) {
|
||||
ret = wlan_pcie_set_host_int_select_mask(pmadapter, MFALSE);
|
||||
if (ret) {
|
||||
|
@ -838,8 +839,9 @@ static mlan_status wlan_enable_pcie_host_int(mlan_adapter *pmadapter)
|
|||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if ((pmadapter->card_type == CARD_TYPE_PCIE9098) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIENW62X) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIE9097)) {
|
||||
ret = wlan_pcie_set_host_int_select_mask(pmadapter, MTRUE);
|
||||
if (ret) {
|
||||
|
@ -868,7 +870,7 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter)
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
pmlan_pcie_data_buf ptx_bd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
padma_dual_desc_buf padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -890,7 +892,7 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter)
|
|||
pmadapter->pcard_pcie->txrx_bd_size;
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
pmadapter->pcard_pcie->txbd_ring_size =
|
||||
sizeof(adma_dual_desc_buf) *
|
||||
|
@ -921,7 +923,7 @@ static mlan_status wlan_pcie_create_txbd_ring(mlan_adapter *pmadapter)
|
|||
|
||||
for (i = 0; i < pmadapter->pcard_pcie->txrx_bd_size; i++) {
|
||||
pmadapter->pcard_pcie->tx_buf_list[i] = MNULL;
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf
|
||||
|
@ -976,7 +978,7 @@ static mlan_status wlan_pcie_delete_txbd_ring(mlan_adapter *pmadapter)
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
mlan_pcie_data_buf *ptx_bd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -1010,7 +1012,7 @@ static mlan_status wlan_pcie_delete_txbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf *)
|
||||
|
@ -1062,7 +1064,7 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter)
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
mlan_pcie_data_buf *prxbd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -1086,7 +1088,7 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/*
|
||||
* driver maintaines the write pointer and firmware maintaines the read
|
||||
* pointer. The read pointer starts at 0 (zero) while the write pointer
|
||||
|
@ -1175,7 +1177,7 @@ static mlan_status wlan_pcie_create_rxbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf
|
||||
|
@ -1214,7 +1216,7 @@ static mlan_status wlan_pcie_delete_rxbd_ring(mlan_adapter *pmadapter)
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
mlan_pcie_data_buf *prxbd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -1245,7 +1247,7 @@ static mlan_status wlan_pcie_delete_rxbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf *)
|
||||
|
@ -1296,7 +1298,7 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter)
|
|||
pmlan_pcie_evt_buf pevtbd_buf;
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -1315,7 +1317,7 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD;
|
||||
pmadapter->pcard_pcie->evtbd_ring_size =
|
||||
|
@ -1386,7 +1388,7 @@ static mlan_status wlan_pcie_create_evtbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf
|
||||
|
@ -1425,7 +1427,7 @@ static mlan_status wlan_pcie_delete_evtbd_ring(mlan_adapter *pmadapter)
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
mlan_pcie_evt_buf *pevtbd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -1455,7 +1457,7 @@ static mlan_status wlan_pcie_delete_evtbd_ring(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf *)
|
||||
|
@ -1652,7 +1654,7 @@ static t_u8 wlan_check_tx_pending_buffer(mlan_adapter *pmadapter, t_u32 rdptr)
|
|||
return MFALSE;
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
if ((pmadapter->pcard_pcie->txbd_rdptr &
|
||||
ADMA_RW_PTR_WRAP_MASK) != (rdptr & ADMA_RW_PTR_WRAP_MASK))
|
||||
|
@ -1686,7 +1688,7 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
|
|||
pmadapter->pcard_pcie->reg->txrx_rw_ptr_rollover_ind;
|
||||
mlan_pcie_data_buf *ptx_bd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
t_u32 wrptr;
|
||||
#endif
|
||||
|
@ -1710,7 +1712,7 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
|
|||
rdptr = rdptr >> TXBD_RW_PTR_START;
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
wrptr = rdptr & 0xffff;
|
||||
rdptr = rdptr >> ADMA_RPTR_START;
|
||||
|
@ -1770,7 +1772,7 @@ static mlan_status wlan_pcie_send_data_complete(mlan_adapter *pmadapter)
|
|||
txrx_rw_ptr_rollover_ind);
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf *)pmadapter->pcard_pcie
|
||||
|
@ -1810,7 +1812,7 @@ done:
|
|||
((wrptr & rollover_ind) == (rdptr & rollover_ind)))
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
#define ADMA_TXBD_IS_FULL(wrptr, rdptr, mask, rollover_ind) \
|
||||
(((wrptr & mask) == (rdptr & mask)) && \
|
||||
((wrptr & rollover_ind) != (rdptr & rollover_ind)))
|
||||
|
@ -1834,7 +1836,7 @@ static t_u8 wlan_check_txbd_not_full(mlan_adapter *pmadapter)
|
|||
return MFALSE;
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
txrx_rw_ptr_mask = pmadapter->pcard_pcie->txrx_bd_size - 1;
|
||||
txrx_rw_ptr_rollover_ind = pmadapter->pcard_pcie->txrx_bd_size;
|
||||
|
@ -1872,7 +1874,7 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type,
|
|||
pmadapter->pcard_pcie->reg->txrx_rw_ptr_rollover_ind;
|
||||
mlan_pcie_data_buf *ptx_bd_buf = MNULL;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf = MNULL;
|
||||
#endif
|
||||
const t_u32 num_tx_buffs = pmadapter->pcard_pcie->txrx_bd_size;
|
||||
|
@ -1952,7 +1954,7 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
wr_ptr_start = ADMA_WPTR_START;
|
||||
padma_bd_buf = (adma_dual_desc_buf *)pmadapter
|
||||
|
@ -2043,7 +2045,7 @@ done_unmap:
|
|||
ptx_bd_buf->offset = 0;
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma && padma_bd_buf) {
|
||||
padma_bd_buf->paddr = 0;
|
||||
padma_bd_buf->len = 0;
|
||||
|
@ -2083,7 +2085,7 @@ static t_u8 wlan_check_rx_pending_buffer(mlan_adapter *pmadapter, t_u32 rdptr)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
if ((pmadapter->pcard_pcie->rxbd_rdptr &
|
||||
ADMA_RW_PTR_WRAP_MASK) != (rdptr & ADMA_RW_PTR_WRAP_MASK))
|
||||
|
@ -2129,7 +2131,7 @@ static t_u8 wlan_is_rx_pending_full(mlan_adapter *pmadapter, t_u32 rdptr)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
PRINTM(MDATA, "local wrptr: 0x%x -> reg rdptr: 0x%x\n",
|
||||
(pmadapter->pcard_pcie->rxbd_wrptr &
|
||||
|
@ -2169,7 +2171,7 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
|
|||
pmadapter->pcard_pcie->reg->txrx_rw_ptr_rollover_ind;
|
||||
mlan_pcie_data_buf *prxbd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
t_u32 in_ts_sec, in_ts_usec;
|
||||
|
@ -2183,7 +2185,7 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
|
|||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
rdptr = rdptr >> ADMA_RPTR_START;
|
||||
#endif
|
||||
|
@ -2341,7 +2343,7 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
|
|||
txbd_val = txbd_val << TXBD_RW_PTR_START;
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf *)pmadapter->pcard_pcie
|
||||
|
@ -2383,7 +2385,7 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter)
|
|||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
rdptr = rdptr >> ADMA_RPTR_START;
|
||||
#endif
|
||||
|
@ -2529,7 +2531,7 @@ static mlan_status wlan_pcie_send_cmd(mlan_adapter *pmadapter,
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
/* To send a command, the driver will:
|
||||
1. driver prepare the cmdrep buffer for adma
|
||||
|
@ -2697,7 +2699,7 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
/* Clear the cmd-rsp buffer address in adma registers.
|
||||
This will prevent firmware from writing to the same
|
||||
|
@ -2765,7 +2767,7 @@ static t_u8 wlan_check_evt_buffer(mlan_adapter *pmadapter, t_u32 rdptr)
|
|||
return MFALSE;
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
if ((pmadapter->pcard_pcie->evtbd_rdptr &
|
||||
ADMA_RW_PTR_WRAP_MASK) != (rdptr & ADMA_RW_PTR_WRAP_MASK))
|
||||
|
@ -2793,7 +2795,7 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter)
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
mlan_pcie_evt_buf *pevtbd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
ENTER();
|
||||
|
@ -2819,7 +2821,7 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter)
|
|||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
rdptr = rdptr >> ADMA_RPTR_START;
|
||||
#endif
|
||||
|
@ -2850,7 +2852,7 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf =
|
||||
(adma_dual_desc_buf *)pmadapter->pcard_pcie
|
||||
|
@ -2899,7 +2901,7 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
pmadapter->pcard_pcie->evtbd_rdptr &=
|
||||
ADMA_RW_PTR_WRAP_MASK;
|
||||
|
@ -2944,7 +2946,7 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter,
|
|||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
mlan_pcie_evt_buf *pevtbd_buf;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
adma_dual_desc_buf *padma_bd_buf;
|
||||
#endif
|
||||
|
||||
|
@ -2968,7 +2970,7 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter,
|
|||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
rdptr = rdptr >> ADMA_RPTR_START;
|
||||
#endif
|
||||
|
@ -2998,7 +3000,7 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter,
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
padma_bd_buf = (adma_dual_desc_buf *)pmadapter
|
||||
->pcard_pcie->evtbd_ring[wrptr];
|
||||
|
@ -3034,7 +3036,7 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter,
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma)
|
||||
pmadapter->pcard_pcie->evtbd_wrptr &= ADMA_RW_PTR_WRAP_MASK;
|
||||
#endif
|
||||
|
@ -3267,6 +3269,10 @@ static mlan_status wlan_pcie_prog_fw_w_helper(mlan_adapter *pmadapter,
|
|||
if (IS_PCIE9097(pmadapter->card_type))
|
||||
check_fw_status = MTRUE;
|
||||
#endif
|
||||
#if defined(PCIENW62X)
|
||||
if (IS_PCIENW62X(pmadapter->card_type))
|
||||
check_fw_status = MTRUE;
|
||||
#endif
|
||||
|
||||
/* Perform firmware data transfer */
|
||||
do {
|
||||
|
@ -3475,18 +3481,21 @@ mlan_status wlan_get_pcie_device(pmlan_adapter pmadapter)
|
|||
pmadapter->pcard_pcie->txrx_bd_size = MAX_TXRX_BD;
|
||||
break;
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
case CARD_TYPE_PCIE9097:
|
||||
case CARD_TYPE_PCIE9098:
|
||||
case CARD_TYPE_PCIENW62X:
|
||||
pmadapter->pcard_pcie->reg = &mlan_reg_pcie9098;
|
||||
pmadapter->pcard_info = &mlan_card_info_pcie9098;
|
||||
pmadapter->pcard_pcie->txrx_bd_size = ADMA_DEF_TXRX_BD;
|
||||
pmadapter->pcard_pcie->txrx_num_desc = TXRX_DEF_NUM_DESC;
|
||||
#ifdef PCIE9097
|
||||
if (card_type == CARD_TYPE_PCIE9097 &&
|
||||
pmadapter->card_rev == CHIP_9097_REV_B0)
|
||||
#if defined(PCIE9097) || defined(PCIENW62X)
|
||||
if ((card_type == CARD_TYPE_PCIE9097 &&
|
||||
pmadapter->card_rev == CHIP_9097_REV_B0) ||
|
||||
(card_type == CARD_TYPE_PCIENW62X))
|
||||
pmadapter->pcard_pcie->reg = &mlan_reg_pcie9097_b0;
|
||||
#endif
|
||||
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
|
@ -3662,7 +3671,7 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter)
|
|||
if (ret)
|
||||
goto done;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld &&
|
||||
(pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) {
|
||||
if (pmadapter->cmd_sent)
|
||||
|
@ -3786,7 +3795,7 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter)
|
|||
if (ret)
|
||||
goto done;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld &&
|
||||
(pcie_ireg &
|
||||
pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) {
|
||||
|
@ -3947,7 +3956,7 @@ static mlan_status wlan_pcie_check_fw_status(mlan_adapter *pmadapter,
|
|||
ret = MLAN_STATUS_SUCCESS;
|
||||
break;
|
||||
} else {
|
||||
wlan_mdelay(pmadapter, 100);
|
||||
wlan_mdelay(pmadapter, 10);
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
}
|
||||
}
|
||||
|
@ -4082,7 +4091,7 @@ mlan_status wlan_pcie_host_to_card(pmlan_private pmpriv, t_u8 type,
|
|||
ret = wlan_pcie_send_data(pmadapter, type, pmbuf, tx_param);
|
||||
else if (type == MLAN_TYPE_CMD)
|
||||
ret = wlan_pcie_send_cmd(pmadapter, pmbuf);
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
else if (type == MLAN_TYPE_VDLL)
|
||||
ret = wlan_pcie_send_vdll(pmadapter, pmbuf);
|
||||
#endif
|
||||
|
@ -4210,8 +4219,9 @@ mlan_status wlan_alloc_pcie_ring_buf(pmlan_adapter pmadapter)
|
|||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if ((pmadapter->card_type == CARD_TYPE_PCIE9098) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIENW62X) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIE9097)) {
|
||||
wlan_pcie_init_adma_ring_size(pmadapter);
|
||||
}
|
||||
|
@ -4267,7 +4277,8 @@ mlan_status wlan_free_pcie_ring_buf(pmlan_adapter pmadapter)
|
|||
pmadapter->pcard_pcie->cmdrsp_buf = MNULL;
|
||||
#ifdef RPTR_MEM_COP
|
||||
if ((pmadapter->card_type == CARD_TYPE_PCIE9098) ||
|
||||
(pmadapter->card_type == CARD_TYPE_PCIE9097))
|
||||
(pmadapter->card_type ==
|
||||
CARD_TYPE_PCIENW62X)(pmadapter->card_type == CARD_TYPE_PCIE9097))
|
||||
wlan_pcie_free_rdptrs(pmadapter);
|
||||
#endif
|
||||
|
||||
|
@ -4351,7 +4362,7 @@ mlan_status wlan_set_pcie_buf_config(mlan_private *pmpriv)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (pmadapter->pcard_pcie->reg->use_adma) {
|
||||
/** config ADMA for Tx Data */
|
||||
wlan_init_adma(pmadapter, ADMA_TX_DATA,
|
||||
|
|
|
@ -182,7 +182,7 @@ Change log:
|
|||
/** PF start bit */
|
||||
#define ADMA_MSIX_PF_BIT 24
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/** PCIE9098 dev_id/vendor id reg */
|
||||
#define PCIE9098_DEV_ID_REG 0x0000
|
||||
/** PCIE revision ID register */
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
* for sending scan commands to the firmware.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -150,9 +150,9 @@ static t_u8 rsn_oui[CIPHER_SUITE_MAX][4] = {
|
|||
* @return Band type conversion of scanBand used in join/assoc cmds
|
||||
*
|
||||
*/
|
||||
t_u8 radio_type_to_band(t_u8 radio_type)
|
||||
t_u16 radio_type_to_band(t_u8 radio_type)
|
||||
{
|
||||
t_u8 ret_band;
|
||||
t_u16 ret_band;
|
||||
|
||||
switch (radio_type) {
|
||||
case BAND_5GHZ:
|
||||
|
@ -375,7 +375,7 @@ static t_u8 is_wpa_oui_present(mlan_adapter *pmadapter,
|
|||
*/
|
||||
static t_u8 wlan_is_band_compatible(t_u8 cfg_band, t_u8 scan_band)
|
||||
{
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
switch (scan_band) {
|
||||
case BAND_A:
|
||||
band = BAND_A | BAND_AN | BAND_AAC;
|
||||
|
@ -466,7 +466,7 @@ static t_u8 wlan_scan_create_channel_list(
|
|||
t_u32 next_chan;
|
||||
t_u8 scan_type;
|
||||
t_u8 radio_type;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
t_u16 scan_dur = 0;
|
||||
|
||||
ENTER();
|
||||
|
@ -573,6 +573,7 @@ static t_u8 wlan_scan_create_channel_list(
|
|||
.chan_scan_mode.passive_to_active_scan =
|
||||
MTRUE;
|
||||
}
|
||||
|
||||
pscan_chan_list[chan_idx].max_scan_time =
|
||||
wlan_cpu_to_le16(scan_dur);
|
||||
|
||||
|
@ -680,6 +681,14 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
t_u32 done_early;
|
||||
t_u32 cmd_no;
|
||||
t_u32 first_chan = 1;
|
||||
t_u8 *ptlv_pos;
|
||||
MrvlIETypes_HTCap_t *pht_cap;
|
||||
|
||||
MrvlIETypes_VHTCap_t *pvht_cap;
|
||||
MrvlIEtypes_Extension_t *phe_cap;
|
||||
t_u16 len = 0;
|
||||
t_u8 radio_type = 0;
|
||||
|
||||
mlan_callbacks *pcb = (mlan_callbacks *)&pmadapter->callbacks;
|
||||
|
||||
ENTER();
|
||||
|
@ -753,7 +762,7 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
MTRUE;
|
||||
first_chan = 0;
|
||||
}
|
||||
|
||||
radio_type = ptmp_chan_list->bandcfg.chanBand;
|
||||
PRINTM(MCMD_D,
|
||||
"Scan: Chan(%3d), bandcfg(%x), Mode(%d,%d), Dur(%d)\n",
|
||||
ptmp_chan_list->chan_number,
|
||||
|
@ -966,9 +975,10 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
|
||||
/* The total scan time should be less than scan command timeout
|
||||
* value */
|
||||
if (total_scan_time > MRVDRV_MAX_TOTAL_SCAN_TIME) {
|
||||
if (!total_scan_time ||
|
||||
total_scan_time > MRVDRV_MAX_TOTAL_SCAN_TIME) {
|
||||
PRINTM(MMSG,
|
||||
"Total scan time %d ms is over limit (%d ms), scan skipped\n",
|
||||
"Total scan time %d ms is invalid, limit (%d ms), scan skipped\n",
|
||||
total_scan_time, MRVDRV_MAX_TOTAL_SCAN_TIME);
|
||||
if (pioctl_req)
|
||||
pioctl_req->status_code =
|
||||
|
@ -976,10 +986,59 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
ret = MLAN_STATUS_FAILURE;
|
||||
break;
|
||||
}
|
||||
ptlv_pos = (t_u8 *)pchan_tlv_out + pchan_tlv_out->header.len +
|
||||
sizeof(MrvlIEtypesHeader_t);
|
||||
|
||||
pchan_tlv_out->header.len =
|
||||
wlan_cpu_to_le16(pchan_tlv_out->header.len);
|
||||
|
||||
if (ISSUPP_11NENABLED(pmpriv->adapter->fw_cap_info) &&
|
||||
(pmpriv->config_bands & BAND_GN ||
|
||||
pmpriv->config_bands & BAND_AN)) {
|
||||
pht_cap = (MrvlIETypes_HTCap_t *)ptlv_pos;
|
||||
memset(pmadapter, pht_cap, 0,
|
||||
sizeof(MrvlIETypes_HTCap_t));
|
||||
pht_cap->header.type = wlan_cpu_to_le16(HT_CAPABILITY);
|
||||
pht_cap->header.len = sizeof(HTCap_t);
|
||||
wlan_fill_ht_cap_tlv(pmpriv, pht_cap,
|
||||
pmpriv->config_bands, MTRUE);
|
||||
HEXDUMP("SCAN: HT_CAPABILITIES IE", (t_u8 *)pht_cap,
|
||||
sizeof(MrvlIETypes_HTCap_t));
|
||||
ptlv_pos += sizeof(MrvlIETypes_HTCap_t);
|
||||
pht_cap->header.len =
|
||||
wlan_cpu_to_le16(pht_cap->header.len);
|
||||
}
|
||||
|
||||
if (ISSUPP_11ACENABLED(pmpriv->adapter->fw_cap_info) &&
|
||||
(pmpriv->config_bands & BAND_AAC)) {
|
||||
pvht_cap = (MrvlIETypes_VHTCap_t *)ptlv_pos;
|
||||
memset(pmadapter, pvht_cap, 0,
|
||||
sizeof(MrvlIETypes_VHTCap_t));
|
||||
pvht_cap->header.type =
|
||||
wlan_cpu_to_le16(VHT_CAPABILITY);
|
||||
pvht_cap->header.len = sizeof(VHT_capa_t);
|
||||
wlan_fill_vht_cap_tlv(pmpriv, pvht_cap,
|
||||
pmpriv->config_bands, MFALSE,
|
||||
MFALSE);
|
||||
HEXDUMP("SCAN: VHT_CAPABILITIES IE", (t_u8 *)pvht_cap,
|
||||
sizeof(MrvlIETypes_VHTCap_t));
|
||||
ptlv_pos += sizeof(MrvlIETypes_VHTCap_t);
|
||||
pvht_cap->header.len =
|
||||
wlan_cpu_to_le16(pvht_cap->header.len);
|
||||
}
|
||||
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter)) {
|
||||
phe_cap = (MrvlIEtypes_Extension_t *)ptlv_pos;
|
||||
len = wlan_fill_he_cap_tlv(pmpriv, pmpriv->config_bands,
|
||||
phe_cap, MFALSE);
|
||||
HEXDUMP("SCAN: HE_CAPABILITIES IE", (t_u8 *)phe_cap,
|
||||
len);
|
||||
ptlv_pos += len;
|
||||
}
|
||||
|
||||
pscan_cfg_out->tlv_buf_len =
|
||||
(t_u32)((t_u8 *)ptlv_pos - pscan_cfg_out->tlv_buf);
|
||||
|
||||
pmadapter->pscan_channels = pstart_chan;
|
||||
|
||||
/* Send the scan command to the firmware with the specified cfg
|
||||
|
@ -1076,13 +1135,8 @@ static mlan_status wlan_scan_setup_scan_config(
|
|||
t_u8 ssid_filter;
|
||||
WLAN_802_11_RATES rates;
|
||||
t_u32 rates_size;
|
||||
MrvlIETypes_HTCap_t *pht_cap;
|
||||
|
||||
MrvlIETypes_VHTCap_t *pvht_cap;
|
||||
MrvlIEtypes_ScanChanGap_t *pscan_gap_tlv;
|
||||
MrvlIEtypes_BssMode_t *pbss_mode;
|
||||
MrvlIEtypes_Extension_t *phe_cap;
|
||||
t_u16 len = 0;
|
||||
t_u8 num_of_channel = 0;
|
||||
|
||||
ENTER();
|
||||
|
@ -1337,43 +1391,6 @@ static mlan_status wlan_scan_setup_scan_config(
|
|||
|
||||
PRINTM(MINFO, "SCAN_CMD: Rates size = %d\n", rates_size);
|
||||
|
||||
if (ISSUPP_11NENABLED(pmpriv->adapter->fw_cap_info) &&
|
||||
(pmpriv->config_bands & BAND_GN ||
|
||||
pmpriv->config_bands & BAND_AN)) {
|
||||
pht_cap = (MrvlIETypes_HTCap_t *)ptlv_pos;
|
||||
memset(pmadapter, pht_cap, 0, sizeof(MrvlIETypes_HTCap_t));
|
||||
pht_cap->header.type = wlan_cpu_to_le16(HT_CAPABILITY);
|
||||
pht_cap->header.len = sizeof(HTCap_t);
|
||||
wlan_fill_ht_cap_tlv(pmpriv, pht_cap, pmpriv->config_bands,
|
||||
MTRUE);
|
||||
HEXDUMP("SCAN: HT_CAPABILITIES IE", (t_u8 *)pht_cap,
|
||||
sizeof(MrvlIETypes_HTCap_t));
|
||||
ptlv_pos += sizeof(MrvlIETypes_HTCap_t);
|
||||
pht_cap->header.len = wlan_cpu_to_le16(pht_cap->header.len);
|
||||
}
|
||||
|
||||
if (ISSUPP_11ACENABLED(pmpriv->adapter->fw_cap_info) &&
|
||||
(pmpriv->config_bands & BAND_AAC)) {
|
||||
pvht_cap = (MrvlIETypes_VHTCap_t *)ptlv_pos;
|
||||
memset(pmadapter, pvht_cap, 0, sizeof(MrvlIETypes_VHTCap_t));
|
||||
pvht_cap->header.type = wlan_cpu_to_le16(VHT_CAPABILITY);
|
||||
pvht_cap->header.len = sizeof(VHT_capa_t);
|
||||
wlan_fill_vht_cap_tlv(pmpriv, pvht_cap, pmpriv->config_bands,
|
||||
MFALSE, MFALSE);
|
||||
HEXDUMP("SCAN: VHT_CAPABILITIES IE", (t_u8 *)pvht_cap,
|
||||
sizeof(MrvlIETypes_VHTCap_t));
|
||||
ptlv_pos += sizeof(MrvlIETypes_VHTCap_t);
|
||||
pvht_cap->header.len = wlan_cpu_to_le16(pvht_cap->header.len);
|
||||
}
|
||||
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter) &&
|
||||
(pmpriv->config_bands & BAND_AAX)) {
|
||||
phe_cap = (MrvlIEtypes_Extension_t *)ptlv_pos;
|
||||
len = wlan_fill_he_cap_tlv(pmpriv, BAND_A, phe_cap, MFALSE);
|
||||
HEXDUMP("SCAN: HE_CAPABILITIES IE", (t_u8 *)phe_cap, len);
|
||||
ptlv_pos += len;
|
||||
}
|
||||
|
||||
if (wlan_is_ext_capa_support(pmpriv))
|
||||
wlan_add_ext_capa_info_ie(pmpriv, MNULL, &ptlv_pos);
|
||||
if (pmpriv->adapter->ecsa_enable) {
|
||||
|
@ -1480,7 +1497,9 @@ static mlan_status wlan_scan_setup_scan_config(
|
|||
}
|
||||
}
|
||||
|
||||
if (wlan_is_chan_passive(pmpriv, radio_type, channel)) {
|
||||
if (wlan_is_chan_passive(pmpriv,
|
||||
radio_type_to_band(radio_type),
|
||||
channel)) {
|
||||
/* do not send probe requests on this channel */
|
||||
scan_type = MLAN_SCAN_TYPE_PASSIVE;
|
||||
}
|
||||
|
@ -1576,8 +1595,6 @@ static mlan_status wlan_scan_setup_scan_config(
|
|||
*pfiltered_scan);
|
||||
PRINTM(MCMND, "Scan: Creating full region channel list %d\n",
|
||||
num_of_channel);
|
||||
if (num_of_channel > MRVDRV_MAX_CHANNELS_PER_SCAN)
|
||||
pmadapter->ext_scan_type = EXT_SCAN_DEFAULT;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
|
@ -4193,28 +4210,18 @@ mlan_status wlan_scan_networks(mlan_private *pmpriv, t_void *pioctl_buf,
|
|||
|
||||
/* Get scan command from scan_pending_q and put to cmd_pending_q */
|
||||
if (ret == MLAN_STATUS_SUCCESS) {
|
||||
if (pmadapter->ext_scan && pmadapter->ext_scan_enh &&
|
||||
pmadapter->ext_scan_type == EXT_SCAN_ENHANCE) {
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
if (util_peek_list(pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q, MNULL, MNULL)) {
|
||||
pcmd_node = (cmd_ctrl_node *)util_dequeue_list(
|
||||
pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q, MNULL, MNULL);
|
||||
pmadapter->pscan_ioctl_req = pioctl_req;
|
||||
pmadapter->scan_processing = MTRUE;
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
} else {
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
if (util_peek_list(pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q, MNULL,
|
||||
MNULL)) {
|
||||
pcmd_node = (cmd_ctrl_node *)util_dequeue_list(
|
||||
pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q, MNULL,
|
||||
MNULL);
|
||||
pmadapter->pscan_ioctl_req = pioctl_req;
|
||||
pmadapter->scan_processing = MTRUE;
|
||||
wlan_insert_cmd_to_pending_q(pmadapter,
|
||||
pcmd_node, MTRUE);
|
||||
}
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node,
|
||||
MTRUE);
|
||||
}
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
}
|
||||
if (pscan_cfg_out)
|
||||
pcb->moal_mfree(pmadapter->pmoal_handle, (t_u8 *)pscan_cfg_out);
|
||||
|
@ -4476,7 +4483,7 @@ mlan_status wlan_ret_802_11_scan(mlan_private *pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
chan_freq_power_t *cfp;
|
||||
MrvlIEtypes_ChanBandListParamSet_t *pchan_band_tlv = MNULL;
|
||||
ChanBandParamSet_t *pchan_band;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
t_u8 is_bgscan_resp;
|
||||
t_u32 age_ts_usec;
|
||||
t_u8 null_ssid[MLAN_MAX_SSID_LENGTH] = {0};
|
||||
|
@ -4598,7 +4605,7 @@ mlan_status wlan_ret_802_11_scan(mlan_private *pmpriv, HostCmd_DS_COMMAND *resp,
|
|||
bss_new_entry->bss_band = band;
|
||||
bss_new_entry->age_in_secs = pmadapter->age_in_secs;
|
||||
cfp = wlan_find_cfp_by_band_and_channel(
|
||||
pmadapter, (t_u8)bss_new_entry->bss_band,
|
||||
pmadapter, bss_new_entry->bss_band,
|
||||
(t_u16)bss_new_entry->channel);
|
||||
if (cfp)
|
||||
bss_new_entry->freq = cfp->freq;
|
||||
|
@ -5509,7 +5516,7 @@ static mlan_status wlan_parse_ext_scan_result(mlan_private *pmpriv,
|
|||
MrvlIEtypes_Data_t *ptlv = MNULL;
|
||||
MrvlIEtypes_Bss_Scan_Rsp_t *pscan_rsp_tlv = MNULL;
|
||||
MrvlIEtypes_Bss_Scan_Info_t *pscan_info_tlv = MNULL;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
t_u32 age_ts_usec;
|
||||
|
||||
ENTER();
|
||||
|
@ -5666,7 +5673,7 @@ static mlan_status wlan_parse_ext_scan_result(mlan_private *pmpriv,
|
|||
bss_new_entry->age_in_secs = pmadapter->age_in_secs;
|
||||
|
||||
cfp = wlan_find_cfp_by_band_and_channel(
|
||||
pmadapter, (t_u8)bss_new_entry->bss_band,
|
||||
pmadapter, bss_new_entry->bss_band,
|
||||
(t_u16)bss_new_entry->channel);
|
||||
if (cfp)
|
||||
bss_new_entry->freq = cfp->freq;
|
||||
|
@ -5849,6 +5856,7 @@ mlan_status wlan_handle_event_ext_scan_status(mlan_private *pmpriv,
|
|||
MrvlIEtypesHeader_t *tlv;
|
||||
MrvlIEtypes_ChannelStats_t *tlv_chan_stats;
|
||||
t_u8 status;
|
||||
cmd_ctrl_node *pcmd_node = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -5892,6 +5900,46 @@ mlan_status wlan_handle_event_ext_scan_status(mlan_private *pmpriv,
|
|||
}
|
||||
|
||||
done:
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
if (util_peek_list(pmadapter->pmoal_handle, &pmadapter->scan_pending_q,
|
||||
MNULL, MNULL)) {
|
||||
/* If firmware not ready, do not issue any more scan
|
||||
* commands */
|
||||
if (pmadapter->hw_status != WlanHardwareStatusReady) {
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
/* Flush all pending scan commands */
|
||||
wlan_flush_scan_queue(pmadapter);
|
||||
wlan_request_cmd_lock(pmadapter);
|
||||
pmadapter->scan_processing = MFALSE;
|
||||
pioctl_req = pmadapter->pscan_ioctl_req;
|
||||
pmadapter->pscan_ioctl_req = MNULL;
|
||||
/* Indicate IOCTL complete */
|
||||
if (pioctl_req != MNULL) {
|
||||
pioctl_req->status_code =
|
||||
MLAN_ERROR_FW_NOT_READY;
|
||||
|
||||
/* Indicate ioctl complete */
|
||||
pcb->moal_ioctl_complete(
|
||||
pmadapter->pmoal_handle,
|
||||
(pmlan_ioctl_req)pioctl_req,
|
||||
MLAN_STATUS_FAILURE);
|
||||
}
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
} else {
|
||||
/* Get scan command from scan_pending_q and put
|
||||
* to cmd_pending_q */
|
||||
pcmd_node = (cmd_ctrl_node *)util_dequeue_list(
|
||||
pmadapter->pmoal_handle,
|
||||
&pmadapter->scan_pending_q, MNULL, MNULL);
|
||||
wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node,
|
||||
MTRUE);
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
}
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
wlan_release_cmd_lock(pmadapter);
|
||||
|
||||
/* Now we got response from FW, cancel the command timer */
|
||||
if (!pmadapter->curr_cmd && pmadapter->cmd_timer_is_set) {
|
||||
/* Cancel command timeout timer */
|
||||
|
@ -5995,7 +6043,7 @@ wlan_bgscan_create_channel_list(mlan_private *pmpriv,
|
|||
t_u32 next_chan;
|
||||
t_u8 scan_type;
|
||||
t_u8 radio_type;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -6154,7 +6202,7 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
|
|||
t_u8 radio_type;
|
||||
t_u16 scan_dur;
|
||||
t_u8 scan_type;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
const t_u8 zero_mac[6] = {0, 0, 0, 0, 0, 0};
|
||||
|
||||
ENTER();
|
||||
|
@ -6378,10 +6426,10 @@ mlan_status wlan_cmd_bgscan_config(mlan_private *pmpriv,
|
|||
pvht_cap->header.len = wlan_cpu_to_le16(pvht_cap->header.len);
|
||||
}
|
||||
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter) &&
|
||||
(pmpriv->config_bands & BAND_AAX)) {
|
||||
if (IS_FW_SUPPORT_11AX(pmadapter)) {
|
||||
phe_cap = (MrvlIEtypes_Extension_t *)tlv;
|
||||
len = wlan_fill_he_cap_tlv(pmpriv, BAND_A, phe_cap, MFALSE);
|
||||
len = wlan_fill_he_cap_tlv(pmpriv, pmpriv->config_bands,
|
||||
phe_cap, MFALSE);
|
||||
DBG_HEXDUMP(MCMD_D, "BGSCAN: HE_CAPABILITIES IE",
|
||||
(t_u8 *)phe_cap, len);
|
||||
tlv += len;
|
||||
|
|
|
@ -221,8 +221,8 @@ static const struct _mlan_card_info mlan_card_info_sd8897 = {
|
|||
#endif
|
||||
|
||||
#if defined(SD8977) || defined(SD8997) || defined(SD8987) || \
|
||||
defined(SD9098) || defined(SD9097) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
defined(SD9098) || defined(SD9097) || defined(SDNW62X) || \
|
||||
defined(SD8978) || defined(SD9177)
|
||||
static const struct _mlan_sdio_card_reg mlan_reg_sd8977_sd8997 = {
|
||||
.start_rd_port = 0,
|
||||
.start_wr_port = 0,
|
||||
|
@ -309,6 +309,17 @@ static const struct _mlan_card_info mlan_card_info_sd9097 = {
|
|||
.default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef SDNW62X
|
||||
static const struct _mlan_card_info mlan_card_info_sdnw62x = {
|
||||
.max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K,
|
||||
.v16_fw_api = 1,
|
||||
.v17_fw_api = 1,
|
||||
.supp_ps_handshake = 0,
|
||||
.default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2,
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef SD9098
|
||||
static const struct _mlan_card_info mlan_card_info_sd9098 = {
|
||||
.max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K,
|
||||
|
@ -1024,14 +1035,12 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw,
|
|||
check_fw_status = MTRUE;
|
||||
}
|
||||
#endif
|
||||
#if defined(SD9097)
|
||||
if (IS_SD9097(pmadapter->card_type))
|
||||
check_fw_status = MTRUE;
|
||||
#endif
|
||||
#if defined(SD9177)
|
||||
if (IS_SD9177(pmadapter->card_type))
|
||||
#if defined(SD9097) || defined(SD9177) || defined(SDNW62X)
|
||||
if (IS_SD9097(pmadapter->card_type) ||
|
||||
IS_SDNW62X(pmadapter->card_type) || IS_SD9177(pmadapter->card_type))
|
||||
check_fw_status = MTRUE;
|
||||
#endif
|
||||
|
||||
/* Perform firmware data transfer */
|
||||
do {
|
||||
/* The host polls for the DN_LD_CARD_RDY and CARD_IO_READY bits
|
||||
|
@ -2408,6 +2417,12 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter)
|
|||
pmadapter->pcard_info = &mlan_card_info_sd9097;
|
||||
break;
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
case CARD_TYPE_SDNW62X:
|
||||
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
|
||||
pmadapter->pcard_info = &mlan_card_info_sdnw62x;
|
||||
break;
|
||||
#endif
|
||||
#ifdef SD9177
|
||||
case CARD_TYPE_SD9177:
|
||||
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
|
||||
|
@ -3017,7 +3032,7 @@ exit:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if (defined(SD9098) || defined(SD9097) || defined(SD9177))
|
||||
#if (defined(SD9098) || defined(SD9097) || defined(SDNW62X) || defined(SD9177))
|
||||
/**
|
||||
* @brief This function sends vdll data to the card.
|
||||
*
|
||||
|
@ -3078,7 +3093,7 @@ static mlan_status wlan_sdio_host_to_card_ext(pmlan_private pmpriv, t_u8 type,
|
|||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_adapter *pmadapter = pmpriv->adapter;
|
||||
|
||||
#if (defined(SD9098) || defined(SD9097) || defined(SD9177))
|
||||
#if (defined(SD9098) || defined(SD9097) || defined(SDNW62X) || defined(SD9177))
|
||||
if (type == MLAN_TYPE_VDLL)
|
||||
return wlan_sdio_send_vdll(pmadapter, pmbuf);
|
||||
#endif
|
||||
|
@ -3541,8 +3556,8 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
|
|||
goto done;
|
||||
}
|
||||
#if defined(SD8997) || defined(SD8977) || defined(SD8987) || \
|
||||
defined(SD9098) || defined(SD9097) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
defined(SD9098) || defined(SD9097) || defined(SDNW62X) || \
|
||||
defined(SD8978) || defined(SD9177)
|
||||
if (MFALSE
|
||||
#ifdef SD8997
|
||||
|| IS_SD8997(pmadapter->card_type)
|
||||
|
@ -3562,6 +3577,9 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
|
|||
#ifdef SD9097
|
||||
|| IS_SD9097(pmadapter->card_type)
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
|| IS_SDNW62X(pmadapter->card_type)
|
||||
#endif
|
||||
#ifdef SD9177
|
||||
|| IS_SD9177(pmadapter->card_type)
|
||||
#endif
|
||||
|
|
|
@ -481,24 +481,40 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter)
|
|||
memset(pmadapter, pmadapter->priv[0], 0, sizeof(mlan_private));
|
||||
|
||||
pmadapter->priv[0]->adapter = pmadapter;
|
||||
pmadapter->priv[0]->bss_type = (t_u8)pmdevice->bss_attr[0].bss_type;
|
||||
pmadapter->priv[0]->frame_type = (t_u8)pmdevice->bss_attr[0].frame_type;
|
||||
pmadapter->priv[0]->bss_priority =
|
||||
(t_u8)pmdevice->bss_attr[0].bss_priority;
|
||||
if (pmdevice->bss_attr[0].bss_type == MLAN_BSS_TYPE_STA)
|
||||
if (pmdevice->drv_mode & DRV_MODE_MASK) {
|
||||
/* Save bss_type, frame_type & bss_priority */
|
||||
pmadapter->priv[0]->bss_type = 0xff;
|
||||
pmadapter->priv[0]->frame_type = MLAN_DATA_FRAME_TYPE_ETH_II;
|
||||
pmadapter->priv[0]->bss_priority = 0;
|
||||
pmadapter->priv[0]->bss_role = MLAN_BSS_ROLE_STA;
|
||||
else if (pmdevice->bss_attr[0].bss_type == MLAN_BSS_TYPE_UAP)
|
||||
pmadapter->priv[0]->bss_role = MLAN_BSS_ROLE_UAP;
|
||||
|
||||
/* Save bss_index and bss_num */
|
||||
pmadapter->priv[0]->bss_index = 0;
|
||||
pmadapter->priv[0]->bss_num = 0xff;
|
||||
} else {
|
||||
pmadapter->priv[0]->bss_type =
|
||||
(t_u8)pmdevice->bss_attr[0].bss_type;
|
||||
pmadapter->priv[0]->frame_type =
|
||||
(t_u8)pmdevice->bss_attr[0].frame_type;
|
||||
pmadapter->priv[0]->bss_priority =
|
||||
(t_u8)pmdevice->bss_attr[0].bss_priority;
|
||||
if (pmdevice->bss_attr[0].bss_type == MLAN_BSS_TYPE_STA)
|
||||
pmadapter->priv[0]->bss_role = MLAN_BSS_ROLE_STA;
|
||||
else if (pmdevice->bss_attr[0].bss_type == MLAN_BSS_TYPE_UAP)
|
||||
pmadapter->priv[0]->bss_role = MLAN_BSS_ROLE_UAP;
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
else if (pmdevice->bss_attr[0].bss_type == MLAN_BSS_TYPE_WIFIDIRECT) {
|
||||
pmadapter->priv[0]->bss_role = MLAN_BSS_ROLE_STA;
|
||||
if (pmdevice->bss_attr[0].bss_virtual)
|
||||
pmadapter->priv[0]->bss_virtual = MTRUE;
|
||||
}
|
||||
else if (pmdevice->bss_attr[0].bss_type ==
|
||||
MLAN_BSS_TYPE_WIFIDIRECT) {
|
||||
pmadapter->priv[0]->bss_role = MLAN_BSS_ROLE_STA;
|
||||
if (pmdevice->bss_attr[0].bss_virtual)
|
||||
pmadapter->priv[0]->bss_virtual = MTRUE;
|
||||
}
|
||||
#endif
|
||||
/* Save bss_index and bss_num */
|
||||
pmadapter->priv[0]->bss_index = 0;
|
||||
pmadapter->priv[0]->bss_num = (t_u8)pmdevice->bss_attr[0].bss_num;
|
||||
/* Save bss_index and bss_num */
|
||||
pmadapter->priv[0]->bss_index = 0;
|
||||
pmadapter->priv[0]->bss_num =
|
||||
(t_u8)pmdevice->bss_attr[0].bss_num;
|
||||
}
|
||||
|
||||
/* init function table */
|
||||
for (j = 0; mlan_ops[j]; j++) {
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
* it is ready.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -291,6 +291,16 @@ static mlan_status wlan_cmd_802_11_snmp_mib(pmlan_private pmpriv,
|
|||
cmd->size += sizeof(t_u8);
|
||||
}
|
||||
break;
|
||||
case ChanTrackParam_i:
|
||||
psnmp_mib->oid = wlan_cpu_to_le16((t_u16)ChanTrackParam_i);
|
||||
if (cmd_action == HostCmd_ACT_GEN_SET) {
|
||||
psnmp_mib->query_type =
|
||||
wlan_cpu_to_le16(HostCmd_ACT_GEN_SET);
|
||||
psnmp_mib->buf_size = wlan_cpu_to_le16(sizeof(t_u8));
|
||||
psnmp_mib->value[0] = *(t_u8 *)pdata_buf;
|
||||
cmd->size += sizeof(t_u8);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -1620,6 +1630,11 @@ static mlan_status wlan_cmd_mgmt_ie_list(pmlan_private pmpriv,
|
|||
pmgmt_ie_list->ds_mgmt_ie.len = wlan_cpu_to_le16(cust_ie->len);
|
||||
|
||||
req_len = cust_ie->len;
|
||||
if (req_len > sizeof(cust_ie->ie_data_list)) {
|
||||
PRINTM(MERROR, "Invalid cust_ie->len=%d\n", req_len);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
travel_len = 0;
|
||||
/* conversion for index, mask, len */
|
||||
if (req_len == sizeof(t_u16))
|
||||
|
@ -1864,6 +1879,8 @@ static mlan_status wlan_cmd_tdls_oper(pmlan_private pmpriv,
|
|||
MrvlIETypes_VHTCap_t *VHTcap_tlv = MNULL;
|
||||
MrvlIETypes_VHTOprat_t *VHTOper_tlv = MNULL;
|
||||
MrvlIETypes_AID_t *AidInfo = MNULL;
|
||||
MrvlIEtypes_Extension_t *hecap_tlv = MNULL;
|
||||
MrvlIEtypes_He_Op_t *heop_tlv = MNULL;
|
||||
MrvlIEtypes_TDLS_Idle_Timeout_t *TdlsIdleTimeout = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
@ -2058,6 +2075,7 @@ static mlan_status wlan_cmd_tdls_oper(pmlan_private pmpriv,
|
|||
sta_ptr->aid_info.ieee_hdr.len);
|
||||
AidInfo->AID = wlan_cpu_to_le16(
|
||||
sta_ptr->aid_info.AID);
|
||||
travel_len += sizeof(MrvlIETypes_AID_t);
|
||||
}
|
||||
/* Vht capability */
|
||||
if (sta_ptr->vht_cap.ieee_hdr.element_id ==
|
||||
|
@ -2087,7 +2105,8 @@ static mlan_status wlan_cmd_tdls_oper(pmlan_private pmpriv,
|
|||
pbss_desc->bss_band, MTRUE,
|
||||
MTRUE);
|
||||
DBG_HEXDUMP(
|
||||
MCMD_D, "FW Vhtcap",
|
||||
MCMD_D,
|
||||
"TDLS Config Link: VHT Capability",
|
||||
(t_u8 *)VHTcap_tlv,
|
||||
sizeof(MrvlIETypes_VHTCap_t));
|
||||
}
|
||||
|
@ -2104,15 +2123,82 @@ static mlan_status wlan_cmd_tdls_oper(pmlan_private pmpriv,
|
|||
&VHTOper_tlv->chan_width,
|
||||
&sta_ptr->vht_oprat.chan_width,
|
||||
sta_ptr->vht_oprat.ieee_hdr.len,
|
||||
sizeof(VHTOper_tlv->chan_width));
|
||||
(sizeof(MrvlIETypes_VHTOprat_t) -
|
||||
sizeof(MrvlIEtypesHeader_t)));
|
||||
VHTOper_tlv->basic_MCS_map = wlan_cpu_to_le16(
|
||||
VHTOper_tlv->basic_MCS_map);
|
||||
travel_len += sta_ptr->vht_oprat.ieee_hdr.len +
|
||||
sizeof(MrvlIEtypesHeader_t);
|
||||
DBG_HEXDUMP(MCMD_D, "VHT operation",
|
||||
DBG_HEXDUMP(MCMD_D,
|
||||
"TDLS Config Link: VHT operation",
|
||||
(t_u8 *)VHTOper_tlv,
|
||||
sizeof(MrvlIETypes_VHTOprat_t));
|
||||
}
|
||||
/* Check if we need enable the 11AX */
|
||||
if (sta_ptr &&
|
||||
(sta_ptr->he_op.ieee_hdr.element_id == EXTENSION) &&
|
||||
(sta_ptr->he_op.ext_id == HE_OPERATION)) {
|
||||
/* HE Capability */
|
||||
hecap_tlv =
|
||||
(MrvlIEtypes_Extension_t *)(pos +
|
||||
travel_len);
|
||||
/* fill the peer HE CAP IE */
|
||||
memcpy_ext(pmpriv->adapter, &hecap_tlv->ext_id,
|
||||
&sta_ptr->tdls_he_cap.ext_id,
|
||||
sta_ptr->tdls_he_cap.ieee_hdr.len,
|
||||
sizeof(MrvlIEtypes_He_cap_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
hecap_tlv->type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_EXTENSION_ID);
|
||||
hecap_tlv->len = MIN(
|
||||
sta_ptr->tdls_he_cap.ieee_hdr.len,
|
||||
sizeof(MrvlIEtypes_He_cap_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
hecap_tlv->len =
|
||||
wlan_cpu_to_le16(hecap_tlv->len);
|
||||
#if 0
|
||||
wlan_fill_he_cap_tlv(pmpriv,
|
||||
pmpriv->config_bands,
|
||||
hecap_tlv, MFALSE);
|
||||
#endif
|
||||
|
||||
travel_len += wlan_le16_to_cpu(hecap_tlv->len) +
|
||||
sizeof(MrvlIEtypesHeader_t);
|
||||
|
||||
DBG_HEXDUMP(
|
||||
MCMD_D,
|
||||
"TDLS Config Link: HE Capability",
|
||||
(t_u8 *)hecap_tlv,
|
||||
wlan_le16_to_cpu(hecap_tlv->len) +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
|
||||
/* HE Operation */
|
||||
heop_tlv = (MrvlIEtypes_He_Op_t *)(pos +
|
||||
travel_len);
|
||||
heop_tlv->header.type =
|
||||
wlan_cpu_to_le16(EXTENSION);
|
||||
heop_tlv->header.len = wlan_cpu_to_le16(
|
||||
sta_ptr->he_op.ieee_hdr.len);
|
||||
memcpy_ext(pmpriv->adapter, &heop_tlv->ext_id,
|
||||
&sta_ptr->he_op.ext_id,
|
||||
sta_ptr->he_op.ieee_hdr.len,
|
||||
sizeof(MrvlIEtypes_He_Op_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
heop_tlv->he_op_param1 = wlan_cpu_to_le16(
|
||||
heop_tlv->he_op_param1);
|
||||
heop_tlv->basic_he_mcs_nss = wlan_cpu_to_le16(
|
||||
heop_tlv->basic_he_mcs_nss);
|
||||
travel_len +=
|
||||
wlan_le16_to_cpu(heop_tlv->header.len) +
|
||||
sizeof(MrvlIEtypesHeader_t);
|
||||
DBG_HEXDUMP(
|
||||
MCMD_D,
|
||||
"TDLS Config Link: HE Operation",
|
||||
(t_u8 *)heop_tlv,
|
||||
wlan_le16_to_cpu(heop_tlv->header.len) +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
}
|
||||
|
||||
TdlsIdleTimeout =
|
||||
(MrvlIEtypes_TDLS_Idle_Timeout_t *)(pos +
|
||||
travel_len);
|
||||
|
@ -2516,6 +2602,87 @@ static mlan_status wlan_cmd_inactivity_timeout(HostCmd_DS_COMMAND *cmd,
|
|||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares network monitor command
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @param cmd_action the action: GET or SET
|
||||
* @param pdata_buf A pointer to data buffer
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_cmd_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf)
|
||||
{
|
||||
mlan_ds_misc_net_monitor *net_mon;
|
||||
HostCmd_DS_802_11_NET_MONITOR *cmd_net_mon = &cmd->params.net_mon;
|
||||
ChanBandParamSet_t *pchan_band = MNULL;
|
||||
t_u8 sec_chan_offset = 0;
|
||||
t_u32 bw_offset = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
net_mon = (mlan_ds_misc_net_monitor *)pdata_buf;
|
||||
|
||||
cmd->size = wlan_cpu_to_le16(S_DS_GEN +
|
||||
sizeof(HostCmd_DS_802_11_NET_MONITOR));
|
||||
cmd->command = wlan_cpu_to_le16(cmd->command);
|
||||
cmd_net_mon->action = wlan_cpu_to_le16(cmd_action);
|
||||
if (cmd_action == HostCmd_ACT_GEN_SET) {
|
||||
cmd_net_mon->enable_net_mon =
|
||||
wlan_cpu_to_le16((t_u16)net_mon->enable_net_mon);
|
||||
if (net_mon->enable_net_mon) {
|
||||
pchan_band =
|
||||
&cmd_net_mon->monitor_chan.chan_band_param[0];
|
||||
cmd_net_mon->filter_flag =
|
||||
wlan_cpu_to_le16((t_u16)net_mon->filter_flag);
|
||||
cmd_net_mon->monitor_chan.header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_CHANNELBANDLIST);
|
||||
cmd_net_mon->monitor_chan.header.len =
|
||||
wlan_cpu_to_le16(sizeof(ChanBandParamSet_t));
|
||||
pchan_band->chan_number = (t_u8)net_mon->channel;
|
||||
pchan_band->bandcfg.chanBand =
|
||||
wlan_band_to_radio_type((t_u16)net_mon->band);
|
||||
|
||||
if (net_mon->band & BAND_GN ||
|
||||
net_mon->band & BAND_AN ||
|
||||
net_mon->band & BAND_GAC ||
|
||||
net_mon->band & BAND_AAC) {
|
||||
bw_offset = net_mon->chan_bandwidth;
|
||||
if (bw_offset == CHANNEL_BW_40MHZ_ABOVE) {
|
||||
pchan_band->bandcfg.chan2Offset =
|
||||
SEC_CHAN_ABOVE;
|
||||
pchan_band->bandcfg.chanWidth =
|
||||
CHAN_BW_40MHZ;
|
||||
} else if (bw_offset ==
|
||||
CHANNEL_BW_40MHZ_BELOW) {
|
||||
pchan_band->bandcfg.chan2Offset =
|
||||
SEC_CHAN_BELOW;
|
||||
pchan_band->bandcfg.chanWidth =
|
||||
CHAN_BW_40MHZ;
|
||||
} else if (bw_offset == CHANNEL_BW_80MHZ) {
|
||||
sec_chan_offset =
|
||||
wlan_get_second_channel_offset(
|
||||
pmpriv,
|
||||
net_mon->channel);
|
||||
if (sec_chan_offset == SEC_CHAN_ABOVE)
|
||||
pchan_band->bandcfg.chan2Offset =
|
||||
SEC_CHAN_ABOVE;
|
||||
else if (sec_chan_offset ==
|
||||
SEC_CHAN_BELOW)
|
||||
pchan_band->bandcfg.chan2Offset =
|
||||
SEC_CHAN_BELOW;
|
||||
pchan_band->bandcfg.chanWidth =
|
||||
CHAN_BW_80MHZ;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares Low Power Mode
|
||||
*
|
||||
|
@ -2670,25 +2837,6 @@ static mlan_status wlan_cmd_coalesce_config(pmlan_private pmpriv,
|
|||
* Global Functions
|
||||
********************************************************/
|
||||
|
||||
static mlan_status wlan_cmd_get_sensor_temp(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action)
|
||||
{
|
||||
ENTER();
|
||||
|
||||
if (cmd_action != HostCmd_ACT_GEN_GET) {
|
||||
PRINTM(MERROR, "wlan_cmd_get_sensor_temp: support GET only.\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_DS_GET_SENSOR_TEMP);
|
||||
cmd->size = wlan_cpu_to_le16(S_DS_GEN + 4);
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepares command of arb cfg
|
||||
*
|
||||
|
@ -2821,6 +2969,379 @@ static mlan_status wlan_cmd_sta_config(pmlan_private pmpriv,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepare the config tlvs of roam offload.
|
||||
*
|
||||
* @param priv A pointer to mlan_private structure
|
||||
* @param tlv_no TLV type
|
||||
* @param value Pointer to mlan_ds_misc_roam_offload structure
|
||||
* @param pointer Value of trigger_condition
|
||||
* @param size Pointer to the buffer of HostCmd_DS_ROAM_OFFLOAD
|
||||
* @return N/A
|
||||
*/
|
||||
static t_u16 mlan_prepare_roam_offload_tlv(pmlan_private pmpriv, t_u32 type,
|
||||
mlan_ds_misc_roam_offload *roam,
|
||||
t_u8 trigger_condition, t_u8 *pos)
|
||||
{
|
||||
MrvlIEtypes_fw_roam_enable_t *enable_tlv = MNULL;
|
||||
MrvlIEtypes_fw_roam_trigger_condition_t *trigger_condition_tlv = MNULL;
|
||||
MrvlIEtypes_Bssid_t *bssid_tlv = MNULL;
|
||||
MrvlIEtypes_SsIdParamSet_t *ssid_tlv = MNULL;
|
||||
MrvlIEtypes_fw_roam_retry_count_t *retry_count_tlv = MNULL;
|
||||
MrvlIEtypes_para_rssi_t *rssi_para_tlv = MNULL;
|
||||
MrvlIEtypes_fw_roam_bgscan_setting_t *bgscan_set_tlv = MNULL;
|
||||
MrvlIEtypes_roam_blacklist_t *blacklist_tlv = MNULL;
|
||||
MrvlIEtypes_ees_param_set_t *ees_param_tlv = MNULL;
|
||||
MrvlIEtypes_band_rssi_t *band_rssi_tlv = MNULL;
|
||||
MrvlIEtypes_beacon_miss_threshold_t *bcn_miss_threshold_tlv = MNULL;
|
||||
MrvlIEtypes_pre_beacon_miss_threshold_t *pre_bcn_miss_threshold_tlv =
|
||||
MNULL;
|
||||
MrvlIEtypes_RepeatCount_t *tlv_repeat = MNULL;
|
||||
t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0}, *begin;
|
||||
int i = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
begin = pos;
|
||||
if (type & FW_ROAM_ENABLE) {
|
||||
enable_tlv = (MrvlIEtypes_fw_roam_enable_t *)pos;
|
||||
enable_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_ROAM);
|
||||
enable_tlv->header.len =
|
||||
wlan_cpu_to_le16(sizeof(MrvlIEtypes_fw_roam_enable_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
if (roam->enable <= ROAM_OFFLOAD_WITHOUT_APLIST)
|
||||
enable_tlv->roam_enable = roam->enable;
|
||||
else
|
||||
enable_tlv->roam_enable = ROAM_OFFLOAD_WITHOUT_APLIST;
|
||||
pos += sizeof(MrvlIEtypes_fw_roam_enable_t);
|
||||
}
|
||||
if (type & FW_ROAM_TRIGGER_COND) {
|
||||
trigger_condition_tlv =
|
||||
(MrvlIEtypes_fw_roam_trigger_condition_t *)pos;
|
||||
trigger_condition_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_ROM_TRIGGER);
|
||||
trigger_condition_tlv->header.len = wlan_cpu_to_le16(
|
||||
sizeof(trigger_condition_tlv->trigger_condition));
|
||||
trigger_condition_tlv->trigger_condition =
|
||||
wlan_cpu_to_le16(trigger_condition);
|
||||
pos += sizeof(trigger_condition_tlv->header) +
|
||||
sizeof(trigger_condition_tlv->trigger_condition);
|
||||
}
|
||||
if (type & FW_ROAM_BSSID) {
|
||||
bssid_tlv = (MrvlIEtypes_Bssid_t *)pos;
|
||||
bssid_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_BSSID);
|
||||
bssid_tlv->header.len =
|
||||
wlan_cpu_to_le16(sizeof(bssid_tlv->bssid));
|
||||
if (memcmp(pmpriv->adapter, roam->bssid_reconnect, zero_mac,
|
||||
sizeof(zero_mac)) != 0)
|
||||
memcpy_ext(pmpriv->adapter, bssid_tlv->bssid,
|
||||
roam->bssid_reconnect,
|
||||
sizeof(bssid_tlv->bssid),
|
||||
sizeof(bssid_tlv->bssid));
|
||||
else {
|
||||
if (roam->config_mode == ROAM_OFFLOAD_SUSPEND_CFG)
|
||||
memcpy_ext(pmpriv->adapter, bssid_tlv->bssid,
|
||||
pmpriv->curr_bss_params
|
||||
.bss_descriptor.mac_address,
|
||||
sizeof(bssid_tlv->bssid),
|
||||
sizeof(bssid_tlv->bssid));
|
||||
else if (roam->config_mode == ROAM_OFFLOAD_RESUME_CFG)
|
||||
memcpy_ext(pmpriv->adapter, bssid_tlv->bssid,
|
||||
zero_mac, sizeof(bssid_tlv->bssid),
|
||||
sizeof(bssid_tlv->bssid));
|
||||
}
|
||||
pos += sizeof(bssid_tlv->header) + sizeof(bssid_tlv->bssid);
|
||||
}
|
||||
if (type & FW_ROAM_SSID) {
|
||||
for (i = 0; i < roam->ssid_list.ssid_num; i++) {
|
||||
ssid_tlv = (MrvlIEtypes_SsIdParamSet_t *)pos;
|
||||
ssid_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_SSID);
|
||||
memcpy_ext(pmpriv->adapter, ssid_tlv->ssid,
|
||||
roam->ssid_list.ssids[i].ssid,
|
||||
roam->ssid_list.ssids[i].ssid_len,
|
||||
roam->ssid_list.ssids[i].ssid_len);
|
||||
pos += sizeof(ssid_tlv->header) +
|
||||
wlan_strlen(ssid_tlv->ssid);
|
||||
ssid_tlv->header.len =
|
||||
wlan_cpu_to_le16(wlan_strlen(ssid_tlv->ssid));
|
||||
}
|
||||
if (!roam->ssid_list.ssid_num) {
|
||||
ssid_tlv = (MrvlIEtypes_SsIdParamSet_t *)pos;
|
||||
ssid_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_SSID);
|
||||
memcpy_ext(
|
||||
pmpriv->adapter, ssid_tlv->ssid,
|
||||
pmpriv->curr_bss_params.bss_descriptor.ssid.ssid,
|
||||
pmpriv->curr_bss_params.bss_descriptor.ssid
|
||||
.ssid_len,
|
||||
pmpriv->curr_bss_params.bss_descriptor.ssid
|
||||
.ssid_len);
|
||||
ssid_tlv->header.len =
|
||||
wlan_cpu_to_le16(wlan_strlen(ssid_tlv->ssid));
|
||||
pos += sizeof(ssid_tlv->header) + ssid_tlv->header.len;
|
||||
}
|
||||
}
|
||||
if (type & FW_ROAM_RETRY_COUNT) {
|
||||
retry_count_tlv = (MrvlIEtypes_fw_roam_retry_count_t *)pos;
|
||||
retry_count_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_ROM_RETRY_COUNT);
|
||||
retry_count_tlv->header.len =
|
||||
wlan_cpu_to_le16(sizeof(retry_count_tlv->retry_count));
|
||||
if (roam->retry_count)
|
||||
retry_count_tlv->retry_count =
|
||||
wlan_cpu_to_le16(roam->retry_count);
|
||||
else
|
||||
retry_count_tlv->retry_count =
|
||||
wlan_cpu_to_le16(RETRY_UNLIMITED_TIME);
|
||||
pos += sizeof(retry_count_tlv->header) +
|
||||
sizeof(retry_count_tlv->retry_count);
|
||||
}
|
||||
if (type & FW_ROAM_RSSI_PARA) {
|
||||
rssi_para_tlv = (MrvlIEtypes_para_rssi_t *)pos;
|
||||
rssi_para_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_ROM_PARA_RSSI);
|
||||
rssi_para_tlv->header.len =
|
||||
wlan_cpu_to_le16(sizeof(rssi_para_tlv->max_rssi) +
|
||||
sizeof(rssi_para_tlv->min_rssi) +
|
||||
sizeof(rssi_para_tlv->step_rssi));
|
||||
rssi_para_tlv->max_rssi = roam->para_rssi.max_rssi;
|
||||
rssi_para_tlv->min_rssi = roam->para_rssi.min_rssi;
|
||||
rssi_para_tlv->step_rssi = roam->para_rssi.step_rssi;
|
||||
pos += sizeof(rssi_para_tlv->header) +
|
||||
sizeof(rssi_para_tlv->max_rssi) +
|
||||
sizeof(rssi_para_tlv->min_rssi) +
|
||||
sizeof(rssi_para_tlv->step_rssi);
|
||||
}
|
||||
if (type & FW_ROAM_BAND_RSSI) {
|
||||
band_rssi_tlv = (MrvlIEtypes_band_rssi_t *)pos;
|
||||
band_rssi_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_BAND_RSSI);
|
||||
band_rssi_tlv->header.len =
|
||||
wlan_cpu_to_le16(sizeof(MrvlIEtypes_band_rssi_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
band_rssi_tlv->band_rssi.band_preferred =
|
||||
roam->band_rssi.band_preferred;
|
||||
band_rssi_tlv->band_rssi.rssi_hysteresis =
|
||||
roam->band_rssi.rssi_hysteresis;
|
||||
pos += sizeof(MrvlIEtypes_band_rssi_t);
|
||||
}
|
||||
|
||||
if (type & FW_ROAM_BGSCAN_PARAM) {
|
||||
bgscan_set_tlv = (MrvlIEtypes_fw_roam_bgscan_setting_t *)pos;
|
||||
bgscan_set_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_ROM_BGSCAN);
|
||||
bgscan_set_tlv->header.len = wlan_cpu_to_le16(
|
||||
sizeof(MrvlIEtypes_fw_roam_bgscan_setting_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
bgscan_set_tlv->bss_type = roam->bgscan_cfg.bss_type;
|
||||
bgscan_set_tlv->channels_perscan =
|
||||
roam->bgscan_cfg.channels_per_scan;
|
||||
bgscan_set_tlv->scan_interval =
|
||||
wlan_cpu_to_le32(roam->bgscan_cfg.scan_interval);
|
||||
bgscan_set_tlv->report_condition =
|
||||
wlan_cpu_to_le32(roam->bgscan_cfg.bg_rpt_condition);
|
||||
pos += sizeof(MrvlIEtypes_fw_roam_bgscan_setting_t);
|
||||
}
|
||||
|
||||
if (type & FW_ROAM_EES_PARAM) {
|
||||
ees_param_tlv = (MrvlIEtypes_ees_param_set_t *)pos;
|
||||
ees_param_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_ENERGYEFFICIENTSCAN);
|
||||
ees_param_tlv->header.len =
|
||||
wlan_cpu_to_le16(sizeof(MrvlIEtypes_ees_param_set_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
ees_param_tlv->ees_cfg.ees_mode =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.ees_mode);
|
||||
ees_param_tlv->ees_cfg.ees_rpt_condition =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.ees_rpt_condition);
|
||||
ees_param_tlv->ees_cfg.high_scan_period =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.high_scan_period);
|
||||
ees_param_tlv->ees_cfg.high_scan_count =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.high_scan_count);
|
||||
ees_param_tlv->ees_cfg.mid_scan_period =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.mid_scan_period);
|
||||
ees_param_tlv->ees_cfg.mid_scan_count =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.mid_scan_count);
|
||||
ees_param_tlv->ees_cfg.low_scan_period =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.low_scan_period);
|
||||
ees_param_tlv->ees_cfg.low_scan_count =
|
||||
wlan_cpu_to_le16(roam->ees_cfg.low_scan_count);
|
||||
pos += sizeof(MrvlIEtypes_ees_param_set_t);
|
||||
}
|
||||
|
||||
if (type & FW_ROAM_BCN_MISS_THRESHOLD) {
|
||||
bcn_miss_threshold_tlv =
|
||||
(MrvlIEtypes_beacon_miss_threshold_t *)pos;
|
||||
bcn_miss_threshold_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_BCNMISS);
|
||||
bcn_miss_threshold_tlv->header.len = wlan_cpu_to_le16(
|
||||
sizeof(MrvlIEtypes_beacon_miss_threshold_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
bcn_miss_threshold_tlv->bcn_miss_threshold =
|
||||
roam->bcn_miss_threshold;
|
||||
pos += sizeof(MrvlIEtypes_beacon_miss_threshold_t);
|
||||
}
|
||||
|
||||
if (type & FW_ROAM_PRE_BCN_MISS_THRESHOLD) {
|
||||
pre_bcn_miss_threshold_tlv =
|
||||
(MrvlIEtypes_pre_beacon_miss_threshold_t *)pos;
|
||||
pre_bcn_miss_threshold_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_PRE_BCNMISS);
|
||||
pre_bcn_miss_threshold_tlv->header.len = wlan_cpu_to_le16(
|
||||
sizeof(MrvlIEtypes_pre_beacon_miss_threshold_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
pre_bcn_miss_threshold_tlv->pre_bcn_miss_threshold =
|
||||
roam->pre_bcn_miss_threshold;
|
||||
pos += sizeof(MrvlIEtypes_pre_beacon_miss_threshold_t);
|
||||
}
|
||||
|
||||
if (type & FW_ROAM_BLACKLIST) {
|
||||
blacklist_tlv = (MrvlIEtypes_roam_blacklist_t *)pos;
|
||||
blacklist_tlv->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_BLACKLIST_BSSID);
|
||||
blacklist_tlv->header.len =
|
||||
roam->black_list.ap_num * MLAN_MAC_ADDR_LENGTH +
|
||||
sizeof(roam->black_list.ap_num);
|
||||
memcpy_ext(pmpriv->adapter, (t_u8 *)&blacklist_tlv->blacklist,
|
||||
(t_u8 *)&roam->black_list, blacklist_tlv->header.len,
|
||||
sizeof(blacklist_tlv->blacklist));
|
||||
pos += sizeof(MrvlIEtypesHeader_t) + blacklist_tlv->header.len;
|
||||
blacklist_tlv->header.len =
|
||||
wlan_cpu_to_le16(blacklist_tlv->header.len);
|
||||
}
|
||||
|
||||
if (type & FW_ROAM_REPEAT_CNT) {
|
||||
tlv_repeat = (MrvlIEtypes_RepeatCount_t *)pos;
|
||||
tlv_repeat->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_REPEAT_COUNT);
|
||||
tlv_repeat->header.len =
|
||||
wlan_cpu_to_le16(sizeof(MrvlIEtypes_RepeatCount_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
tlv_repeat->repeat_count = wlan_cpu_to_le16(roam->repeat_count);
|
||||
pos += sizeof(MrvlIEtypes_RepeatCount_t);
|
||||
}
|
||||
LEAVE();
|
||||
return (pos - begin);
|
||||
}
|
||||
/**
|
||||
* @brief This function sends enable/disable roam offload command to firmware.
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param pcmd Hostcmd ID
|
||||
* @param cmd_action Command action
|
||||
* @return N/A
|
||||
*/
|
||||
static mlan_status wlan_cmd_roam_offload(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_void *pdata_buf)
|
||||
{
|
||||
HostCmd_DS_ROAM_OFFLOAD *roam_cmd = &cmd->params.roam_offload;
|
||||
MrvlIEtypes_roam_aplist_t *aplist = MNULL;
|
||||
t_u8 *pos = (t_u8 *)roam_cmd + sizeof(roam_cmd->action);
|
||||
mlan_ds_misc_roam_offload *roam = MNULL;
|
||||
t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0};
|
||||
t_u32 type = 0;
|
||||
t_u8 trigger_condition = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_ROAM_OFFLOAD);
|
||||
cmd->size = S_DS_GEN + sizeof(HostCmd_DS_ROAM_OFFLOAD);
|
||||
roam_cmd->action = wlan_cpu_to_le16(cmd_action);
|
||||
|
||||
roam = (mlan_ds_misc_roam_offload *)pdata_buf;
|
||||
|
||||
if (roam->config_mode) {
|
||||
switch (roam->config_mode) {
|
||||
case ROAM_OFFLOAD_ENABLE:
|
||||
type |= FW_ROAM_ENABLE;
|
||||
if (roam->enable && roam->enable != AUTO_RECONNECT) {
|
||||
type |= FW_ROAM_TRIGGER_COND;
|
||||
trigger_condition |= RSSI_LOW_TRIGGER |
|
||||
PRE_BEACON_LOST_TRIGGER;
|
||||
}
|
||||
break;
|
||||
case ROAM_OFFLOAD_SUSPEND_CFG:
|
||||
type |= FW_ROAM_TRIGGER_COND | FW_ROAM_RETRY_COUNT;
|
||||
if (roam->enable == AUTO_RECONNECT) {
|
||||
type |= FW_ROAM_BSSID | FW_ROAM_SSID;
|
||||
trigger_condition = LINK_LOST_TRIGGER |
|
||||
DEAUTH_WITH_EXT_AP_TRIGGER;
|
||||
} else
|
||||
trigger_condition = LINK_LOST_TRIGGER |
|
||||
DEAUTH_WITH_EXT_AP_TRIGGER |
|
||||
RSSI_LOW_TRIGGER |
|
||||
PRE_BEACON_LOST_TRIGGER;
|
||||
|
||||
if (roam->enable == ROAM_OFFLOAD_WITH_BSSID)
|
||||
type |= FW_ROAM_BSSID;
|
||||
if (roam->enable == ROAM_OFFLOAD_WITH_SSID)
|
||||
type |= FW_ROAM_SSID;
|
||||
break;
|
||||
case ROAM_OFFLOAD_RESUME_CFG:
|
||||
type |= FW_ROAM_TRIGGER_COND;
|
||||
if (roam->enable == AUTO_RECONNECT)
|
||||
trigger_condition = NO_TRIGGER;
|
||||
else
|
||||
trigger_condition = RSSI_LOW_TRIGGER |
|
||||
PRE_BEACON_LOST_TRIGGER;
|
||||
if (roam->enable == ROAM_OFFLOAD_WITH_BSSID ||
|
||||
roam->enable == AUTO_RECONNECT)
|
||||
type |= FW_ROAM_BSSID;
|
||||
break;
|
||||
case ROAM_OFFLOAD_PARAM_CFG:
|
||||
if (roam->enable && roam->enable != AUTO_RECONNECT) {
|
||||
if (roam->retry_count != 0)
|
||||
type |= FW_ROAM_RETRY_COUNT;
|
||||
if (roam->ssid_list.ssid_num)
|
||||
type |= FW_ROAM_SSID;
|
||||
if (roam->para_rssi.set_flag)
|
||||
type |= FW_ROAM_RSSI_PARA;
|
||||
if (memcmp(pmpriv->adapter,
|
||||
roam->bssid_reconnect, zero_mac,
|
||||
sizeof(zero_mac)) != 0)
|
||||
type |= FW_ROAM_BSSID;
|
||||
if (roam->band_rssi_flag)
|
||||
type |= FW_ROAM_BAND_RSSI;
|
||||
if (roam->bgscan_set_flag)
|
||||
type |= FW_ROAM_BGSCAN_PARAM;
|
||||
if (roam->ees_param_set_flag)
|
||||
type |= FW_ROAM_EES_PARAM;
|
||||
if (roam->bcn_miss_threshold)
|
||||
type |= FW_ROAM_BCN_MISS_THRESHOLD;
|
||||
if (roam->pre_bcn_miss_threshold)
|
||||
type |= FW_ROAM_PRE_BCN_MISS_THRESHOLD;
|
||||
if (roam->black_list.ap_num)
|
||||
type |= FW_ROAM_BLACKLIST;
|
||||
if (roam->trigger_condition != 0xff) {
|
||||
type |= FW_ROAM_TRIGGER_COND;
|
||||
trigger_condition =
|
||||
roam->trigger_condition;
|
||||
}
|
||||
if (roam->repeat_count)
|
||||
type |= FW_ROAM_REPEAT_CNT;
|
||||
}
|
||||
break;
|
||||
}
|
||||
cmd->size += mlan_prepare_roam_offload_tlv(
|
||||
pmpriv, type, roam, trigger_condition, pos);
|
||||
}
|
||||
if (roam->aplist.ap_num) {
|
||||
aplist = (MrvlIEtypes_roam_aplist_t *)pos;
|
||||
aplist->header.type = wlan_cpu_to_le16(TLV_TYPE_APLIST);
|
||||
aplist->header.len = roam->aplist.ap_num * MLAN_MAC_ADDR_LENGTH;
|
||||
memcpy_ext(pmpriv->adapter, aplist->ap_mac, roam->aplist.ap_mac,
|
||||
roam->aplist.ap_num * MLAN_MAC_ADDR_LENGTH,
|
||||
roam->aplist.ap_num * MLAN_MAC_ADDR_LENGTH);
|
||||
pos += sizeof(aplist->header) + aplist->header.len;
|
||||
cmd->size += sizeof(aplist->header) + aplist->header.len;
|
||||
aplist->header.len = wlan_cpu_to_le16(aplist->header.len);
|
||||
}
|
||||
cmd->size = wlan_cpu_to_le16(cmd->size);
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function sends set and get auto tx command to firmware.
|
||||
*
|
||||
|
@ -2908,6 +3429,11 @@ static mlan_status wlan_cmd_auto_tx(pmlan_private pmpriv,
|
|||
.h803_len,
|
||||
eth_ip, sizeof(t_u16),
|
||||
sizeof(t_u16));
|
||||
memcpy_ext(pmpriv->adapter,
|
||||
(t_u8 *)&pkt_tlv->ip_packet,
|
||||
misc_keep_alive->packet,
|
||||
misc_keep_alive->pkt_len,
|
||||
MKEEP_ALIVE_IP_PKT_MAX);
|
||||
pkt_tlv->header.len = wlan_cpu_to_le16(
|
||||
sizeof(Eth803Hdr_t) +
|
||||
misc_keep_alive->pkt_len);
|
||||
|
@ -2974,6 +3500,55 @@ static mlan_status wlan_is_cmd_allowed(mlan_private *priv, t_u16 cmd_no)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function enable/disable CSI support.
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param cmd A pointer to HostCmd_DS_COMMAND structure
|
||||
* @param cmd_action The action: GET or SET
|
||||
* @param pdata_buf A pointer to data buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
static mlan_status wlan_cmd_csi(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
|
||||
t_u16 cmd_action, t_u16 *pdata_buf)
|
||||
{
|
||||
HostCmd_DS_CSI_CFG *csi_cfg_cmd = &cmd->params.csi_params;
|
||||
mlan_ds_csi_params *csi_params = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CSI);
|
||||
cmd->size = sizeof(HostCmd_DS_CSI_CFG) + S_DS_GEN;
|
||||
csi_cfg_cmd->action = wlan_cpu_to_le16(cmd_action);
|
||||
switch (cmd_action) {
|
||||
case CSI_CMD_ENABLE:
|
||||
csi_params = (mlan_ds_csi_params *)pdata_buf;
|
||||
csi_cfg_cmd->head_id = wlan_cpu_to_le32(csi_params->head_id);
|
||||
csi_cfg_cmd->tail_id = wlan_cpu_to_le32(csi_params->tail_id);
|
||||
csi_cfg_cmd->chip_id = csi_params->chip_id;
|
||||
csi_cfg_cmd->csi_filter_cnt = csi_params->csi_filter_cnt;
|
||||
if (csi_cfg_cmd->csi_filter_cnt > CSI_FILTER_MAX)
|
||||
csi_cfg_cmd->csi_filter_cnt = CSI_FILTER_MAX;
|
||||
memcpy_ext(pmpriv->adapter, (t_u8 *)csi_cfg_cmd->csi_filter,
|
||||
(t_u8 *)csi_params->csi_filter,
|
||||
sizeof(mlan_csi_filter_t) *
|
||||
csi_cfg_cmd->csi_filter_cnt,
|
||||
sizeof(csi_cfg_cmd->csi_filter));
|
||||
DBG_HEXDUMP(MCMD_D, "Enable CSI", csi_cfg_cmd,
|
||||
sizeof(HostCmd_DS_CSI_CFG));
|
||||
break;
|
||||
case CSI_CMD_DISABLE:
|
||||
DBG_HEXDUMP(MCMD_D, "Disable CSI", csi_cfg_cmd,
|
||||
sizeof(HostCmd_DS_CSI_CFG));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
cmd->size = wlan_cpu_to_le16(cmd->size);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function prepare the command before sending to firmware.
|
||||
*
|
||||
|
@ -3068,6 +3643,9 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
ret = wlan_cmd_ssu(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
#endif
|
||||
case HostCmd_CMD_CSI:
|
||||
ret = wlan_cmd_csi(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_HAL_PHY_CFG:
|
||||
ret = wlan_cmd_hal_phy_cfg(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
|
@ -3301,6 +3879,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
case HostCmd_CMD_TARGET_ACCESS:
|
||||
case HostCmd_CMD_802_11_EEPROM_ACCESS:
|
||||
case HostCmd_CMD_BCA_REG_ACCESS:
|
||||
case HostCmd_CMD_REG_ACCESS:
|
||||
ret = wlan_cmd_reg_access(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
|
@ -3337,6 +3916,10 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
sizeof(HostCmd_DS_SET_BSS_MODE) + S_DS_GEN);
|
||||
ret = MLAN_STATUS_SUCCESS;
|
||||
break;
|
||||
case HostCmd_CMD_802_11_NET_MONITOR:
|
||||
ret = wlan_cmd_net_monitor(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_MEASUREMENT_REQUEST:
|
||||
case HostCmd_CMD_MEASUREMENT_REPORT:
|
||||
ret = wlan_meas_cmd_process(pmpriv, cmd_ptr, pdata_buf);
|
||||
|
@ -3420,6 +4003,11 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
ret = wlan_cmd_ind_rst_cfg(cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
|
||||
case HostCmd_CMD_ROAM_OFFLOAD:
|
||||
ret = wlan_cmd_roam_offload(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
|
||||
case HostCmd_CMD_802_11_PS_INACTIVITY_TIMEOUT:
|
||||
ret = wlan_cmd_ps_inactivity_timeout(pmpriv, cmd_ptr,
|
||||
cmd_action, pdata_buf);
|
||||
|
@ -3511,6 +4099,14 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
case HostCmd_CMD_MFG_COMMAND:
|
||||
ret = wlan_cmd_mfg(pmpriv, cmd_ptr, cmd_action, pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_MC_AGGR_CFG:
|
||||
ret = wlan_cmd_mc_aggr_cfg(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_CH_LOAD:
|
||||
ret = wlan_cmd_get_ch_load(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
default:
|
||||
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* responses generated by firmware.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -320,6 +320,11 @@ static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv,
|
|||
}
|
||||
}
|
||||
} break;
|
||||
case HostCmd_CMD_ROAM_OFFLOAD:
|
||||
wlan_clear_fw_roaming_pmk(pmpriv);
|
||||
pmpriv->adapter->fw_roaming = MFALSE;
|
||||
PRINTM(MERROR, "FW do not support roaming!\n");
|
||||
break;
|
||||
case HostCmd_CMD_CHAN_REGION_CFG:
|
||||
ret = MLAN_STATUS_SUCCESS;
|
||||
PRINTM(MCMND, "FW don't support chan region cfg command!\n");
|
||||
|
@ -2110,6 +2115,61 @@ static mlan_status wlan_ret_inactivity_timeout(pmlan_private pmpriv,
|
|||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of
|
||||
* network monitor
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to command buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_ret_net_monitor(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
mlan_ds_misc_cfg *pmisc = MNULL;
|
||||
mlan_ds_misc_net_monitor *net_mon = MNULL;
|
||||
HostCmd_DS_802_11_NET_MONITOR *cmd_net_mon =
|
||||
(HostCmd_DS_802_11_NET_MONITOR *)&resp->params.net_mon;
|
||||
ChanBandParamSet_t *pchan_band = MNULL;
|
||||
t_u16 band_info = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_buf && (pioctl_buf->action == MLAN_ACT_GET)) {
|
||||
pmisc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
net_mon = &pmisc->param.net_mon;
|
||||
net_mon->enable_net_mon =
|
||||
wlan_le16_to_cpu(cmd_net_mon->enable_net_mon);
|
||||
net_mon->filter_flag =
|
||||
wlan_le16_to_cpu(cmd_net_mon->filter_flag);
|
||||
pchan_band = &cmd_net_mon->monitor_chan.chan_band_param[0];
|
||||
/* Band information in the TLV is bits[1:0] */
|
||||
band_info = pchan_band->bandcfg.chanBand;
|
||||
net_mon->channel = pchan_band->chan_number;
|
||||
if (band_info == BAND_2GHZ)
|
||||
net_mon->band |= (BAND_B | BAND_G);
|
||||
if (band_info == BAND_5GHZ)
|
||||
net_mon->band |= BAND_A;
|
||||
net_mon->chan_bandwidth =
|
||||
GET_SECONDARYCHAN(pchan_band->bandcfg.chan2Offset);
|
||||
if (band_info == BAND_2GHZ)
|
||||
net_mon->band |= BAND_GN;
|
||||
if (band_info == BAND_5GHZ)
|
||||
net_mon->band |= BAND_AN;
|
||||
if (band_info == BAND_2GHZ)
|
||||
net_mon->band |= BAND_GAC;
|
||||
if (band_info == BAND_5GHZ)
|
||||
net_mon->band |= BAND_AAC;
|
||||
}
|
||||
pmpriv->adapter->enable_net_mon =
|
||||
wlan_le16_to_cpu(cmd_net_mon->enable_net_mon);
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of
|
||||
* subscribe event
|
||||
|
@ -2432,27 +2492,6 @@ static mlan_status wlan_ret_coalesce_config(pmlan_private pmpriv,
|
|||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
|
||||
const HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
mlan_ds_misc_cfg *pcfg = MNULL;
|
||||
const HostCmd_DS_SENSOR_TEMP *pSensorT = &resp->params.temp_sensor;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_buf) {
|
||||
pcfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
|
||||
pcfg->param.sensor_temp.temperature =
|
||||
wlan_le32_to_cpu(pSensorT->temperature);
|
||||
PRINTM(MCMND, "get SOC temperature %u C \n",
|
||||
pSensorT->temperature);
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of arb Cfg
|
||||
*
|
||||
|
@ -2571,6 +2610,71 @@ static mlan_status wlan_ret_sta_config(pmlan_private pmpriv,
|
|||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function clears PMK in fw for fw roaming
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
mlan_status wlan_clear_fw_roaming_pmk(pmlan_private pmpriv)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_SUPPLICANT_PMK,
|
||||
HostCmd_ACT_GEN_REMOVE, 0, MNULL, MNULL);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS) {
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of enable/disable roaming
|
||||
* offload to fw
|
||||
*
|
||||
* @param pmpriv A pointer to mlan_private structure
|
||||
* @param resp A pointer to HostCmd_DS_COMMAND
|
||||
* @param pioctl_buf A pointer to mlan_ioctl_req structure
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS
|
||||
*/
|
||||
static mlan_status wlan_ret_roam_offload(pmlan_private pmpriv,
|
||||
HostCmd_DS_COMMAND *resp,
|
||||
mlan_ioctl_req *pioctl_buf)
|
||||
{
|
||||
HostCmd_DS_ROAM_OFFLOAD *cmdrsp_roam_offload =
|
||||
(HostCmd_DS_ROAM_OFFLOAD *)&resp->params.roam_offload;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
MrvlIEtypesHeader_t *header = MNULL;
|
||||
MrvlIEtypes_fw_roam_enable_t *roam_offload_enable = MNULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (resp->result == HostCmd_RESULT_OK) {
|
||||
header = (MrvlIEtypesHeader_t *)cmdrsp_roam_offload->tlv;
|
||||
header->type = wlan_le16_to_cpu(header->type);
|
||||
if (header->type == TLV_TYPE_ROAM) {
|
||||
roam_offload_enable = (MrvlIEtypes_fw_roam_enable_t *)
|
||||
cmdrsp_roam_offload->tlv;
|
||||
if ((t_u8)roam_offload_enable->roam_enable)
|
||||
pmpriv->adapter->fw_roaming = MTRUE;
|
||||
else {
|
||||
pmpriv->adapter->fw_roaming = MFALSE;
|
||||
wlan_clear_fw_roaming_pmk(pmpriv);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LEAVE();
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles the command response of set/get auto tx
|
||||
*
|
||||
|
@ -2976,6 +3080,15 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
resp->params.ssu_params.rec_len);
|
||||
break;
|
||||
#endif
|
||||
case HostCmd_CMD_CSI:
|
||||
if (resp->params.csi_params.action == CSI_CMD_ENABLE) {
|
||||
pmadapter->csi_enabled = 1;
|
||||
PRINTM(MCMND, "CSI ENABLE cmdresp\n");
|
||||
} else {
|
||||
pmadapter->csi_enabled = 0;
|
||||
PRINTM(MCMND, "CSI DISABLE cmdresp\n");
|
||||
}
|
||||
break;
|
||||
case HostCmd_CMD_802_11_ASSOCIATE:
|
||||
ret = wlan_ret_802_11_associate(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
|
@ -3163,6 +3276,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_TARGET_ACCESS:
|
||||
case HostCmd_CMD_802_11_EEPROM_ACCESS:
|
||||
case HostCmd_CMD_BCA_REG_ACCESS:
|
||||
case HostCmd_CMD_REG_ACCESS:
|
||||
ret = wlan_ret_reg_access(pmpriv->adapter, cmdresp_no, resp,
|
||||
pioctl_buf);
|
||||
break;
|
||||
|
@ -3182,6 +3296,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_MEASUREMENT_REPORT:
|
||||
ret = wlan_meas_cmdresp_process(pmpriv, resp);
|
||||
break;
|
||||
case HostCmd_CMD_802_11_NET_MONITOR:
|
||||
ret = wlan_ret_net_monitor(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
#if defined(PCIE)
|
||||
#if defined(PCIE8997) || defined(PCIE8897)
|
||||
case HostCmd_CMD_PCIE_HOST_BUF_DETAILS:
|
||||
|
@ -3251,6 +3368,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
break;
|
||||
case HostCmd_CMD_802_11_PS_INACTIVITY_TIMEOUT:
|
||||
break;
|
||||
case HostCmd_CMD_ROAM_OFFLOAD:
|
||||
ret = wlan_ret_roam_offload(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_TSF:
|
||||
ret = wlan_ret_get_tsf(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
|
@ -3326,6 +3446,12 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_MFG_COMMAND:
|
||||
ret = wlan_ret_mfg(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_MC_AGGR_CFG:
|
||||
ret = wlan_ret_mc_aggr_cfg(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_CH_LOAD:
|
||||
ret = wlan_ret_ch_load(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
default:
|
||||
PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
|
||||
resp->command);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains MLAN event handling.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -444,8 +444,6 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect)
|
|||
pmadapter->tx_lock_flag = MFALSE;
|
||||
pmadapter->pps_uapsd_mode = MFALSE;
|
||||
pmadapter->delay_null_pkt = MFALSE;
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_STA)
|
||||
pmadapter->hs_wake_interval = 0;
|
||||
|
||||
if ((wlan_fw_11d_is_enabled(priv)) &&
|
||||
(priv->state_11d.user_enable_11d == DISABLE_11D)) {
|
||||
|
@ -669,6 +667,7 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
|
|||
t_u16 reason_code;
|
||||
pmlan_callbacks pcb = &pmadapter->callbacks;
|
||||
mlan_event *pevent = MNULL;
|
||||
t_u8 addr[MLAN_MAC_ADDR_LENGTH];
|
||||
chan_band_info *pchan_band_info = MNULL;
|
||||
t_u8 radar_chan;
|
||||
t_u16 enable = 0;
|
||||
|
@ -1305,6 +1304,10 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
|
|||
wlan_free_ssu_pcie_buf(pmadapter);
|
||||
break;
|
||||
#endif
|
||||
case EVENT_CSI:
|
||||
PRINTM(MEVENT, "EVENT: EVENT_CSI on STA\n");
|
||||
wlan_process_csi_event(pmpriv);
|
||||
break;
|
||||
case EVENT_MEF_HOST_WAKEUP:
|
||||
PRINTM(MEVENT, "EVENT: EVENT_MEF_HOST_WAKEUP len=%d\n",
|
||||
pmbuf->data_len);
|
||||
|
@ -1312,6 +1315,41 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
|
|||
case EVENT_MANAGEMENT_FRAME_WAKEUP:
|
||||
PRINTM(MEVENT, "EVENT: EVENT_MANAGEMENT_FRAME_WAKEUP HOST\n");
|
||||
break;
|
||||
case EVENT_ROAM_OFFLOAD:
|
||||
memcpy_ext(pmadapter, addr,
|
||||
pmpriv->curr_bss_params.bss_descriptor.mac_address,
|
||||
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
|
||||
memcpy_ext(pmadapter,
|
||||
pmpriv->curr_bss_params.bss_descriptor.mac_address,
|
||||
(t_u8 *)(pmadapter->event_body + 2),
|
||||
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
|
||||
/** replace ralist's mac address with new mac address */
|
||||
if (0 ==
|
||||
wlan_ralist_update(
|
||||
pmpriv, addr,
|
||||
pmpriv->curr_bss_params.bss_descriptor.mac_address))
|
||||
wlan_ralist_add(pmpriv,
|
||||
pmpriv->curr_bss_params.bss_descriptor
|
||||
.mac_address);
|
||||
wlan_11n_cleanup_reorder_tbl(pmpriv);
|
||||
wlan_11n_deleteall_txbastream_tbl(pmpriv);
|
||||
/*Update the BSS for inform kernel, otherwise kernel will give
|
||||
* warning for not find BSS*/
|
||||
memcpy_ext(pmadapter, (t_u8 *)&pmadapter->pscan_table[0],
|
||||
(t_u8 *)&pmpriv->curr_bss_params.bss_descriptor,
|
||||
sizeof(BSSDescriptor_t), sizeof(BSSDescriptor_t));
|
||||
if (!pmadapter->num_in_scan_table)
|
||||
pmadapter->num_in_scan_table = 1;
|
||||
PRINTM(MEVENT, "EVENT: ROAM OFFLOAD IN FW SUCCESS\n");
|
||||
pevent->bss_index = pmpriv->bss_index;
|
||||
pevent->event_id = MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT;
|
||||
/** Drop event id length and 2 bytes reverved length*/
|
||||
pevent->event_len = pmbuf->data_len - sizeof(eventcause) - 2;
|
||||
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
|
||||
pmadapter->event_body + 2, pevent->event_len,
|
||||
pevent->event_len);
|
||||
wlan_recv_event(pmpriv, pevent->event_id, pevent);
|
||||
break;
|
||||
case EVENT_CLOUD_KEEP_ALIVE_RETRY_FAIL:
|
||||
break;
|
||||
case EVENT_VDLL_IND:
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for station ioctl.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -460,6 +460,9 @@ static mlan_status wlan_get_info_ioctl(pmlan_adapter pmadapter,
|
|||
pget_info->param.fw_info.antinfo = pmadapter->antinfo;
|
||||
pget_info->param.fw_info.max_ap_assoc_sta =
|
||||
pmadapter->max_sta_conn;
|
||||
pget_info->param.fw_info.fw_roaming_support =
|
||||
(pmadapter->fw_cap_info & FW_ROAMING_SUPPORT) ? 0x01 :
|
||||
0x00;
|
||||
pget_info->param.fw_info.fw_beacon_prot =
|
||||
IS_FW_SUPPORT_BEACON_PROT(pmadapter) ? 0x01 : 0x00;
|
||||
break;
|
||||
|
@ -542,6 +545,13 @@ static mlan_status wlan_snmp_mib_ioctl(pmlan_adapter pmadapter,
|
|||
value = mib->param.signalext_enable;
|
||||
cmd_oid = SignalextEnable_i;
|
||||
break;
|
||||
case MLAN_OID_SNMP_MIB_CHAN_TRACK:
|
||||
if (!IS_FW_SUPPORT_CHAN_TRACK(pmadapter)) {
|
||||
goto exit;
|
||||
}
|
||||
value = mib->param.chan_track;
|
||||
cmd_oid = ChanTrackParam_i;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Send request to firmware */
|
||||
|
@ -764,7 +774,7 @@ static mlan_status wlan_bss_ioctl_get_channel_list(pmlan_adapter pmadapter,
|
|||
(pmpriv->bss_mode == MLAN_BSS_MODE_IBSS &&
|
||||
pmpriv->adhoc_state != ADHOC_STARTED))) {
|
||||
t_u8 chan_no;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
|
||||
parsed_region_chan_11d_t *parsed_region_chan = MNULL;
|
||||
parsed_region_chan_11d_t region_chan;
|
||||
|
@ -781,7 +791,7 @@ static mlan_status wlan_bss_ioctl_get_channel_list(pmlan_adapter pmadapter,
|
|||
|
||||
if (wlan_11d_parse_domain_info(
|
||||
pmadapter, &pbss_desc->country_info,
|
||||
(t_u8)pbss_desc->bss_band,
|
||||
pbss_desc->bss_band,
|
||||
®ion_chan) == MLAN_STATUS_SUCCESS) {
|
||||
parsed_region_chan = ®ion_chan;
|
||||
} else {
|
||||
|
@ -1004,6 +1014,12 @@ static mlan_status wlan_bss_ioctl_start(pmlan_adapter pmadapter,
|
|||
|
||||
ENTER();
|
||||
|
||||
if (pmadapter->enable_net_mon == CHANNEL_SPEC_SNIFFER_MODE) {
|
||||
PRINTM(MINFO,
|
||||
"Association is blocked in Channel Specified Network Monitor mode...\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
/* Before ASSOC REQ, If "port ctrl" mode is enabled,
|
||||
* move the port to CLOSED state */
|
||||
if (pmpriv->port_ctrl_mode == MTRUE) {
|
||||
|
@ -1480,8 +1496,7 @@ wlan_bss_ioctl_bss_11d_check_channel(pmlan_adapter pmadapter,
|
|||
(t_u32)ssid_bssid->channel);
|
||||
|
||||
/* check if this channel is supported in the region */
|
||||
if (!wlan_find_cfp_by_band_and_channel(pmadapter,
|
||||
(t_u8)ssid_bssid->bss_band,
|
||||
if (!wlan_find_cfp_by_band_and_channel(pmadapter, ssid_bssid->bss_band,
|
||||
(t_u32)ssid_bssid->channel)) {
|
||||
PRINTM(MERROR, "Unsupported Channel for region 0x%x\n",
|
||||
pmadapter->region_code);
|
||||
|
@ -4888,34 +4903,6 @@ static mlan_status wlan_misc_ioctl_ips_cfg(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
static mlan_status wlan_misc_ioctl_get_sensor_temp(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_GET)
|
||||
cmd_action = HostCmd_ACT_GEN_GET;
|
||||
else {
|
||||
PRINTM(MERROR, " sensor temp only support get operation \n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_DS_GET_SENSOR_TEMP, cmd_action,
|
||||
0, (t_void *)pioctl_req, MNULL);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief IPv6 Router Advertisement offload configuration
|
||||
*
|
||||
|
@ -4996,6 +4983,106 @@ static mlan_status wlan_misc_ioctl_gtk_rekey_offload(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief enable/disable roam offload in firmware
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req Pointer to the IOCTL request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
static mlan_status wlan_misc_roam_offload(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
|
||||
if (!(pmadapter->fw_cap_info & FW_ROAMING_SUPPORT)) {
|
||||
PRINTM(MERROR, "Firmware roaming not support\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
if (!IS_FW_SUPPORT_SUPPLICANT(pmadapter)) {
|
||||
PRINTM(MERROR, "Embedded supplicant do not enable\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
if ((misc->param.roam_offload.config_mode == ROAM_OFFLOAD_ENABLE) &&
|
||||
misc->param.roam_offload.userset_passphrase) {
|
||||
pmpriv->adapter->userset_passphrase =
|
||||
misc->param.roam_offload.userset_passphrase;
|
||||
if (!misc->param.roam_offload.enable) {
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_SET)
|
||||
cmd_action = HostCmd_ACT_GEN_SET;
|
||||
else {
|
||||
PRINTM(MERROR, "Unsupported cmd_action\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_ROAM_OFFLOAD, cmd_action, 0,
|
||||
(t_void *)pioctl_req, &misc->param.roam_offload);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief set roam offload aplist to firmware
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req Pointer to the IOCTL request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
|
||||
*/
|
||||
static mlan_status wlan_misc_roam_offload_aplist(pmlan_adapter pmadapter,
|
||||
mlan_ioctl_req *pioctl_req)
|
||||
{
|
||||
pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
mlan_ds_misc_cfg *misc = MNULL;
|
||||
t_u16 cmd_action = 0;
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
|
||||
if (pioctl_req->action == MLAN_ACT_SET)
|
||||
cmd_action = HostCmd_ACT_GEN_SET;
|
||||
else {
|
||||
PRINTM(MERROR, "Unsupported cmd_action\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Send request to firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_ROAM_OFFLOAD, cmd_action, 0,
|
||||
(t_void *)pioctl_req, &misc->param.roam_offload);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief cloud keep alive
|
||||
*
|
||||
|
@ -5132,6 +5219,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
|
|||
status = wlan_misc_ioctl_tdls_idle_time(pmadapter, pioctl_req);
|
||||
break;
|
||||
|
||||
case MLAN_OID_MISC_NET_MONITOR:
|
||||
status = wlan_misc_ioctl_net_monitor(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_MAC_CONTROL:
|
||||
status = wlan_misc_ioctl_mac_control(pmadapter, pioctl_req);
|
||||
break;
|
||||
|
@ -5231,9 +5321,21 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
|
|||
case MLAN_OID_MISC_IND_RST_CFG:
|
||||
status = wlan_misc_ioctl_ind_rst_cfg(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_MC_AGGR_CFG:
|
||||
status = wlan_misc_ioctl_mc_aggr_cfg(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_CH_LOAD:
|
||||
status = wlan_misc_ioctl_ch_load(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_GET_TSF:
|
||||
status = wlan_misc_ioctl_get_tsf(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_ROAM_OFFLOAD:
|
||||
status = wlan_misc_roam_offload(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_ROAM_OFFLOAD_APLIST:
|
||||
status = wlan_misc_roam_offload_aplist(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_GET_CHAN_REGION_CFG:
|
||||
status = wlan_misc_chan_reg_cfg(pmadapter, pioctl_req);
|
||||
break;
|
||||
|
@ -5272,6 +5374,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
|
|||
status = wlan_misc_ssu(pmadapter, pioctl_req);
|
||||
break;
|
||||
#endif
|
||||
case MLAN_OID_MISC_CSI:
|
||||
status = wlan_misc_csi(pmadapter, pioctl_req);
|
||||
break;
|
||||
case MLAN_OID_MISC_HAL_PHY_CFG:
|
||||
status = wlan_misc_hal_phy_cfg(pmadapter, pioctl_req);
|
||||
break;
|
||||
|
@ -5429,6 +5534,13 @@ static mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter,
|
|||
return status;
|
||||
}
|
||||
|
||||
if (pmadapter->enable_net_mon == CHANNEL_SPEC_SNIFFER_MODE) {
|
||||
PRINTM(MINFO,
|
||||
"Scan is blocked in Channel Specified Network Monitor mode...\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
if (pmadapter->scan_block && pioctl_req->action == MLAN_ACT_SET) {
|
||||
PRINTM(MERROR, "Scan is blocked during association...\n");
|
||||
LEAVE();
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* module.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -176,6 +176,7 @@ void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len)
|
|||
int ie_len = 0;
|
||||
t_u8 i;
|
||||
int rate_len;
|
||||
IEEEtypes_Extension_t *ext_ie;
|
||||
|
||||
#define TDLS_PAYLOAD_TYPE 2
|
||||
#define TDLS_CATEGORY 0x0c
|
||||
|
@ -329,7 +330,7 @@ void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len)
|
|||
pos, sizeof(IEEEtypes_VHTCap_t),
|
||||
sizeof(IEEEtypes_VHTCap_t));
|
||||
sta_ptr->is_11ac_enabled = 1;
|
||||
DBG_HEXDUMP(MDAT_D, "TDLS VHT capability",
|
||||
DBG_HEXDUMP(MCMD_D, "Rx TDLS VHT capability",
|
||||
(t_u8 *)(&sta_ptr->vht_cap),
|
||||
MIN(sizeof(IEEEtypes_VHTCap_t),
|
||||
MAX_DATA_DUMP_LEN));
|
||||
|
@ -338,7 +339,7 @@ void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len)
|
|||
memcpy_ext(priv->adapter, (t_u8 *)&sta_ptr->vht_oprat,
|
||||
pos, sizeof(IEEEtypes_VHTOprat_t),
|
||||
sizeof(IEEEtypes_VHTOprat_t));
|
||||
DBG_HEXDUMP(MDAT_D, "TDLS VHT Operation",
|
||||
DBG_HEXDUMP(MCMD_D, "Rx TDLS VHT Operation",
|
||||
(t_u8 *)(&sta_ptr->vht_oprat),
|
||||
MIN(sizeof(IEEEtypes_VHTOprat_t),
|
||||
MAX_DATA_DUMP_LEN));
|
||||
|
@ -347,11 +348,47 @@ void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len)
|
|||
memcpy_ext(priv->adapter, (t_u8 *)&sta_ptr->aid_info,
|
||||
pos, sizeof(IEEEtypes_AID_t),
|
||||
sizeof(IEEEtypes_AID_t));
|
||||
DBG_HEXDUMP(MDAT_D, "TDLS AID Info",
|
||||
DBG_HEXDUMP(MCMD_D, "Rx TDLS AID Info",
|
||||
(t_u8 *)(&sta_ptr->aid_info),
|
||||
MIN(sizeof(IEEEtypes_AID_t),
|
||||
MAX_DATA_DUMP_LEN));
|
||||
break;
|
||||
case EXTENSION:
|
||||
ext_ie = (IEEEtypes_Extension_t *)pos;
|
||||
if (ext_ie->ext_id == HE_CAPABILITY) {
|
||||
memcpy_ext(priv->adapter,
|
||||
(t_u8 *)&sta_ptr->tdls_he_cap, pos,
|
||||
ext_ie->ieee_hdr.len +
|
||||
sizeof(IEEEtypes_Header_t),
|
||||
sizeof(IEEEtypes_HECap_t));
|
||||
sta_ptr->tdls_he_cap.ieee_hdr.len =
|
||||
MIN(ext_ie->ieee_hdr.len,
|
||||
sizeof(IEEEtypes_HECap_t) -
|
||||
sizeof(IEEEtypes_Header_t));
|
||||
sta_ptr->is_11ax_enabled = 1;
|
||||
DBG_HEXDUMP(MCMD_D, "Rx TDLS HE Capability",
|
||||
(t_u8 *)(&sta_ptr->tdls_he_cap),
|
||||
MIN(sizeof(IEEEtypes_Header_t) +
|
||||
sta_ptr->tdls_he_cap
|
||||
.ieee_hdr.len,
|
||||
sizeof(IEEEtypes_HECap_t)));
|
||||
} else if (ext_ie->ext_id == HE_OPERATION) {
|
||||
memcpy_ext(priv->adapter,
|
||||
(t_u8 *)&sta_ptr->he_op, pos,
|
||||
ext_ie->ieee_hdr.len +
|
||||
sizeof(IEEEtypes_Header_t),
|
||||
sizeof(IEEEtypes_HeOp_t));
|
||||
ext_ie->ieee_hdr.len =
|
||||
MIN(ext_ie->ieee_hdr.len,
|
||||
sizeof(IEEEtypes_HeOp_t) -
|
||||
sizeof(IEEEtypes_Header_t));
|
||||
DBG_HEXDUMP(MCMD_D, "Rx TDLS HE Operation",
|
||||
(t_u8 *)(&sta_ptr->he_op),
|
||||
MIN(sizeof(IEEEtypes_Header_t) +
|
||||
ext_ie->ieee_hdr.len,
|
||||
MAX_DATA_DUMP_LEN));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -359,6 +396,81 @@ void wlan_process_tdls_action_frame(pmlan_private priv, t_u8 *pbuf, t_u32 len)
|
|||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function get pxpd info for radiotap info
|
||||
*
|
||||
* @param priv A pointer to pmlan_private
|
||||
* @param prx_pd A pointer to RxPD
|
||||
* @param prt_info A pointer to radiotap_info
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
void wlan_rxpdinfo_to_radiotapinfo(pmlan_private priv, RxPD *prx_pd,
|
||||
radiotap_info *prt_info)
|
||||
{
|
||||
radiotap_info rt_info_tmp;
|
||||
t_u8 rx_rate_info = 0;
|
||||
t_u8 mcs_index = 0;
|
||||
t_u8 format = 0;
|
||||
t_u8 bw = 0;
|
||||
t_u8 gi = 0;
|
||||
t_u8 ldpc = 0;
|
||||
t_u8 ext_rate_info = 0;
|
||||
|
||||
memset(priv->adapter, &rt_info_tmp, 0x00, sizeof(rt_info_tmp));
|
||||
rt_info_tmp.snr = prx_pd->snr;
|
||||
rt_info_tmp.nf = prx_pd->nf;
|
||||
rt_info_tmp.band_config = (prx_pd->rx_info & 0xf);
|
||||
rt_info_tmp.chan_num = (prx_pd->rx_info & RXPD_CHAN_MASK) >> 5;
|
||||
ext_rate_info = (t_u8)(prx_pd->rx_info >> 16);
|
||||
|
||||
rt_info_tmp.antenna = prx_pd->antenna;
|
||||
rx_rate_info = prx_pd->rate_info;
|
||||
if ((rx_rate_info & 0x3) == MLAN_RATE_FORMAT_VHT) {
|
||||
/* VHT rate */
|
||||
format = MLAN_RATE_FORMAT_VHT;
|
||||
mcs_index = MIN(prx_pd->rx_rate & 0xF, 9);
|
||||
/* 20M: bw=0, 40M: bw=1, 80M: bw=2, 160M: bw=3 */
|
||||
bw = (rx_rate_info & 0xC) >> 2;
|
||||
/* LGI: gi =0, SGI: gi = 1 */
|
||||
gi = (rx_rate_info & 0x10) >> 4;
|
||||
} else if ((rx_rate_info & 0x3) == MLAN_RATE_FORMAT_HT) {
|
||||
/* HT rate */
|
||||
format = MLAN_RATE_FORMAT_HT;
|
||||
mcs_index = prx_pd->rx_rate;
|
||||
/* 20M: bw=0, 40M: bw=1 */
|
||||
bw = (rx_rate_info & 0xC) >> 2;
|
||||
/* LGI: gi =0, SGI: gi = 1 */
|
||||
gi = (rx_rate_info & 0x10) >> 4;
|
||||
} else {
|
||||
/* LG rate */
|
||||
format = MLAN_RATE_FORMAT_LG;
|
||||
mcs_index = (prx_pd->rx_rate > MLAN_RATE_INDEX_OFDM0) ?
|
||||
prx_pd->rx_rate - 1 :
|
||||
prx_pd->rx_rate;
|
||||
}
|
||||
ldpc = rx_rate_info & 0x40;
|
||||
|
||||
rt_info_tmp.rate_info.mcs_index = mcs_index;
|
||||
rt_info_tmp.rate_info.rate_info =
|
||||
(ldpc << 5) | (format << 3) | (bw << 1) | gi;
|
||||
rt_info_tmp.rate_info.bitrate =
|
||||
wlan_index_to_data_rate(priv->adapter, prx_pd->rx_rate,
|
||||
prx_pd->rate_info, ext_rate_info);
|
||||
|
||||
if (prx_pd->flags & RXPD_FLAG_EXTRA_HEADER)
|
||||
memcpy_ext(priv->adapter, &rt_info_tmp.extra_info,
|
||||
(t_u8 *)prx_pd + sizeof(*prx_pd),
|
||||
sizeof(rt_info_tmp.extra_info),
|
||||
sizeof(rt_info_tmp.extra_info));
|
||||
|
||||
memset(priv->adapter, prt_info, 0x00, sizeof(radiotap_info));
|
||||
memcpy_ext(priv->adapter, prt_info, &rt_info_tmp, sizeof(rt_info_tmp),
|
||||
sizeof(radiotap_info));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function processes received packet and forwards it
|
||||
* to kernel/upper layer
|
||||
|
@ -498,6 +610,10 @@ mlan_status wlan_process_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf)
|
|||
PRINTM(MDATA, "%lu.%06lu : Data => kernel seq_num=%d tid=%d\n",
|
||||
pmbuf->out_ts_sec, pmbuf->out_ts_usec, prx_pd->seq_num,
|
||||
prx_pd->priority);
|
||||
if (pmadapter->enable_net_mon) {
|
||||
pmbuf->flags |= MLAN_BUF_FLAG_NET_MONITOR;
|
||||
goto mon_process;
|
||||
}
|
||||
|
||||
#ifdef DRV_EMBEDDED_SUPPLICANT
|
||||
if (supplicantIsEnabled(priv->psapriv) &&
|
||||
|
@ -516,6 +632,16 @@ mlan_status wlan_process_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf)
|
|||
}
|
||||
#endif
|
||||
|
||||
mon_process:
|
||||
if (pmbuf->flags & MLAN_BUF_FLAG_NET_MONITOR) {
|
||||
// Use some rxpd space to save rxpd info for radiotap header
|
||||
// We should insure radiotap_info is not bigger than RxPD
|
||||
wlan_rxpdinfo_to_radiotapinfo(
|
||||
priv, prx_pd,
|
||||
(radiotap_info *)(pmbuf->pbuf + pmbuf->data_offset -
|
||||
sizeof(radiotap_info)));
|
||||
}
|
||||
|
||||
if (MFALSE || priv->rx_pkt_info) {
|
||||
ext_rate_info = (t_u8)(prx_pd->rx_info >> 16);
|
||||
pmbuf->u.rx_info.data_rate =
|
||||
|
@ -576,6 +702,10 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf)
|
|||
prx_pd = (RxPD *)(pmbuf->pbuf + pmbuf->data_offset);
|
||||
/* Endian conversion */
|
||||
endian_convert_RxPD(prx_pd);
|
||||
if (prx_pd->flags & RXPD_FLAG_EXTRA_HEADER) {
|
||||
endian_convert_RxPD_extra_header(
|
||||
(rxpd_extra_info *)((t_u8 *)prx_pd + sizeof(*prx_pd)));
|
||||
}
|
||||
if (priv->adapter->pcard_info->v14_fw_api) {
|
||||
t_u8 rxpd_rate_info_orig = prx_pd->rate_info;
|
||||
prx_pd->rate_info = wlan_convert_v14_rx_rate_info(
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* transmission in MLAN module.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -168,6 +168,37 @@ t_void *wlan_ops_sta_process_txpd(t_void *priv, pmlan_buffer pmbuf)
|
|||
plocal_tx_pd->tx_control |= TXPD_RETRY_ENABLE;
|
||||
}
|
||||
}
|
||||
if (pmbuf->flags & MLAN_BUF_FLAG_MC_AGGR_PKT) {
|
||||
tx_ctrl *ctrl = (tx_ctrl *)&plocal_tx_pd->tx_control;
|
||||
mc_tx_ctrl *mc_ctrl =
|
||||
(mc_tx_ctrl *)&plocal_tx_pd->pkt_delay_2ms;
|
||||
plocal_tx_pd->tx_pkt_type = PKT_TYPE_802DOT11_MC_AGGR;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_START_CYCLE)
|
||||
ctrl->mc_cycle_start = MTRUE;
|
||||
else
|
||||
ctrl->mc_cycle_start = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_END_CYCLE)
|
||||
ctrl->mc_cycle_end = MTRUE;
|
||||
else
|
||||
ctrl->mc_cycle_end = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_START_AMPDU)
|
||||
ctrl->mc_ampdu_start = MTRUE;
|
||||
else
|
||||
ctrl->mc_ampdu_start = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_END_AMPDU)
|
||||
ctrl->mc_ampdu_end = MTRUE;
|
||||
else
|
||||
ctrl->mc_ampdu_end = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_RETRY)
|
||||
ctrl->mc_pkt_retry = MTRUE;
|
||||
else
|
||||
ctrl->mc_pkt_retry = MFALSE;
|
||||
ctrl->bw = pmbuf->u.mc_tx_info.bandwidth & 0x7;
|
||||
ctrl->tx_rate = pmbuf->u.mc_tx_info.mcs_index & 0x1f;
|
||||
mc_ctrl->abs_tsf_expirytime =
|
||||
wlan_cpu_to_le32(pmbuf->u.mc_tx_info.pkt_expiry);
|
||||
mc_ctrl->mc_seq = wlan_cpu_to_le16(pmbuf->u.mc_tx_info.seq_num);
|
||||
}
|
||||
endian_convert_TxPD(plocal_tx_pd);
|
||||
|
||||
/* Adjust the data offset and length to include TxPD in pmbuf */
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* of uap functionalities
|
||||
*
|
||||
*
|
||||
* Copyright 2009-2020 NXP
|
||||
* Copyright 2009-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the handling of AP mode command and event
|
||||
*
|
||||
*
|
||||
* Copyright 2009-2021 NXP
|
||||
* Copyright 2009-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -714,7 +714,8 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
|
|||
t_u16 i;
|
||||
t_u16 ac;
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
int rx_mcs_supp = 0;
|
||||
#endif
|
||||
|
||||
|
@ -1099,7 +1100,9 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
|
|||
tlv_auth_type = (MrvlIEtypes_auth_type_t *)tlv;
|
||||
tlv_auth_type->header.type =
|
||||
wlan_cpu_to_le16(TLV_TYPE_AUTH_TYPE);
|
||||
tlv_auth_type->header.len = wlan_cpu_to_le16(sizeof(t_u8));
|
||||
tlv_auth_type->header.len =
|
||||
wlan_cpu_to_le16(sizeof(MrvlIEtypes_auth_type_t) -
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
tlv_auth_type->auth_type =
|
||||
(t_u8)bss->param.bss_config.auth_mode;
|
||||
cmd_size += sizeof(MrvlIEtypes_auth_type_t);
|
||||
|
@ -1342,8 +1345,10 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
|
|||
bss->param.bss_config.supported_mcs_set, 16,
|
||||
sizeof(tlv_htcap->ht_cap.supported_mcs_set));
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097)
|
||||
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
|
||||
defined(SDNW62X) || defined(PCIENW62X) || defined(USBNW62X)
|
||||
if (IS_CARD9098(pmpriv->adapter->card_type) ||
|
||||
IS_CARDNW62X(pmpriv->adapter->card_type) ||
|
||||
IS_CARD9097(pmpriv->adapter->card_type)) {
|
||||
if (bss->param.bss_config.supported_mcs_set[0]) {
|
||||
if (bss->param.bss_config.bandcfg.chanBand ==
|
||||
|
@ -1842,6 +1847,8 @@ static mlan_status wlan_uap_cmd_sys_configure(pmlan_private pmpriv,
|
|||
MRVL_ACTION_CHAN_SWITCH_ANNOUNCE);
|
||||
// mode reserve for future use
|
||||
tlv_chan_switch->mode = 0;
|
||||
tlv_chan_switch->num_pkt =
|
||||
bss->param.chanswitch.chan_switch_count;
|
||||
if (bss->param.chanswitch.new_oper_class) {
|
||||
tlv_chan_switch->header.len = wlan_cpu_to_le16(
|
||||
sizeof(MrvlIEtypes_action_chan_switch_t) -
|
||||
|
@ -1855,8 +1862,7 @@ static mlan_status wlan_uap_cmd_sys_configure(pmlan_private pmpriv,
|
|||
sizeof(IEEEtypes_Header_t);
|
||||
ecsa_ie->chan_switch_mode =
|
||||
bss->param.chanswitch.chan_switch_mode;
|
||||
ecsa_ie->chan_switch_count =
|
||||
bss->param.chanswitch.chan_switch_count;
|
||||
ecsa_ie->chan_switch_count = 0;
|
||||
ecsa_ie->new_channel_num =
|
||||
bss->param.chanswitch.new_channel_num;
|
||||
ecsa_ie->new_oper_class =
|
||||
|
@ -1876,8 +1882,7 @@ static mlan_status wlan_uap_cmd_sys_configure(pmlan_private pmpriv,
|
|||
sizeof(IEEEtypes_Header_t);
|
||||
csa_ie->chan_switch_mode =
|
||||
bss->param.chanswitch.chan_switch_mode;
|
||||
csa_ie->chan_switch_count =
|
||||
bss->param.chanswitch.chan_switch_count;
|
||||
csa_ie->chan_switch_count = 0;
|
||||
csa_ie->new_channel_num =
|
||||
bss->param.chanswitch.new_channel_num;
|
||||
cmd->size += sizeof(IEEEtypes_ChanSwitchAnn_t);
|
||||
|
@ -2250,6 +2255,13 @@ static mlan_status wlan_uap_ret_cmd_ap_config(pmlan_private pmpriv,
|
|||
tlv_auth_type = (MrvlIEtypes_auth_type_t *)tlv;
|
||||
bss->param.bss_config.auth_mode =
|
||||
tlv_auth_type->auth_type;
|
||||
if (tlv_len == (sizeof(MrvlIEtypes_auth_type_t) -
|
||||
sizeof(MrvlIEtypesHeader_t))) {
|
||||
bss->param.bss_config.pwe_derivation =
|
||||
tlv_auth_type->PWE_derivation;
|
||||
bss->param.bss_config.transition_disable =
|
||||
tlv_auth_type->transition_disable;
|
||||
}
|
||||
break;
|
||||
case TLV_TYPE_UAP_ENCRYPT_PROTOCOL:
|
||||
tlv_encrypt_protocol =
|
||||
|
@ -2934,6 +2946,10 @@ static mlan_status wlan_uap_cmd_snmp_mib(pmlan_private pmpriv,
|
|||
psnmp_mib->value[0] = *((t_u8 *)pdata_buf);
|
||||
cmd->size += sizeof(t_u8);
|
||||
break;
|
||||
case Dot11H_fakeRadar:
|
||||
psnmp_mib->oid = wlan_cpu_to_le16((t_u16)cmd_oid);
|
||||
psnmp_mib->buf_size = 0;
|
||||
break;
|
||||
default:
|
||||
PRINTM(MERROR, "Unsupported OID.\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
|
@ -4661,6 +4677,7 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
case HostCmd_CMD_TARGET_ACCESS:
|
||||
case HostCmd_CMD_802_11_EEPROM_ACCESS:
|
||||
case HostCmd_CMD_BCA_REG_ACCESS:
|
||||
case HostCmd_CMD_REG_ACCESS:
|
||||
ret = wlan_cmd_reg_access(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
|
@ -4699,6 +4716,10 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
sizeof(HostCmd_DS_CHAN_REGION_CFG) + S_DS_GEN);
|
||||
cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action);
|
||||
break;
|
||||
case HostCmd_CMD_802_11_NET_MONITOR:
|
||||
ret = wlan_cmd_net_monitor(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_PACKET_AGGR_CTRL:
|
||||
ret = wlan_cmd_packet_aggr_ctrl(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
|
@ -4791,6 +4812,17 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
|
|||
ret = wlan_cmd_hal_phy_cfg(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_MC_AGGR_CFG:
|
||||
ret = wlan_cmd_mc_aggr_cfg(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_CH_LOAD:
|
||||
ret = wlan_cmd_get_ch_load(pmpriv, cmd_ptr, cmd_action,
|
||||
pdata_buf);
|
||||
break;
|
||||
case HostCmd_DS_GET_SENSOR_TEMP:
|
||||
wlan_cmd_get_sensor_temp(pmpriv, cmd_ptr, cmd_action);
|
||||
break;
|
||||
default:
|
||||
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
|
||||
if (pioctl_req)
|
||||
|
@ -4966,6 +4998,9 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
break;
|
||||
case HostCmd_CMD_SET_BSS_MODE:
|
||||
break;
|
||||
case HostCmd_CMD_802_11_NET_MONITOR:
|
||||
ret = wlan_ret_net_monitor(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_RECONFIGURE_TX_BUFF:
|
||||
wlan_set_tx_pause_flag(pmpriv, MFALSE);
|
||||
|
||||
|
@ -5067,6 +5102,7 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
case HostCmd_CMD_TARGET_ACCESS:
|
||||
case HostCmd_CMD_802_11_EEPROM_ACCESS:
|
||||
case HostCmd_CMD_BCA_REG_ACCESS:
|
||||
case HostCmd_CMD_REG_ACCESS:
|
||||
ret = wlan_ret_reg_access(pmpriv->adapter, cmdresp_no, resp,
|
||||
pioctl_buf);
|
||||
break;
|
||||
|
@ -5171,6 +5207,15 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
|
|||
ret = wlan_ret_set_get_beacon_stuck_cfg(pmpriv, resp,
|
||||
pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_MC_AGGR_CFG:
|
||||
ret = wlan_ret_mc_aggr_cfg(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_CMD_GET_CH_LOAD:
|
||||
ret = wlan_ret_ch_load(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
case HostCmd_DS_GET_SENSOR_TEMP:
|
||||
ret = wlan_ret_get_sensor_temp(pmpriv, resp, pioctl_buf);
|
||||
break;
|
||||
default:
|
||||
PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
|
||||
resp->command);
|
||||
|
@ -5457,14 +5502,20 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
pevent->event_len, pevent->event_len);
|
||||
wlan_11h_print_event_radar_detected(pmpriv, pevent, &channel);
|
||||
*((t_u8 *)pevent->event_buf) = channel;
|
||||
if (pmpriv->bss_type == MLAN_BSS_TYPE_DFS) {
|
||||
wlan_recv_event(priv, MLAN_EVENT_ID_FW_RADAR_DETECTED,
|
||||
pevent);
|
||||
pevent->event_id = 0; /* clear to avoid
|
||||
resending at end of fcn
|
||||
*/
|
||||
break;
|
||||
}
|
||||
if (!pmpriv->intf_state_11h.is_11h_host) {
|
||||
if (pmadapter->state_rdh.stage == RDH_OFF) {
|
||||
pmadapter->state_rdh.stage = RDH_CHK_INTFS;
|
||||
wlan_11h_radar_detected_handling(pmadapter,
|
||||
pmpriv);
|
||||
if (pmpriv->uap_host_based)
|
||||
wlan_recv_event(
|
||||
priv,
|
||||
wlan_recv_event(priv,
|
||||
MLAN_EVENT_ID_FW_RADAR_DETECTED,
|
||||
pevent);
|
||||
} else {
|
||||
|
@ -5515,6 +5566,17 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
/* Handle / pass event data, and free buffer */
|
||||
ret = wlan_11h_handle_event_chanrpt_ready(pmpriv, pevent,
|
||||
&channel);
|
||||
if (pmpriv->bss_type == MLAN_BSS_TYPE_DFS) {
|
||||
*((t_u8 *)pevent->event_buf) =
|
||||
pmpriv->adapter->state_dfs.dfs_radar_found;
|
||||
*((t_u8 *)pevent->event_buf + 1) = channel;
|
||||
wlan_recv_event(pmpriv,
|
||||
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY,
|
||||
pevent);
|
||||
pevent->event_id = 0; /* clear to avoid resending at end
|
||||
of fcn */
|
||||
break;
|
||||
}
|
||||
if (pmpriv->intf_state_11h.is_11h_host) {
|
||||
*((t_u8 *)pevent->event_buf) =
|
||||
pmpriv->adapter->state_dfs.dfs_radar_found;
|
||||
|
@ -5640,6 +5702,10 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
|
|||
case EVENT_VDLL_IND:
|
||||
wlan_process_vdll_event(pmpriv, pmbuf);
|
||||
break;
|
||||
case EVENT_CSI:
|
||||
PRINTM(MEVENT, "EVENT: EVENT_CSI on UAP\n");
|
||||
wlan_process_csi_event(pmpriv);
|
||||
break;
|
||||
|
||||
case EVENT_FW_HANG_REPORT:
|
||||
if (pmbuf->data_len < (sizeof(eventcause) + sizeof(t_u16))) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the handling of AP mode ioctls
|
||||
*
|
||||
*
|
||||
* Copyright 2009-2021 NXP
|
||||
* Copyright 2009-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -112,6 +112,7 @@ static mlan_status wlan_uap_callback_bss_ioctl_start(t_void *priv)
|
|||
wlan_uap_get_info_cb_t *puap_state_chan_cb = &pmpriv->uap_state_chan_cb;
|
||||
t_u8 old_channel;
|
||||
t_bool under_nop = MFALSE;
|
||||
dfs_state_t dfs_state;
|
||||
ENTER();
|
||||
/* clear callback now that we're here */
|
||||
puap_state_chan_cb->get_chan_callback = MNULL;
|
||||
|
@ -123,6 +124,10 @@ static mlan_status wlan_uap_callback_bss_ioctl_start(t_void *priv)
|
|||
!wlan_can_radar_det_skip(pmpriv) &&
|
||||
wlan_11h_radar_detect_required(pmpriv,
|
||||
puap_state_chan_cb->channel)) {
|
||||
dfs_state = wlan_get_chan_dfs_state(
|
||||
pmpriv, BAND_A, puap_state_chan_cb->channel);
|
||||
if (dfs_state == DFS_AVAILABLE)
|
||||
goto prep_bss_start;
|
||||
/* If DFS repeater mode is on then before starting the uAP
|
||||
* make sure that mlan0 is connected to some external AP
|
||||
* for DFS channel operations.
|
||||
|
@ -281,6 +286,13 @@ static mlan_status wlan_uap_bss_ioctl_start(pmlan_adapter pmadapter,
|
|||
|
||||
ENTER();
|
||||
|
||||
if (pmadapter->enable_net_mon == CHANNEL_SPEC_SNIFFER_MODE) {
|
||||
PRINTM(MINFO,
|
||||
"BSS start is blocked in Channel Specified Network Monitor mode...\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
bss = (mlan_ds_bss *)pioctl_req->pbuf;
|
||||
pmpriv->uap_host_based = bss->param.host_based;
|
||||
if (!pmpriv->intf_state_11h.is_11h_host &&
|
||||
|
@ -1311,7 +1323,7 @@ static mlan_status wlan_uap_callback_domain_info(t_void *priv)
|
|||
mlan_private *pmpriv = (mlan_private *)priv;
|
||||
wlan_uap_get_info_cb_t *puap_state_chan_cb = &pmpriv->uap_state_chan_cb;
|
||||
mlan_ds_11d_cfg *cfg11d;
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
pmlan_adapter pmadapter = pmpriv->adapter;
|
||||
pmlan_callbacks pcb = &pmadapter->callbacks;
|
||||
|
||||
|
@ -1411,6 +1423,7 @@ static mlan_status wlan_uap_callback_11h_channel_check_req(t_void *priv)
|
|||
Band_Config_t *pband_cfg = &puap_state_chan_cb->bandcfg;
|
||||
/* keep copy as local variable */
|
||||
pmlan_ioctl_req pioctl = puap_state_chan_cb->pioctl_req_curr;
|
||||
dfs_state_t dfs_state;
|
||||
ENTER();
|
||||
/* clear callback now that we're here */
|
||||
puap_state_chan_cb->get_chan_callback = MNULL;
|
||||
|
@ -1435,6 +1448,18 @@ static mlan_status wlan_uap_callback_11h_channel_check_req(t_void *priv)
|
|||
ret = wlan_11h_config_master_radar_det(pmpriv, MTRUE);
|
||||
ret = wlan_11h_check_update_radar_det_state(pmpriv);
|
||||
|
||||
dfs_state = wlan_get_chan_dfs_state(
|
||||
pmpriv, BAND_A, puap_state_chan_cb->channel);
|
||||
if (dfs_state == DFS_AVAILABLE) {
|
||||
wlan_11h_set_dfs_check_chan(
|
||||
pmpriv, puap_state_chan_cb->channel);
|
||||
PRINTM(MCMND, "ZERODFS: Channel %d is Avaliable\n",
|
||||
puap_state_chan_cb->channel);
|
||||
pcb->moal_ioctl_complete(pmpriv->adapter->pmoal_handle,
|
||||
pioctl, MLAN_STATUS_COMPLETE);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
/* Check for radar on the channel */
|
||||
ret = wlan_11h_issue_radar_detect(pmpriv, pioctl,
|
||||
puap_state_chan_cb->channel,
|
||||
|
@ -1481,7 +1506,8 @@ static mlan_status wlan_uap_11h_channel_check_req(pmlan_adapter pmadapter,
|
|||
pmpriv->intf_state_11h.is_11h_host =
|
||||
p11h_cfg->param.chan_rpt_req.host_based;
|
||||
|
||||
if (!pmpriv->intf_state_11h.is_11h_host) {
|
||||
if (!pmpriv->intf_state_11h.is_11h_host &&
|
||||
pmpriv->bss_type != MLAN_BSS_TYPE_DFS) {
|
||||
/* store params, issue command to get UAP channel, whose
|
||||
* CMD_RESP will callback remainder of 11H channel check
|
||||
* handling */
|
||||
|
@ -1499,7 +1525,8 @@ static mlan_status wlan_uap_11h_channel_check_req(pmlan_adapter pmadapter,
|
|||
ret = wlan_11h_config_master_radar_det(pmpriv, MTRUE);
|
||||
ret = wlan_11h_check_update_radar_det_state(pmpriv);
|
||||
}
|
||||
if (p11h_cfg->param.chan_rpt_req.millisec_dwell_time) {
|
||||
if (p11h_cfg->param.chan_rpt_req.millisec_dwell_time ||
|
||||
pmpriv->bss_type == MLAN_BSS_TYPE_DFS) {
|
||||
if (pmpriv->adapter->dfs_test_params
|
||||
.user_cac_period_msec) {
|
||||
PRINTM(MCMD_D,
|
||||
|
@ -1636,6 +1663,42 @@ static mlan_status wlan_uap_snmp_mib_11h(pmlan_adapter pmadapter,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set SNMP MIB for 11H
|
||||
*
|
||||
* @param pmadapter A pointer to mlan_adapter structure
|
||||
* @param pioctl_req A pointer to ioctl request buffer
|
||||
*
|
||||
* @return MLAN_STATUS_PENDING --success, otherwise fail
|
||||
* @sa wlan_uap_callback_snmp_mib_11h
|
||||
*/
|
||||
static mlan_status wlan_uap_snmp_mib_11h_fakeradar(pmlan_adapter pmadapter,
|
||||
pmlan_ioctl_req pioctl_req)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
|
||||
|
||||
ENTER();
|
||||
|
||||
if (pioctl_req->buf_len < sizeof(mlan_ds_snmp_mib)) {
|
||||
PRINTM(MWARN, "MLAN snmp_mib IOCTL length is too short.\n");
|
||||
pioctl_req->data_read_written = 0;
|
||||
pioctl_req->buf_len_needed = sizeof(mlan_ds_snmp_mib);
|
||||
LEAVE();
|
||||
return MLAN_STATUS_RESOURCE;
|
||||
}
|
||||
/* Send cmd to FW to trigger fakeradar in firmware */
|
||||
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_SNMP_MIB,
|
||||
HostCmd_ACT_GEN_SET, Dot11H_fakeRadar,
|
||||
(t_void *)pioctl_req, MNULL);
|
||||
|
||||
if (ret == MLAN_STATUS_SUCCESS)
|
||||
ret = MLAN_STATUS_PENDING;
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief ACS scan
|
||||
*
|
||||
|
@ -1998,6 +2061,10 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
break;
|
||||
case MLAN_IOCTL_MISC_CFG:
|
||||
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
|
||||
if (misc->sub_command == MLAN_OID_MISC_GET_SENSOR_TEMP) {
|
||||
status = wlan_misc_ioctl_get_sensor_temp(pmadapter,
|
||||
pioctl_req);
|
||||
}
|
||||
if (misc->sub_command == MLAN_OID_MISC_INIT_SHUTDOWN)
|
||||
status = wlan_misc_ioctl_init_shutdown(pmadapter,
|
||||
pioctl_req);
|
||||
|
@ -2060,6 +2127,11 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
if (misc->sub_command == MLAN_OID_MISC_IND_RST_CFG)
|
||||
status = wlan_misc_ioctl_ind_rst_cfg(pmadapter,
|
||||
pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_MC_AGGR_CFG)
|
||||
status = wlan_misc_ioctl_mc_aggr_cfg(pmadapter,
|
||||
pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_CH_LOAD)
|
||||
status = wlan_misc_ioctl_ch_load(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_GET_TSF)
|
||||
status = wlan_misc_ioctl_get_tsf(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_GET_CHAN_REGION_CFG)
|
||||
|
@ -2075,6 +2147,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_PER_PKT_CFG)
|
||||
status = wlan_misc_per_pkt_cfg(pmadapter, pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_NET_MONITOR)
|
||||
status = wlan_misc_ioctl_net_monitor(pmadapter,
|
||||
pioctl_req);
|
||||
if (misc->sub_command == MLAN_OID_MISC_FW_DUMP_EVENT)
|
||||
status = wlan_misc_ioctl_fw_dump_event(pmadapter,
|
||||
pioctl_req);
|
||||
|
@ -2162,6 +2237,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
status = wlan_uap_snmp_mib_11d(pmadapter, pioctl_req);
|
||||
if (snmp->sub_command == MLAN_OID_SNMP_MIB_DOT11H)
|
||||
status = wlan_uap_snmp_mib_11h(pmadapter, pioctl_req);
|
||||
if (snmp->sub_command == MLAN_OID_SNMP_MIB_DOT11H_FAKERADAR)
|
||||
status = wlan_uap_snmp_mib_11h_fakeradar(pmadapter,
|
||||
pioctl_req);
|
||||
break;
|
||||
case MLAN_IOCTL_SEC_CFG:
|
||||
sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf;
|
||||
|
@ -2203,6 +2281,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
|
|||
if (cfg11h->sub_command == MLAN_OID_11H_CHAN_SWITCH_COUNT)
|
||||
status = wlan_11h_ioctl_chan_switch_count(pmadapter,
|
||||
pioctl_req);
|
||||
if (cfg11h->sub_command == MLAN_OID_11H_CHAN_DFS_STATE)
|
||||
status = wlan_11h_ioctl_chan_dfs_state(pmadapter,
|
||||
pioctl_req);
|
||||
if (cfg11h->sub_command == MLAN_OID_11H_DFS_W53_CFG)
|
||||
status = wlan_11h_ioctl_dfs_w53_cfg(pmadapter,
|
||||
pioctl_req);
|
||||
|
|
|
@ -271,6 +271,37 @@ t_void *wlan_ops_uap_process_txpd(t_void *priv, pmlan_buffer pmbuf)
|
|||
plocal_tx_pd->tx_control |= TXPD_RETRY_ENABLE;
|
||||
}
|
||||
}
|
||||
if (pmbuf->flags & MLAN_BUF_FLAG_MC_AGGR_PKT) {
|
||||
tx_ctrl *ctrl = (tx_ctrl *)&plocal_tx_pd->tx_control;
|
||||
mc_tx_ctrl *mc_ctrl =
|
||||
(mc_tx_ctrl *)&plocal_tx_pd->pkt_delay_2ms;
|
||||
plocal_tx_pd->tx_pkt_type = PKT_TYPE_802DOT11_MC_AGGR;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_START_CYCLE)
|
||||
ctrl->mc_cycle_start = MTRUE;
|
||||
else
|
||||
ctrl->mc_cycle_start = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_END_CYCLE)
|
||||
ctrl->mc_cycle_end = MTRUE;
|
||||
else
|
||||
ctrl->mc_cycle_end = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_START_AMPDU)
|
||||
ctrl->mc_ampdu_start = MTRUE;
|
||||
else
|
||||
ctrl->mc_ampdu_start = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_END_AMPDU)
|
||||
ctrl->mc_ampdu_end = MTRUE;
|
||||
else
|
||||
ctrl->mc_ampdu_end = MFALSE;
|
||||
if (pmbuf->u.mc_tx_info.mc_pkt_flags & MC_FLAG_RETRY)
|
||||
ctrl->mc_pkt_retry = MTRUE;
|
||||
else
|
||||
ctrl->mc_pkt_retry = MFALSE;
|
||||
ctrl->bw = pmbuf->u.mc_tx_info.bandwidth & 0x7;
|
||||
ctrl->tx_rate = pmbuf->u.mc_tx_info.mcs_index & 0x1f;
|
||||
mc_ctrl->abs_tsf_expirytime =
|
||||
wlan_cpu_to_le32(pmbuf->u.mc_tx_info.pkt_expiry);
|
||||
mc_ctrl->mc_seq = wlan_cpu_to_le16(pmbuf->u.mc_tx_info.seq_num);
|
||||
}
|
||||
|
||||
endian_convert_TxPD(plocal_tx_pd);
|
||||
|
||||
|
@ -321,6 +352,11 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf)
|
|||
/* Endian conversion */
|
||||
endian_convert_RxPD(prx_pd);
|
||||
|
||||
if (prx_pd->flags & RXPD_FLAG_EXTRA_HEADER) {
|
||||
endian_convert_RxPD_extra_header(
|
||||
(rxpd_extra_info *)((t_u8 *)prx_pd + sizeof(*prx_pd)));
|
||||
}
|
||||
|
||||
if (priv->adapter->pcard_info->v14_fw_api) {
|
||||
t_u8 rxpd_rate_info_orig = prx_pd->rate_info;
|
||||
prx_pd->rate_info = wlan_convert_v14_rx_rate_info(
|
||||
|
@ -634,6 +670,11 @@ mlan_status wlan_process_uap_rx_packet(mlan_private *priv, pmlan_buffer pmbuf)
|
|||
PRINTM(MDATA, "Rx dest " MACSTR "\n",
|
||||
MAC2STR(prx_pkt->eth803_hdr.dest_addr));
|
||||
|
||||
if (pmadapter->enable_net_mon) {
|
||||
pmbuf->flags |= MLAN_BUF_FLAG_NET_MONITOR;
|
||||
goto upload;
|
||||
}
|
||||
|
||||
/* don't do packet forwarding in disconnected state */
|
||||
/* don't do packet forwarding when packet > 1514 */
|
||||
if (priv->media_connected == MFALSE)
|
||||
|
@ -805,6 +846,14 @@ upload:
|
|||
PRINTM(MDATA, "%lu.%06lu : Data => kernel seq_num=%d tid=%d\n",
|
||||
pmbuf->out_ts_sec, pmbuf->out_ts_usec, prx_pd->seq_num,
|
||||
prx_pd->priority);
|
||||
if (pmbuf->flags & MLAN_BUF_FLAG_NET_MONITOR) {
|
||||
// Use some rxpd space to save rxpd info for radiotap header
|
||||
// We should insure radiotap_info is not bigger than RxPD
|
||||
wlan_rxpdinfo_to_radiotapinfo(
|
||||
priv, (RxPD *)prx_pd,
|
||||
(radiotap_info *)(pmbuf->pbuf + pmbuf->data_offset -
|
||||
sizeof(radiotap_info)));
|
||||
}
|
||||
|
||||
ret = pmadapter->callbacks.moal_recv_packet(pmadapter->pmoal_handle,
|
||||
pmbuf);
|
||||
|
|
|
@ -93,6 +93,16 @@ static const struct _mlan_card_info mlan_card_info_usb9097 = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#ifdef USBNW62X
|
||||
static const struct _mlan_card_info mlan_card_info_usbNW62X = {
|
||||
.max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K,
|
||||
.v16_fw_api = 1,
|
||||
.v17_fw_api = 1,
|
||||
.supp_ps_handshake = 1,
|
||||
.default_11n_tx_bf_cap = DEFAULT_11N_TX_BF_CAP_2X2,
|
||||
};
|
||||
#endif
|
||||
|
||||
/********************************************************
|
||||
Global Variables
|
||||
********************************************************/
|
||||
|
@ -245,6 +255,11 @@ static mlan_status wlan_usb_prog_fw_w_helper(pmlan_adapter pmadapter,
|
|||
if (IS_USB9097(pmadapter->card_type))
|
||||
check_fw_status = MTRUE;
|
||||
#endif
|
||||
#if defined(USBNW62X)
|
||||
if (IS_USBNW62X(pmadapter->card_type))
|
||||
check_fw_status = MTRUE;
|
||||
#endif
|
||||
|
||||
do {
|
||||
/* Send pseudo data to check winner status first */
|
||||
if (check_winner) {
|
||||
|
@ -767,6 +782,11 @@ mlan_status wlan_get_usb_device(pmlan_adapter pmadapter)
|
|||
case CARD_TYPE_USB9097:
|
||||
pmadapter->pcard_info = &mlan_card_info_usb9097;
|
||||
break;
|
||||
#endif
|
||||
#ifdef USBNW62X
|
||||
case CARD_TYPE_USBNW62X:
|
||||
pmadapter->pcard_info = &mlan_card_info_usbNW62X;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
PRINTM(MERROR, "can't get right USB card type \n");
|
||||
|
@ -1167,7 +1187,7 @@ static mlan_status wlan_usb_host_to_card(pmlan_private pmpriv, t_u8 type,
|
|||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
if (type == MLAN_TYPE_CMD
|
||||
#if (defined(USB9098) || defined(USB9097))
|
||||
#if (defined(USB9098) || defined(USB9097) || defined(USBNW62X))
|
||||
|| type == MLAN_TYPE_VDLL
|
||||
#endif
|
||||
) {
|
||||
|
|
|
@ -1110,13 +1110,13 @@ static int wlan_dequeue_tx_packet(pmlan_adapter pmadapter)
|
|||
}
|
||||
}
|
||||
}
|
||||
if (!ptr->is_11n_enabled ||
|
||||
if (!ptr->is_wmm_enabled ||
|
||||
(ptr->ba_status || ptr->del_ba_count >= DEL_BA_THRESHOLD)
|
||||
#ifdef STA_SUPPORT
|
||||
|| priv->wps.session_enable
|
||||
#endif /* STA_SUPPORT */
|
||||
) {
|
||||
if (ptr->is_11n_enabled && ptr->ba_status &&
|
||||
if (ptr->is_wmm_enabled && ptr->ba_status &&
|
||||
ptr->amsdu_in_ampdu &&
|
||||
wlan_is_amsdu_allowed(priv, ptr, tid) &&
|
||||
(wlan_num_pkts_in_txq(priv, ptr, pmadapter->tx_buf_size) >=
|
||||
|
@ -1668,8 +1668,8 @@ void wlan_ralist_add(mlan_private *priv, t_u8 *ra)
|
|||
ra_list->ba_status = BA_STREAM_NOT_SETUP;
|
||||
ra_list->amsdu_in_ampdu = MFALSE;
|
||||
if (queuing_ra_based(priv)) {
|
||||
ra_list->is_11n_enabled = wlan_is_11n_enabled(priv, ra);
|
||||
if (ra_list->is_11n_enabled)
|
||||
ra_list->is_wmm_enabled = wlan_is_11n_enabled(priv, ra);
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu =
|
||||
get_station_max_amsdu_size(priv, ra);
|
||||
ra_list->tx_pause = wlan_is_tx_pause(priv, ra);
|
||||
|
@ -1678,25 +1678,25 @@ void wlan_ralist_add(mlan_private *priv, t_u8 *ra)
|
|||
ra_list->tx_pause = MFALSE;
|
||||
status = wlan_get_tdls_link_status(priv, ra);
|
||||
if (MTRUE == wlan_is_tdls_link_setup(status)) {
|
||||
ra_list->is_11n_enabled =
|
||||
ra_list->is_wmm_enabled =
|
||||
is_station_11n_enabled(priv, ra);
|
||||
if (ra_list->is_11n_enabled)
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu =
|
||||
get_station_max_amsdu_size(priv,
|
||||
ra);
|
||||
ra_list->is_tdls_link = MTRUE;
|
||||
} else {
|
||||
ra_list->is_11n_enabled = IS_11N_ENABLED(priv);
|
||||
if (ra_list->is_11n_enabled)
|
||||
ra_list->is_wmm_enabled = IS_11N_ENABLED(priv);
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu = priv->max_amsdu;
|
||||
}
|
||||
}
|
||||
|
||||
PRINTM_NETINTF(MDATA, priv);
|
||||
PRINTM(MDATA, "ralist %p: is_11n_enabled=%d max_amsdu=%d\n",
|
||||
ra_list, ra_list->is_11n_enabled, ra_list->max_amsdu);
|
||||
PRINTM(MDATA, "ralist %p: is_wmm_enabled=%d max_amsdu=%d\n",
|
||||
ra_list, ra_list->is_wmm_enabled, ra_list->max_amsdu);
|
||||
|
||||
if (ra_list->is_11n_enabled) {
|
||||
if (ra_list->is_wmm_enabled) {
|
||||
ra_list->packet_count = 0;
|
||||
ra_list->ba_packet_threshold =
|
||||
wlan_get_random_ba_threshold(pmadapter);
|
||||
|
@ -2008,15 +2008,15 @@ int wlan_ralist_update(mlan_private *priv, t_u8 *old_ra, t_u8 *new_ra)
|
|||
update_count++;
|
||||
|
||||
if (queuing_ra_based(priv)) {
|
||||
ra_list->is_11n_enabled =
|
||||
ra_list->is_wmm_enabled =
|
||||
wlan_is_11n_enabled(priv, new_ra);
|
||||
if (ra_list->is_11n_enabled)
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu =
|
||||
get_station_max_amsdu_size(
|
||||
priv, new_ra);
|
||||
} else {
|
||||
ra_list->is_11n_enabled = IS_11N_ENABLED(priv);
|
||||
if (ra_list->is_11n_enabled)
|
||||
ra_list->is_wmm_enabled = IS_11N_ENABLED(priv);
|
||||
if (ra_list->is_wmm_enabled)
|
||||
ra_list->max_amsdu = priv->max_amsdu;
|
||||
}
|
||||
|
||||
|
@ -2029,7 +2029,7 @@ int wlan_ralist_update(mlan_private *priv, t_u8 *old_ra, t_u8 *new_ra)
|
|||
PRINTM(MINFO,
|
||||
"ralist_update: %p, %d, " MACSTR "-->" MACSTR
|
||||
"\n",
|
||||
ra_list, ra_list->is_11n_enabled,
|
||||
ra_list, ra_list->is_wmm_enabled,
|
||||
MAC2STR(ra_list->ra), MAC2STR(new_ra));
|
||||
|
||||
memcpy_ext(priv->adapter, ra_list->ra, new_ra,
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* It also defines the data structures used for APIs between MLAN and MOAL.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file declares the generic data structures and APIs.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -24,7 +24,7 @@
|
|||
#define _MLAN_DECL_H_
|
||||
|
||||
/** MLAN release version */
|
||||
#define MLAN_RELEASE_VERSION "299.p1"
|
||||
#define MLAN_RELEASE_VERSION "322"
|
||||
|
||||
/** Re-define generic data types for MLAN/MOAL */
|
||||
/** Signed char (1-byte) */
|
||||
|
@ -98,6 +98,8 @@ typedef t_s32 t_sval;
|
|||
/** MLAN FALSE */
|
||||
#define MFALSE (0)
|
||||
|
||||
#define CHANNEL_SPEC_SNIFFER_MODE 1
|
||||
|
||||
#ifndef MACSTR
|
||||
/** MAC address security format */
|
||||
#define MACSTR "%02x:XX:XX:XX:%02x:%02x"
|
||||
|
@ -375,6 +377,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_9177 0x09
|
||||
/** 8801 card type */
|
||||
#define CARD_TYPE_8801 0x0a
|
||||
/** OWL card type */
|
||||
#define CARD_TYPE_NW62X 0x0b
|
||||
|
||||
/** 9098 A0 reverion num */
|
||||
#define CHIP_9098_REV_A0 1
|
||||
|
@ -406,6 +410,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8))
|
||||
/** SD8801 card type */
|
||||
#define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8))
|
||||
/** SD_NW62X card type */
|
||||
#define CARD_TYPE_SDNW62X (CARD_TYPE_NW62X | (INTF_SD << 8))
|
||||
|
||||
#define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct))
|
||||
#define IS_SD8897(ct) (CARD_TYPE_SD8897 == (ct))
|
||||
|
@ -417,6 +423,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct))
|
||||
#define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct))
|
||||
#define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct))
|
||||
#define IS_SDNW62X(ct) (CARD_TYPE_SDNW62X == (ct))
|
||||
|
||||
/** SD8887 Card */
|
||||
#define CARD_SD8887 "SD8887"
|
||||
|
@ -431,15 +438,15 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** SD8987 Card */
|
||||
#define CARD_SD8987 "SD8987"
|
||||
/** SD9097 Card */
|
||||
#define CARD_SD9097 "SD9097"
|
||||
/** SDIW620 Card */
|
||||
#define CARD_SDIW620 "SDIW620"
|
||||
#define CARD_SD9097 "SDIW620"
|
||||
/** SD9098 Card */
|
||||
#define CARD_SD9098 "SD9098"
|
||||
/** SD9177 Card */
|
||||
#define CARD_SD9177 "SD9177"
|
||||
/** SD8801 Card */
|
||||
#define CARD_SD8801 "SD8801"
|
||||
/** SDNW62X Card */
|
||||
#define CARD_SDNW62X "SDNW62X"
|
||||
#endif
|
||||
|
||||
#ifdef PCIE
|
||||
|
@ -451,26 +458,29 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8))
|
||||
/** PCIE9098 card type */
|
||||
#define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8))
|
||||
/** PCIENW62X card type */
|
||||
#define CARD_TYPE_PCIENW62X (CARD_TYPE_NW62X | (INTF_PCIE << 8))
|
||||
|
||||
#define IS_PCIE8897(ct) (CARD_TYPE_PCIE8897 == (ct))
|
||||
#define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct))
|
||||
#define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct))
|
||||
#define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct))
|
||||
#define IS_PCIENW62X(ct) (CARD_TYPE_PCIENW62X == (ct))
|
||||
|
||||
/** PCIE8897 Card */
|
||||
#define CARD_PCIE8897 "PCIE8897"
|
||||
/** PCIE8997 Card */
|
||||
#define CARD_PCIE8997 "PCIE8997"
|
||||
/** PCIE9097 Card */
|
||||
#define CARD_PCIE9097 "PCIE9097"
|
||||
/** PCIEIW620 Card */
|
||||
#define CARD_PCIEIW620 "PCIEIW620"
|
||||
#define CARD_PCIE9097 "PCIEIW620"
|
||||
/** PCIE9000S Card */
|
||||
#define CARD_PCIE9000S "PCIE9000S"
|
||||
/** PCIE9098 Card */
|
||||
#define CARD_PCIE9098 "PCIE9098"
|
||||
/** PCIEAW690 Card */
|
||||
#define CARD_PCIEAW690 "PCIEAW690"
|
||||
/** PCIENW62X Card */
|
||||
#define CARD_PCIENW62X "PCIENW62X"
|
||||
#endif
|
||||
|
||||
#ifdef USB
|
||||
|
@ -486,6 +496,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8))
|
||||
/** USB9097 card type */
|
||||
#define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8))
|
||||
/** USBNW62X card type */
|
||||
#define CARD_TYPE_USBNW62X (CARD_TYPE_NW62X | (INTF_USB << 8))
|
||||
|
||||
#define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct))
|
||||
#define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct))
|
||||
|
@ -493,6 +505,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct))
|
||||
#define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct))
|
||||
#define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct))
|
||||
#define IS_USBNW62X(ct) (CARD_TYPE_USBNW62X == (ct))
|
||||
|
||||
/** USB8801 Card */
|
||||
#define CARD_USB8801 "USB8801"
|
||||
|
@ -505,9 +518,9 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
/** USB9098 Card */
|
||||
#define CARD_USB9098 "USB9098"
|
||||
/** USB9097 Card */
|
||||
#define CARD_USB9097 "USB9097"
|
||||
/** USBIW620 Card */
|
||||
#define CARD_USBIW620 "USBIW620"
|
||||
#define CARD_USB9097 "USBIW620"
|
||||
/** USBNW62X Card */
|
||||
#define CARD_USBNW62X "USBNW62X"
|
||||
#endif
|
||||
|
||||
#define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf))
|
||||
|
@ -519,6 +532,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
|
|||
#define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf))
|
||||
#define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf))
|
||||
#define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf))
|
||||
#define IS_CARDNW62X(ct) (CARD_TYPE_NW62X == ((ct)&0xf))
|
||||
|
||||
typedef struct _card_type_entry {
|
||||
t_u16 card_type;
|
||||
|
@ -578,6 +592,9 @@ typedef enum {
|
|||
/** Buffer flag for TX_STATUS */
|
||||
#define MLAN_BUF_FLAG_TX_STATUS MBIT(10)
|
||||
|
||||
/** Buffer flag for NET_MONITOR */
|
||||
#define MLAN_BUF_FLAG_NET_MONITOR MBIT(11)
|
||||
|
||||
/** Buffer flag for NULL data packet */
|
||||
#define MLAN_BUF_FLAG_NULL_PKT MBIT(12)
|
||||
/** Buffer flag for Diag pkt */
|
||||
|
@ -585,6 +602,8 @@ typedef enum {
|
|||
|
||||
#define MLAN_BUF_FLAG_TX_CTRL MBIT(14)
|
||||
|
||||
#define MLAN_BUF_FLAG_MC_AGGR_PKT MBIT(17)
|
||||
|
||||
#ifdef DEBUG_LEVEL1
|
||||
/** Debug level bit definition */
|
||||
#define MMSG MBIT(0)
|
||||
|
@ -694,6 +713,7 @@ typedef enum _mlan_bss_type {
|
|||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
MLAN_BSS_TYPE_WIFIDIRECT = 2,
|
||||
#endif
|
||||
MLAN_BSS_TYPE_DFS = 8,
|
||||
MLAN_BSS_TYPE_ANY = 0xff,
|
||||
} mlan_bss_type;
|
||||
|
||||
|
@ -767,6 +787,7 @@ typedef enum _mlan_event_id {
|
|||
#if defined(PCIE)
|
||||
MLAN_EVENT_ID_SSU_DUMP_FILE = 0x00000039,
|
||||
#endif /* SSU_SUPPORT */
|
||||
MLAN_EVENT_ID_CSI = 0x00000040,
|
||||
/* Event generated by MLAN driver (MSB=1) */
|
||||
MLAN_EVENT_ID_DRV_CONNECTED = 0x80000001,
|
||||
MLAN_EVENT_ID_DRV_DEFER_HANDLING = 0x80000002,
|
||||
|
@ -789,6 +810,7 @@ typedef enum _mlan_event_id {
|
|||
#ifdef UAP_SUPPORT
|
||||
MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
|
||||
#endif
|
||||
MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023,
|
||||
MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026,
|
||||
MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027,
|
||||
MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028,
|
||||
|
@ -875,6 +897,7 @@ enum mlan_channel_type {
|
|||
enum { BAND_2GHZ = 0,
|
||||
BAND_5GHZ = 1,
|
||||
BAND_4GHZ = 2,
|
||||
BAND_6GHZ = 3,
|
||||
};
|
||||
|
||||
/** channel offset */
|
||||
|
@ -925,16 +948,6 @@ typedef enum _dfs_w53_cfg_t {
|
|||
|
||||
/** Band_Config_t */
|
||||
typedef MLAN_PACK_START struct _Band_Config_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/
|
||||
t_u8 scanMode : 2;
|
||||
/** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */
|
||||
t_u8 chan2Offset : 2;
|
||||
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
|
||||
t_u8 chanWidth : 2;
|
||||
/** Band Info - (00)=2.4GHz, (01)=5GHz */
|
||||
t_u8 chanBand : 2;
|
||||
#else
|
||||
/** Band Info - (00)=2.4GHz, (01)=5GHz */
|
||||
t_u8 chanBand : 2;
|
||||
/** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */
|
||||
|
@ -943,7 +956,6 @@ typedef MLAN_PACK_START struct _Band_Config_t {
|
|||
t_u8 chan2Offset : 2;
|
||||
/** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=Adoption mode*/
|
||||
t_u8 scanMode : 2;
|
||||
#endif
|
||||
} MLAN_PACK_END Band_Config_t;
|
||||
|
||||
/** channel_band_t */
|
||||
|
@ -1033,6 +1045,45 @@ typedef struct _mlan_cmdresp_event {
|
|||
} mlan_cmdresp_event, *pmlan_cmdresp_event;
|
||||
|
||||
/** csi event data structure */
|
||||
typedef MLAN_PACK_START struct _csi_record_ds {
|
||||
/** Length in DWORDS, including header */
|
||||
t_u16 Len;
|
||||
/** CSI signature. 0xABCD fixed */
|
||||
t_u16 CSI_Sign;
|
||||
/** User defined HeaderID */
|
||||
t_u32 CSI_HeaderID;
|
||||
/** Packet info field */
|
||||
t_u16 PKT_info;
|
||||
/** Frame control field for the received packet*/
|
||||
t_u16 FCF;
|
||||
/** Timestamp when packet received */
|
||||
t_u64 TSF;
|
||||
/** Received Packet Destination MAC Address */
|
||||
t_u8 Dst_MAC[6];
|
||||
/** Received Packet Source MAC Address */
|
||||
t_u8 Src_MAC[6];
|
||||
/** RSSI for antenna A */
|
||||
t_u8 Rx_RSSI_A;
|
||||
/** RSSI for antenna B */
|
||||
t_u8 Rx_RSSI_B;
|
||||
/** Noise floor for antenna A */
|
||||
t_u8 Rx_NF_A;
|
||||
/** Noise floor for antenna A */
|
||||
t_u8 Rx_NF_B;
|
||||
/** Rx signal strength above noise floor */
|
||||
t_u8 Rx_SINR;
|
||||
/** Channel */
|
||||
t_u8 channel;
|
||||
/** user defined Chip ID */
|
||||
t_u16 chip_id;
|
||||
/** Reserved */
|
||||
t_u32 rsvd;
|
||||
/** CSI data length in DWORDs */
|
||||
t_u32 CSI_Data_Length;
|
||||
/** Start of CSI data */
|
||||
t_u8 CSI_Data[0];
|
||||
/** At the end of CSI raw data, user defined TailID of 4 bytes*/
|
||||
} MLAN_PACK_END csi_record_ds, *pcsi_record_ds;
|
||||
|
||||
/** mlan_ioctl_req data structure */
|
||||
typedef struct _mlan_ioctl_req {
|
||||
|
@ -1060,18 +1111,52 @@ typedef struct _mlan_ioctl_req {
|
|||
t_ptr reserved_1;
|
||||
} mlan_ioctl_req, *pmlan_ioctl_req;
|
||||
|
||||
typedef MLAN_PACK_START struct _mix_rate_info {
|
||||
/** bit0: LGI: gi=0, SGI: gi= 1 */
|
||||
/** bit1-2: 20M: bw=0, 40M: bw=1, 80M: bw=2, 160M: bw=3 */
|
||||
/** bit3-4: LG: format=0, HT: format=1, VHT: format=2 */
|
||||
/** bit5: LDPC: 0-not support, 1-support */
|
||||
/** bit6-7:reserved */
|
||||
t_u8 rate_info;
|
||||
/** MCS index */
|
||||
t_u8 mcs_index;
|
||||
/** bitrate, in 500Kbps */
|
||||
t_u16 bitrate;
|
||||
} MLAN_PACK_END mix_rate_info, *pmix_rate_info;
|
||||
|
||||
typedef MLAN_PACK_START struct _rxpd_extra_info {
|
||||
/** flags */
|
||||
t_u8 flags;
|
||||
/** channel.flags */
|
||||
t_u16 channel_flags;
|
||||
/** mcs.known */
|
||||
t_u8 mcs_known;
|
||||
/** mcs.flags */
|
||||
t_u8 mcs_flags;
|
||||
/** vht sig1 */
|
||||
t_u32 vht_sig1;
|
||||
/** vht sig2 */
|
||||
t_u32 vht_sig2;
|
||||
} MLAN_PACK_END rxpd_extra_info, *prxpd_extra_info;
|
||||
|
||||
typedef MLAN_PACK_START struct _radiotap_info {
|
||||
/** Rate Info */
|
||||
mix_rate_info rate_info;
|
||||
/** SNR */
|
||||
t_s8 snr;
|
||||
/** Noise Floor */
|
||||
t_s8 nf;
|
||||
/** band config */
|
||||
t_u8 band_config;
|
||||
/** chan number */
|
||||
t_u8 chan_num;
|
||||
t_u8 antenna;
|
||||
/** extra rxpd info from FW */
|
||||
rxpd_extra_info extra_info;
|
||||
} MLAN_PACK_END radiotap_info, *pradiotap_info;
|
||||
|
||||
/** txpower structure */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Host tx power ctrl:
|
||||
0x0: use fw setting for TX power
|
||||
0x1: value specified in bit[6] and bit[5:0] are valid */
|
||||
t_u8 hostctl : 1;
|
||||
/** Sign of the power specified in bit[5:0] */
|
||||
t_u8 sign : 1;
|
||||
/** Power to be used for transmission(in dBm) */
|
||||
t_u8 abs_val : 6;
|
||||
#else
|
||||
/** Power to be used for transmission(in dBm) */
|
||||
t_u8 abs_val : 6;
|
||||
/** Sign of the power specified in bit[5:0] */
|
||||
|
@ -1080,7 +1165,6 @@ typedef MLAN_PACK_START struct {
|
|||
0x0: use fw setting for TX power
|
||||
0x1: value specified in bit[6] and bit[5:0] are valid */
|
||||
t_u8 hostctl : 1;
|
||||
#endif
|
||||
} MLAN_PACK_END tx_power_t;
|
||||
/* pkt_txctrl */
|
||||
typedef MLAN_PACK_START struct _pkt_txctrl {
|
||||
|
@ -1111,6 +1195,25 @@ typedef MLAN_PACK_START struct _pkt_rxinfo {
|
|||
t_u8 rssi;
|
||||
} MLAN_PACK_END pkt_rxinfo, *ppkt_rxinfo;
|
||||
|
||||
#define MC_FLAG_RETRY MBIT(0)
|
||||
#define MC_FLAG_START_CYCLE MBIT(1)
|
||||
#define MC_FLAG_END_CYCLE MBIT(2)
|
||||
#define MC_FLAG_START_AMPDU MBIT(3)
|
||||
#define MC_FLAG_END_AMPDU MBIT(4)
|
||||
/* mc pkt txcontrol */
|
||||
typedef MLAN_PACK_START struct _mc_txcontrol {
|
||||
/** Data rate in mcs index, 0-7 */
|
||||
t_u8 mcs_index;
|
||||
/** band width 0-20Mhz, 1-40Mhz */
|
||||
t_u8 bandwidth;
|
||||
/** seq_num */
|
||||
t_u16 seq_num;
|
||||
/** packet expiry time */
|
||||
t_u32 pkt_expiry;
|
||||
/** mc_pkt_flags */
|
||||
t_u8 mc_pkt_flags;
|
||||
} MLAN_PACK_END mc_txcontrol, *pmc_txcontrol;
|
||||
|
||||
/** mlan_buffer data structure */
|
||||
typedef struct _mlan_buffer {
|
||||
/** Pointer to previous mlan_buffer */
|
||||
|
@ -1162,6 +1265,7 @@ typedef struct _mlan_buffer {
|
|||
/** Use count for this buffer */
|
||||
t_u32 use_count;
|
||||
union {
|
||||
mc_txcontrol mc_tx_info;
|
||||
pkt_txctrl tx_info;
|
||||
pkt_rxinfo rx_info;
|
||||
} u;
|
||||
|
@ -2270,4 +2374,6 @@ MLAN_API mlan_status mlan_disable_host_int(t_void *padapter);
|
|||
/** mlan unmask host interrupt */
|
||||
MLAN_API mlan_status mlan_enable_host_int(t_void *padapter);
|
||||
|
||||
#define CSI_SIGNATURE 0xABCD
|
||||
|
||||
#endif /* !_MLAN_DECL_H_ */
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* definitions used in MLAN and MOAL module.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -46,17 +46,10 @@ typedef enum _WLAN_802_11_NETWORK_TYPE {
|
|||
Wlan802_11NetworkTypeMax
|
||||
} WLAN_802_11_NETWORK_TYPE;
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Frame control: Type Mgmt frame */
|
||||
#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x3000
|
||||
/** Frame control: SubType Mgmt frame */
|
||||
#define IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(fc) (((fc)&0xF000) >> 12)
|
||||
#else
|
||||
/** Frame control: Type Mgmt frame */
|
||||
#define IEEE80211_FC_MGMT_FRAME_TYPE_MASK 0x000C
|
||||
/** Frame control: SubType Mgmt frame */
|
||||
#define IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(fc) (((fc)&0x00F0) >> 4)
|
||||
#endif
|
||||
|
||||
#ifdef PRAGMA_PACK
|
||||
#pragma pack(push, 1)
|
||||
|
@ -67,7 +60,8 @@ typedef enum _WLAN_802_11_NETWORK_TYPE {
|
|||
|
||||
typedef enum _IEEEtypes_Ext_ElementId_e {
|
||||
HE_CAPABILITY = 35,
|
||||
HE_OPERATION = 36
|
||||
HE_OPERATION = 36,
|
||||
HE_6G_CAPABILITY = 59
|
||||
} IEEEtypes_Ext_ElementId_e;
|
||||
|
||||
/** IEEE Type definitions */
|
||||
|
@ -178,21 +172,12 @@ typedef MLAN_PACK_START struct _IEEEtypes_Generic_t {
|
|||
|
||||
/**ft capability policy*/
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_FtCapPolicy_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 6;
|
||||
/** RIC support */
|
||||
t_u8 ric : 1;
|
||||
/** FT over the DS capable */
|
||||
t_u8 ft_over_ds : 1;
|
||||
#else
|
||||
/** FT over the DS capable */
|
||||
t_u8 ft_over_ds : 1;
|
||||
/** RIC support */
|
||||
t_u8 ric : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 6;
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_FtCapPolicy_t;
|
||||
|
||||
/** Mobility domain IE */
|
||||
|
@ -325,25 +310,6 @@ typedef MLAN_PACK_START struct _TLV_Generic_t {
|
|||
#define CAPINFO_MASK (~(MBIT(15) | MBIT(14) | MBIT(11) | MBIT(9)))
|
||||
|
||||
/** Capability Bit Map*/
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
|
||||
t_u8 rsrvd1 : 2;
|
||||
t_u8 dsss_ofdm : 1;
|
||||
t_u8 radio_measurement : 1;
|
||||
t_u8 rsvrd2 : 1;
|
||||
t_u8 short_slot_time : 1;
|
||||
t_u8 rsrvd3 : 1;
|
||||
t_u8 spectrum_mgmt : 1;
|
||||
t_u8 chan_agility : 1;
|
||||
t_u8 pbcc : 1;
|
||||
t_u8 short_preamble : 1;
|
||||
t_u8 privacy : 1;
|
||||
t_u8 cf_poll_rqst : 1;
|
||||
t_u8 cf_pollable : 1;
|
||||
t_u8 ibss : 1;
|
||||
t_u8 ess : 1;
|
||||
} MLAN_PACK_END IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
|
||||
#else
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
|
||||
/** Capability Bit Map : ESS */
|
||||
t_u8 ess : 1;
|
||||
|
@ -376,7 +342,6 @@ typedef MLAN_PACK_START struct _IEEEtypes_CapInfo_t {
|
|||
/** Capability Bit Map : Reserved */
|
||||
t_u8 rsrvd1 : 2;
|
||||
} MLAN_PACK_END IEEEtypes_CapInfo_t, *pIEEEtypes_CapInfo_t;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
/** IEEEtypes_Ssid_t */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_Ssid_t {
|
||||
|
@ -591,35 +556,16 @@ typedef MLAN_PACK_START struct _IEEEtypes_Wpa_t {
|
|||
|
||||
/** Data structure of WMM QoS information */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_WmmQosInfo_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
#else
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END IEEEtypes_WmmQosInfo_t, *pIEEEtypes_WmmQosInfo_t;
|
||||
|
||||
/** Data structure of WMM Aci/Aifsn */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_WmmAciAifsn_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
/** Aci */
|
||||
t_u8 aci : 2;
|
||||
/** Acm */
|
||||
t_u8 acm : 1;
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
#else
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
/** Acm */
|
||||
|
@ -628,22 +574,14 @@ typedef MLAN_PACK_START struct _IEEEtypes_WmmAciAifsn_t {
|
|||
t_u8 aci : 2;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END IEEEtypes_WmmAciAifsn_t, *pIEEEtypes_WmmAciAifsn_t;
|
||||
|
||||
/** Data structure of WMM ECW */
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_WmmEcw_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
#else
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} MLAN_PACK_END IEEEtypes_WmmEcw_t, *pIEEEtypes_WmmEcw_t;
|
||||
|
||||
/** Data structure of WMM AC parameters */
|
||||
|
@ -731,22 +669,6 @@ typedef MLAN_PACK_START enum _IEEEtypes_WMM_TSPEC_TS_TRAFFIC_TYPE_e {
|
|||
|
||||
/** Data structure of WMM TSPEC information */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u8 Reserved17_23 : 7; /* ! Reserved */
|
||||
t_u8 Schedule : 1;
|
||||
IEEEtypes_WMM_TSPEC_TS_Info_AckPolicy_e AckPolicy : 2;
|
||||
t_u8 UserPri : 3; /* ! 802.1d User Priority */
|
||||
// IEEEtypes_WMM_TSPEC_TS_Info_PSB_e PowerSaveBehavior : 1; /*
|
||||
// !Legacy/Trigg*/
|
||||
t_u8 PowerSaveBehavior : 1;
|
||||
t_u8 Aggregation : 1; /* ! Reserved */
|
||||
t_u8 AccessPolicy2 : 1; /* ! */
|
||||
t_u8 AccessPolicy1 : 1; /* ! */
|
||||
IEEEtypes_WMM_TSPEC_TS_Info_Direction_e Direction : 2;
|
||||
t_u8 TID : 4; /* ! Unique identifier */
|
||||
// IEEEtypes_WMM_TSPEC_TS_TRAFFIC_TYPE_e TrafficType : 1;
|
||||
t_u8 TrafficType : 1;
|
||||
#else
|
||||
// IEEEtypes_WMM_TSPEC_TS_TRAFFIC_TYPE_e TrafficType : 1;
|
||||
t_u8 TrafficType : 1;
|
||||
t_u8 TID : 4; /* ! Unique identifier */
|
||||
|
@ -761,31 +683,19 @@ typedef MLAN_PACK_START struct {
|
|||
IEEEtypes_WMM_TSPEC_TS_Info_AckPolicy_e AckPolicy : 2;
|
||||
t_u8 Schedule : 1;
|
||||
t_u8 Reserved17_23 : 7; /* ! Reserved */
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_WMM_TSPEC_TS_Info_t;
|
||||
|
||||
/** Data structure of WMM TSPEC Nominal Size */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u16 Fixed : 1; /* ! 1: Fixed size given in Size, 0: Var, size is
|
||||
nominal */
|
||||
t_u16 Size : 15; /* ! Nominal size in octets */
|
||||
#else
|
||||
t_u16 Size : 15; /* ! Nominal size in octets */
|
||||
t_u16 Fixed : 1; /* ! 1: Fixed size given in Size, 0: Var, size is
|
||||
nominal */
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_WMM_TSPEC_NomMSDUSize_t;
|
||||
|
||||
/** Data structure of WMM TSPEC SBWA */
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u16 Whole : 3; /* ! Whole portion */
|
||||
t_u16 Fractional : 13; /* ! Fractional portion */
|
||||
#else
|
||||
t_u16 Fractional : 13; /* ! Fractional portion */
|
||||
t_u16 Whole : 3; /* ! Whole portion */
|
||||
#endif
|
||||
} MLAN_PACK_END IEEEtypes_WMM_TSPEC_SBWA;
|
||||
|
||||
/** Data structure of WMM TSPEC Body */
|
||||
|
@ -1126,26 +1036,6 @@ typedef MLAN_PACK_START struct _VHT_MCS_set {
|
|||
/** VHT Capabilities info field, reference 802.11ac D1.4 p89 */
|
||||
typedef MLAN_PACK_START struct _VHT_capa {
|
||||
#if 0
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
t_u8 mpdu_max_len:2;
|
||||
t_u8 chan_width:2;
|
||||
t_u8 rx_LDPC:1;
|
||||
t_u8 sgi_80:1;
|
||||
t_u8 sgi_160:1;
|
||||
t_u8 tx_STBC:1;
|
||||
t_u8 rx_STBC:3;
|
||||
t_u8 SU_beamformer_capa:1;
|
||||
t_u8 SU_beamformee_capa:1;
|
||||
t_u8 beamformer_ante_num:3;
|
||||
t_u8 sounding_dim_num:3;
|
||||
t_u8 MU_beamformer_capa:1;
|
||||
t_u8 MU_beamformee_capa:1;
|
||||
t_u8 VHT_TXOP_ps:1;
|
||||
t_u8 HTC_VHT_capa:1;
|
||||
t_u8 max_ampdu_len:3;
|
||||
t_u8 link_apapt_capa:2;
|
||||
t_u8 reserved_1:4;
|
||||
#else
|
||||
t_u8 reserved_1:4;
|
||||
t_u8 link_apapt_capa:2;
|
||||
t_u8 max_ampdu_len:3;
|
||||
|
@ -1164,7 +1054,6 @@ typedef MLAN_PACK_START struct _VHT_capa {
|
|||
t_u8 rx_LDPC:1;
|
||||
t_u8 chan_width:2;
|
||||
t_u8 mpdu_max_len:2;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
#endif
|
||||
t_u32 vht_cap_info;
|
||||
VHT_MCS_set_t mcs_sets;
|
||||
|
@ -1272,6 +1161,32 @@ typedef MLAN_PACK_START struct _IEEEtypes_Extension_t {
|
|||
t_u8 data[];
|
||||
} MLAN_PACK_END IEEEtypes_Extension_t, *pIEEEtypes_Extension_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeMcsMap_t {
|
||||
/** Max HE-MAC for 1 SS */
|
||||
t_u8 max_mcs_1ss : 2;
|
||||
/** Max HE-MAC for 2 SS */
|
||||
t_u8 max_mcs_2ss : 2;
|
||||
/** Max HE-MAC for 3 SS */
|
||||
t_u8 max_mcs_3ss : 2;
|
||||
/** Max HE-MAC for 4 SS */
|
||||
t_u8 max_mcs_4ss : 2;
|
||||
/** Max HE-MAC for 5 SS */
|
||||
t_u8 max_mcs_5ss : 2;
|
||||
/** Max HE-MAC for 6 SS */
|
||||
t_u8 max_mcs_6ss : 2;
|
||||
/** Max HE-MAC for 7 SS */
|
||||
t_u8 max_mcs_7ss : 2;
|
||||
/** Max HE-MAC for 8 SS */
|
||||
t_u8 max_mcs_8ss : 2;
|
||||
} MLAN_PACK_END IEEEtypes_HeMcsMap_t, *pIEEEtypes_HeMcsMap_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeMcsNss_t {
|
||||
/** HE Rx MCS and NSS Set */
|
||||
t_u16 rx_mcs;
|
||||
/** HE Tx MCS and NSS Set*/
|
||||
t_u16 tx_mcs;
|
||||
} MLAN_PACK_END IEEEtypes_HeMcsNss_t, *pIEEEtypes_HeMcsNss_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HECap_t {
|
||||
/** Generic IE header */
|
||||
IEEEtypes_Header_t ieee_hdr;
|
||||
|
@ -1281,11 +1196,55 @@ typedef MLAN_PACK_START struct _IEEEtypes_HECap_t {
|
|||
t_u8 he_mac_cap[6];
|
||||
/** he phy capability info */
|
||||
t_u8 he_phy_cap[11];
|
||||
/** he txrx mcs support , size would be 4 or 8 or 12 */
|
||||
/** he txrx mcs support (for 80 MHz) */
|
||||
t_u8 he_txrx_mcs_support[4];
|
||||
/** PPE Thresholds (optional) */
|
||||
/** Optional Field, including he_txrx_mcs_support for 160 and 80+80 MHz,
|
||||
* and PPE Thresholds */
|
||||
t_u8 option[28];
|
||||
} MLAN_PACK_END IEEEtypes_HECap_t, *pIEEEtypes_HECap_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeOpParam_t {
|
||||
/** Default PE Duration */
|
||||
t_u16 default_pe_dur : 3; /* bit 0-2 */
|
||||
/** TWT Required */
|
||||
t_u16 twt_req : 1; /* bit 3 */
|
||||
/** TXOP Duration RTS Threshold */
|
||||
t_u16 txop_dur_rts_threshold : 10; /* bit 4-13 */
|
||||
/** VHT Operation Info Present */
|
||||
t_u16 vht_op_info_present : 1; /* bit 14 */
|
||||
/** Co-Hosted BSS */
|
||||
t_u16 co_located_bss : 1; /* bit 15 */
|
||||
/** ER SU Disable */
|
||||
t_u8 er_su_disable : 1; /* bit 16 */
|
||||
/** Reserved, including 6G Operation Info Pressent (bit17) */
|
||||
t_u8 reserved : 7; /* bit 17-23 */
|
||||
} MLAN_PACK_END IEEEtypes_HeOpParam_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeBssColorInfo_t {
|
||||
/** BSS Color */
|
||||
t_u8 bss_color : 6; /* bit 0-5 */
|
||||
/** Partial BSS Color */
|
||||
t_u8 partial_bss_color : 1; /* bit 6 */
|
||||
/** BSS Color Disabled */
|
||||
t_u8 bss_color_disabled : 1; /* bit 7 */
|
||||
} MLAN_PACK_END IEEEtypes_HeBssColorInfo_t;
|
||||
|
||||
typedef MLAN_PACK_START struct _IEEEtypes_HeOp_t {
|
||||
/** Generic IE header */
|
||||
IEEEtypes_Header_t ieee_hdr;
|
||||
/** Element id extension */
|
||||
t_u8 ext_id;
|
||||
/** HE Operation Parameters */
|
||||
IEEEtypes_HeOpParam_t he_op_param;
|
||||
/** BSS Color Info */
|
||||
IEEEtypes_HeBssColorInfo_t bss_color_info;
|
||||
/** Basic HE-MCS and NSS Set */
|
||||
IEEEtypes_HeMcsMap_t basic_he_mcs_nss;
|
||||
/** Optional Field, including VHT Operation Info Max Co-Hosted BSSID
|
||||
* Indicator, and 6Ghz Operation Info */
|
||||
t_u8 option[9];
|
||||
} MLAN_PACK_END IEEEtypes_HeOp_t;
|
||||
|
||||
/** default channel switch count */
|
||||
#define DEF_CHAN_SWITCH_COUNT 5
|
||||
|
||||
|
@ -1321,7 +1280,7 @@ typedef MLAN_PACK_START struct {
|
|||
} MLAN_PACK_END IEEEtypes_ExtChanSwitchAnn_t;
|
||||
|
||||
/** Maximum number of subbands in the IEEEtypes_SupportedChannels_t structure */
|
||||
#define WLAN_11H_MAX_SUBBANDS 5
|
||||
#define WLAN_11H_MAX_SUBBANDS 6
|
||||
/** Maximum number of DFS channels configured in IEEEtypes_IBSS_DFS_t */
|
||||
#define WLAN_11H_MAX_IBSS_DFS_CHANNELS 25
|
||||
|
||||
|
@ -1429,20 +1388,6 @@ typedef MLAN_PACK_START struct {
|
|||
*** @brief Map octet of the basic measurement report (7.3.2.22.1)
|
||||
**/
|
||||
typedef MLAN_PACK_START struct {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/**< Reserved */
|
||||
t_u8 rsvd5_7 : 3;
|
||||
/**< Channel is unmeasured */
|
||||
t_u8 unmeasured : 1;
|
||||
/**< Radar detected on channel */
|
||||
t_u8 radar : 1;
|
||||
/**< Unidentified signal found on channel */
|
||||
t_u8 unidentified_sig : 1;
|
||||
/**< OFDM preamble detected on channel */
|
||||
t_u8 ofdm_preamble : 1;
|
||||
/**< At least one valid MPDU received on channel */
|
||||
t_u8 bss : 1;
|
||||
#else
|
||||
/**< At least one valid MPDU received on channel */
|
||||
t_u8 bss : 1;
|
||||
/**< OFDM preamble detected on channel */
|
||||
|
@ -1455,7 +1400,6 @@ typedef MLAN_PACK_START struct {
|
|||
t_u8 unmeasured : 1;
|
||||
/**< Reserved */
|
||||
t_u8 rsvd5_7 : 3;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
|
||||
} MLAN_PACK_END MeasRptBasicMap_t;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file declares the IOCTL data structures and APIs.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -110,6 +110,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_SNMP_MIB_DTIM_PERIOD = 0x00040006,
|
||||
MLAN_OID_SNMP_MIB_SIGNALEXT_ENABLE = 0x00040007,
|
||||
MLAN_OID_SNMP_MIB_CTRL_DEAUTH = 0x00040008,
|
||||
MLAN_OID_SNMP_MIB_DOT11H_FAKERADAR = 0x00040009,
|
||||
MLAN_OID_SNMP_MIB_CHAN_TRACK = 0x0004000A,
|
||||
|
||||
/* Status Information Group */
|
||||
MLAN_IOCTL_GET_INFO = 0x00050000,
|
||||
|
@ -232,6 +234,7 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_11H_CHAN_REPORT_REQUEST = 0x00110004,
|
||||
MLAN_OID_11H_CHAN_SWITCH_COUNT = 0x00110005,
|
||||
MLAN_OID_11H_CHAN_NOP_INFO = 0x00110006,
|
||||
MLAN_OID_11H_CHAN_DFS_STATE = 0x00110007,
|
||||
MLAN_OID_11H_DFS_W53_CFG = 0x00110008,
|
||||
|
||||
/* 802.11n Configuration Group RANDYTODO for value assign */
|
||||
|
@ -262,6 +265,7 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_INIT_SHUTDOWN = 0x0020000D,
|
||||
MLAN_OID_MISC_CUSTOM_IE = 0x0020000F,
|
||||
MLAN_OID_MISC_TDLS_CONFIG = 0x00200010,
|
||||
MLAN_OID_MISC_NET_MONITOR = 0x00200011,
|
||||
MLAN_OID_MISC_TX_DATAPAUSE = 0x00200012,
|
||||
MLAN_OID_MISC_IP_ADDR = 0x00200013,
|
||||
MLAN_OID_MISC_MAC_CONTROL = 0x00200014,
|
||||
|
@ -306,6 +310,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_OPER_CLASS = 0x00200038,
|
||||
MLAN_OID_MISC_PMIC_CFG = 0x00200039,
|
||||
MLAN_OID_MISC_IND_RST_CFG = 0x00200040,
|
||||
MLAN_OID_MISC_ROAM_OFFLOAD = 0x00200042,
|
||||
MLAN_OID_MISC_ROAM_OFFLOAD_APLIST = 0x00200043,
|
||||
MLAN_OID_MISC_GET_TSF = 0x00200045,
|
||||
MLAN_OID_MISC_GET_CHAN_REGION_CFG = 0x00200046,
|
||||
MLAN_OID_MISC_CLOUD_KEEP_ALIVE = 0x00200048,
|
||||
|
@ -324,6 +330,7 @@ enum _mlan_ioctl_req_id {
|
|||
#if defined(PCIE)
|
||||
MLAN_OID_MISC_SSU = 0x00200062,
|
||||
#endif
|
||||
MLAN_OID_MISC_CSI = 0x00200064,
|
||||
MLAN_OID_MISC_DMCS_CONFIG = 0x00200065,
|
||||
MLAN_OID_MISC_RX_ABORT_CFG = 0x00200066,
|
||||
MLAN_OID_MISC_RX_ABORT_CFG_EXT = 0x00200067,
|
||||
|
@ -351,6 +358,8 @@ enum _mlan_ioctl_req_id {
|
|||
MLAN_OID_MISC_GET_TSF_INFO = 0x00200083,
|
||||
MLAN_OID_MISC_ASSOC_REQ = 0x00200084,
|
||||
MLAN_OID_MISC_IPS_CFG = 0x00200085,
|
||||
MLAN_OID_MISC_MC_AGGR_CFG = 0x00200086,
|
||||
MLAN_OID_MISC_CH_LOAD = 0x00200087,
|
||||
};
|
||||
|
||||
/** Sub command size */
|
||||
|
@ -600,6 +609,8 @@ enum _mlan_bss_mode {
|
|||
|
||||
/** Maximum key length */
|
||||
#define MLAN_MAX_KEY_LENGTH 32
|
||||
/** Maximum PMK R0 NAME key length */
|
||||
#define MLAN_MAX_PMKR0_NAME_LENGTH 16
|
||||
|
||||
/** Maximum atim window in milliseconds */
|
||||
#define MLAN_MAX_ATIM_WINDOW 50
|
||||
|
@ -632,7 +643,7 @@ typedef struct _mlan_multicast_list {
|
|||
} mlan_multicast_list, *pmlan_multicast_list;
|
||||
|
||||
/** Max channel */
|
||||
#define MLAN_MAX_CHANNEL 165
|
||||
#define MLAN_MAX_CHANNEL 177
|
||||
/** Maximum number of channels in table */
|
||||
#define MLAN_MAX_CHANNEL_NUM 128
|
||||
|
||||
|
@ -746,31 +757,14 @@ typedef struct _mlan_ssid_bssid {
|
|||
|
||||
/** Data structure of WMM ECW */
|
||||
typedef struct _wmm_ecw_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
#else
|
||||
/** Minimum Ecw */
|
||||
t_u8 ecw_min : 4;
|
||||
/** Maximum Ecw */
|
||||
t_u8 ecw_max : 4;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} wmm_ecw_t, *pwmm_ecw_t;
|
||||
|
||||
/** Data structure of WMM Aci/Aifsn */
|
||||
typedef struct _wmm_aci_aifsn_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
/** Aci */
|
||||
t_u8 aci : 2;
|
||||
/** Acm */
|
||||
t_u8 acm : 1;
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
#else
|
||||
/** Aifsn */
|
||||
t_u8 aifsn : 4;
|
||||
/** Acm */
|
||||
|
@ -779,7 +773,6 @@ typedef struct _wmm_aci_aifsn_t {
|
|||
t_u8 aci : 2;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} wmm_aci_aifsn_t, *pwmm_aci_aifsn_t;
|
||||
|
||||
/** Data structure of WMM AC parameters */
|
||||
|
@ -986,21 +979,12 @@ typedef struct _wep_param {
|
|||
|
||||
/** Data structure of WMM QoS information */
|
||||
typedef struct _wmm_qos_info_t {
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
#else
|
||||
/** Parameter set count */
|
||||
t_u8 para_set_count : 4;
|
||||
/** Reserved */
|
||||
t_u8 reserved : 3;
|
||||
/** QoS UAPSD */
|
||||
t_u8 qos_uapsd : 1;
|
||||
#endif /* BIG_ENDIAN_SUPPORT */
|
||||
} wmm_qos_info_t, *pwmm_qos_info_t;
|
||||
|
||||
/** Data structure of WMM parameter IE */
|
||||
|
@ -1086,6 +1070,10 @@ typedef struct _mlan_uap_bss_param {
|
|||
t_u8 channel;
|
||||
/** auth mode */
|
||||
t_u16 auth_mode;
|
||||
/** PWE derivation */
|
||||
t_u8 pwe_derivation;
|
||||
/** transition disable */
|
||||
t_u8 transition_disable;
|
||||
/** encryption protocol */
|
||||
t_u16 protocol;
|
||||
/** key managment type */
|
||||
|
@ -1144,6 +1132,8 @@ typedef struct _mlan_uap_scan_channels {
|
|||
scan_chan_list chan_list[MLAN_MAX_CHANNEL];
|
||||
} mlan_uap_scan_channels;
|
||||
|
||||
#define MAX_NUM_PKTS 9
|
||||
#define DEF_NUM_PKTS 3
|
||||
/** mlan_chan_switch_param */
|
||||
typedef struct _mlan_action_chan_switch {
|
||||
/** mode*/
|
||||
|
@ -1335,7 +1325,6 @@ enum _mlan_band_def {
|
|||
BAND_AAC = 64,
|
||||
BAND_GAX = 256,
|
||||
BAND_AAX = 512,
|
||||
|
||||
};
|
||||
|
||||
/** Channel bandwidth */
|
||||
|
@ -1482,6 +1471,7 @@ typedef struct _mlan_ds_snmp_mib {
|
|||
t_u8 signalext_enable;
|
||||
/** Control deauth when uap switch channel */
|
||||
t_u8 deauthctrl;
|
||||
t_u8 chan_track;
|
||||
} param;
|
||||
} mlan_ds_snmp_mib, *pmlan_ds_snmp_mib;
|
||||
|
||||
|
@ -1882,6 +1872,8 @@ typedef struct _mlan_fw_info {
|
|||
t_u8 antinfo;
|
||||
/** max AP associated sta count supported by fw */
|
||||
t_u8 max_ap_assoc_sta;
|
||||
/** FW support roaming offload */
|
||||
t_u8 fw_roaming_support;
|
||||
/** Bandwidth not support 80Mhz */
|
||||
t_u8 prohibit_80mhz;
|
||||
/** FW support beacon protection */
|
||||
|
@ -1899,100 +1891,6 @@ typedef struct _mlan_ver_ext {
|
|||
char version_str[MLAN_MAX_VER_STR_LEN];
|
||||
} mlan_ver_ext, *pmlan_ver_ext;
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Extended Capabilities Data */
|
||||
typedef struct MLAN_PACK_START _ExtCap_t {
|
||||
/** Extended Capabilities value */
|
||||
t_u8 rsvdBit87 : 1; /* bit 87 */
|
||||
t_u8 rsvdBit86 : 1; /* bit 86 */
|
||||
t_u8 rsvdBit85 : 1; /* bit 85 */
|
||||
t_u8 beacon_prot : 1; /* bit 84 */
|
||||
t_u8 rsvdBit83 : 1; /* bit 83 */
|
||||
t_u8 rsvdBit82 : 1; /* bit 82 */
|
||||
t_u8 rsvdBit81 : 1; /* bit 81 */
|
||||
t_u8 rsvdBit80 : 1; /* bit 80 */
|
||||
t_u8 rsvdBit79 : 1; /* bit 79 */
|
||||
t_u8 TWTResp : 1; /* bit 78 */
|
||||
t_u8 TWTReq : 1; /* bit 77 */
|
||||
t_u8 rsvdBit76 : 1; /* bit 76 */
|
||||
t_u8 rsvdBit75 : 1; /* bit 75 */
|
||||
t_u8 rsvdBit74 : 1; /* bit 74 */
|
||||
t_u8 rsvdBit73 : 1; /* bit 73 */
|
||||
t_u8 FILS : 1; /* bit 72 */
|
||||
t_u8 FTMI : 1; /* bit 71 */
|
||||
t_u8 FTMR : 1; /* bit 70 */
|
||||
t_u8 CAQ : 1; /* bit 69 */
|
||||
t_u8 rsvdBit68 : 1; /* bit 68 */
|
||||
t_u8 NCC : 1; /* bit 67 */
|
||||
t_u8 rsvdBit66 : 1; /* bit 66 */
|
||||
t_u8 chanSchedMgnt : 1; /* bit 65 */
|
||||
t_u8 MaxAMSDU1 : 1; /* bit 64 */
|
||||
t_u8 MaxAMSDU0 : 1; /* bit 63 */
|
||||
t_u8 OperModeNtf : 1; /* bit 62 */
|
||||
t_u8 TDLSWildBandwidth : 1; /* bit 61 */
|
||||
t_u8 rsvdBit60 : 1; /* bit 60 */
|
||||
t_u8 rsvdBit59 : 1; /* bit 59 */
|
||||
t_u8 rsvdBit58 : 1; /* bit 58 */
|
||||
t_u8 rsvdBit57 : 1; /* bit 57 */
|
||||
t_u8 rsvdBit56 : 1; /* bit 56 */
|
||||
t_u8 rsvdBit55 : 1; /* bit 55 */
|
||||
t_u8 rsvdBit54 : 1; /* bit 54 */
|
||||
t_u8 rsvdBit53 : 1; /* bit 53 */
|
||||
t_u8 rsvdBit52 : 1; /* bit 52 */
|
||||
t_u8 rsvdBit51 : 1; /* bit 51 */
|
||||
t_u8 rsvdBit50 : 1; /* bit 50 */
|
||||
t_u8 rsvdBit49 : 1; /* bit 49 */
|
||||
t_u8 rsvdBit48 : 1; /* bit 48 */
|
||||
t_u8 rsvdBit47 : 1; /* bit 47 */
|
||||
t_u8 rsvdBit46 : 1; /* bit 46 */
|
||||
t_u8 rsvdBit45 : 1; /* bit 45 */
|
||||
t_u8 rsvdBit44 : 1; /* bit 44 */
|
||||
t_u8 rsvdBit43 : 1; /* bit 43 */
|
||||
t_u8 rsvdBit42 : 1; /* bit 42 */
|
||||
t_u8 rsvdBit41 : 1; /* bit 41 */
|
||||
t_u8 rsvdBit40 : 1; /* bit 40 */
|
||||
t_u8 TDLSChlSwitchProhib : 1; /* bit 39 */
|
||||
t_u8 TDLSProhibited : 1; /* bit 38 */
|
||||
t_u8 TDLSSupport : 1; /* bit 37 */
|
||||
t_u8 MSGCF_Capa : 1; /* bit 36 */
|
||||
t_u8 Reserved35 : 1; /* bit 35 */
|
||||
t_u8 SSPN_Interface : 1; /* bit 34 */
|
||||
t_u8 EBR : 1; /* bit 33 */
|
||||
t_u8 Qos_Map : 1; /* bit 32 */
|
||||
t_u8 Interworking : 1; /* bit 31 */
|
||||
t_u8 TDLSChannelSwitching : 1; /* bit 30 */
|
||||
t_u8 TDLSPeerPSMSupport : 1; /* bit 29 */
|
||||
t_u8 TDLSPeerUAPSDSupport : 1; /* bit 28 */
|
||||
t_u8 UTC : 1; /* bit 27 */
|
||||
t_u8 DMS : 1; /* bit 26 */
|
||||
t_u8 SSID_List : 1; /* bit 25 */
|
||||
t_u8 ChannelUsage : 1; /* bit 24 */
|
||||
t_u8 TimingMeasurement : 1; /* bit 23 */
|
||||
t_u8 MultipleBSSID : 1; /* bit 22 */
|
||||
t_u8 AC_StationCount : 1; /* bit 21 */
|
||||
t_u8 QoSTrafficCap : 1; /* bit 20 */
|
||||
t_u8 BSS_Transition : 1; /* bit 19 */
|
||||
t_u8 TIM_Broadcast : 1; /* bit 18 */
|
||||
t_u8 WNM_Sleep : 1; /* bit 17 */
|
||||
t_u8 TFS : 1; /* bit 16 */
|
||||
t_u8 GeospatialLocation : 1; /* bit 15 */
|
||||
t_u8 CivicLocation : 1; /* bit 14 */
|
||||
t_u8 CollocatedIntf : 1; /* bit 13 */
|
||||
t_u8 ProxyARPService : 1; /* bit 12 */
|
||||
t_u8 FMS : 1; /* bit 11 */
|
||||
t_u8 LocationTracking : 1; /* bit 10 */
|
||||
t_u8 MulticastDiagnostics : 1; /* bit 9 */
|
||||
t_u8 Diagnostics : 1; /* bit 8 */
|
||||
t_u8 Event : 1; /* bit 7 */
|
||||
t_u8 SPSMP_Support : 1; /* bit 6 */
|
||||
t_u8 Reserved5 : 1; /* bit 5 */
|
||||
t_u8 PSMP_Capable : 1; /* bit 4 */
|
||||
t_u8 RejectUnadmFrame : 1; /* bit 3 */
|
||||
t_u8 ExtChanSwitching : 1; /* bit 2 */
|
||||
t_u8 Reserved1 : 1; /* bit 1 */
|
||||
t_u8 BSS_CoexistSupport : 1; /* bit 0 */
|
||||
} MLAN_PACK_END ExtCap_t, *pExtCap_t;
|
||||
#else
|
||||
/** Extended Capabilities Data */
|
||||
typedef struct MLAN_PACK_START _ExtCap_t {
|
||||
/** Extended Capabilities value */
|
||||
|
@ -2085,7 +1983,6 @@ typedef struct MLAN_PACK_START _ExtCap_t {
|
|||
t_u8 rsvdBit86 : 1; /* bit 86 */
|
||||
t_u8 rsvdBit87 : 1; /* bit 87 */
|
||||
} MLAN_PACK_END ExtCap_t, *pExtCap_t;
|
||||
#endif
|
||||
|
||||
/** ExtCap : TDLS prohibited */
|
||||
#define IS_EXTCAP_TDLS_PROHIBITED(ext_cap) (ext_cap.TDLSProhibited)
|
||||
|
@ -2211,6 +2108,8 @@ typedef struct _tdls_peer_info {
|
|||
t_u8 ht_cap[IEEE_MAX_IE_SIZE];
|
||||
/** VHT Capabilities IE */
|
||||
t_u8 vht_cap[IEEE_MAX_IE_SIZE];
|
||||
/** HE Capabilities IE */
|
||||
t_u8 he_cap[IEEE_MAX_IE_SIZE];
|
||||
} tdls_peer_info;
|
||||
|
||||
/** max ralist num */
|
||||
|
@ -2682,6 +2581,8 @@ typedef struct _mlan_sae_password_t {
|
|||
typedef struct _mlan_pmk_t {
|
||||
/** PMK */
|
||||
t_u8 pmk[MLAN_MAX_KEY_LENGTH];
|
||||
t_u8 pmk_r0[MLAN_MAX_KEY_LENGTH];
|
||||
t_u8 pmk_r0_name[MLAN_MAX_PMKR0_NAME_LENGTH];
|
||||
} mlan_pmk_t;
|
||||
|
||||
/** Embedded supplicant RSN type: No RSN */
|
||||
|
@ -2732,10 +2633,20 @@ typedef struct _mlan_ds_ewpa_mode {
|
|||
t_u32 act_groupcipher;
|
||||
} mlan_ds_esupp_mode, *pmlan_ds_esupp_mode;
|
||||
|
||||
/* Security SSID MAX number support by firmware*/
|
||||
#define MAX_SEC_SSID_NUM 6
|
||||
|
||||
/** Type definition of mlan_ds_sec_cfg for MLAN_IOCTL_SEC_CFG */
|
||||
typedef struct _mlan_ds_sec_cfg {
|
||||
/** Sub-command */
|
||||
t_u32 sub_command;
|
||||
/** Flag to extend some structures to support multiple values.
|
||||
** For example, mlan_ds_passphrase can only contain one value,
|
||||
** if need use mlan_ds_passphrase[N], just set this flag and
|
||||
** use mlan_ds_passphrase[] instead to avoid modify
|
||||
** more already exist code.
|
||||
*/
|
||||
t_u8 multi_passphrase;
|
||||
/** Security configuration parameter */
|
||||
union {
|
||||
/** Authentication mode for MLAN_OID_SEC_CFG_AUTH_MODE */
|
||||
|
@ -2761,6 +2672,7 @@ typedef struct _mlan_ds_sec_cfg {
|
|||
#ifdef UAP_SUPPORT
|
||||
t_u8 sta_mac[MLAN_MAC_ADDR_LENGTH];
|
||||
#endif
|
||||
mlan_ds_passphrase roam_passphrase[MAX_SEC_SSID_NUM];
|
||||
} param;
|
||||
} mlan_ds_sec_cfg, *pmlan_ds_sec_cfg;
|
||||
|
||||
|
@ -3075,6 +2987,8 @@ typedef struct _mlan_ds_hs_cfg {
|
|||
t_u8 ext_gap;
|
||||
/** GPIO wave level for extend hscfg*/
|
||||
t_u8 gpio_wave;
|
||||
/** Minimum delay between HsActive and HostWake (in msec) */
|
||||
t_u16 min_wake_holdoff;
|
||||
} mlan_ds_hs_cfg, *pmlan_ds_hs_cfg;
|
||||
|
||||
#define MAX_MGMT_FRAME_FILTER 2
|
||||
|
@ -3922,7 +3836,7 @@ typedef MLAN_PACK_START struct _mlan_ds_11ax_he_capa {
|
|||
|
||||
/** Type definition of mlan_ds_11ax_he_cfg for MLAN_OID_11AX_HE_CFG */
|
||||
typedef struct _mlan_ds_11ax_he_cfg {
|
||||
/** band, BIT0:2.4G, BIT1:5G*/
|
||||
/** band, BIT0:2.4G, BIT1:5G BIT2:6G*/
|
||||
t_u8 band;
|
||||
/** mlan_ds_11ax_he_capa */
|
||||
mlan_ds_11ax_he_capa he_cap;
|
||||
|
@ -4117,12 +4031,19 @@ typedef struct _mlan_ds_subband_set_t {
|
|||
t_u8 max_tx_pwr;
|
||||
} mlan_ds_subband_set_t;
|
||||
|
||||
#define NXP_DFS_UNSET 0
|
||||
#define NXP_DFS_FCC 1
|
||||
#define NXP_DFS_ETSI 2
|
||||
#define NXP_DFS_JP 3
|
||||
#define NXP_DFS_UNKNOWN 0xFF
|
||||
/** Domain regulatory information */
|
||||
typedef struct _mlan_ds_11d_domain_info {
|
||||
/** DFS region code */
|
||||
t_u8 dfs_region;
|
||||
/** Country Code */
|
||||
t_u8 country_code[COUNTRY_CODE_LEN];
|
||||
/** Band that channels in sub_band belong to */
|
||||
t_u8 band;
|
||||
t_u16 band;
|
||||
/** No. of subband in below */
|
||||
t_u8 no_of_sub_band;
|
||||
/** Subband data to send/last sent */
|
||||
|
@ -4166,7 +4087,14 @@ enum _mlan_reg_type {
|
|||
MLAN_REG_PSU = 6,
|
||||
MLAN_REG_BCA = 7,
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SD9097)
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097) || \
|
||||
defined(SD9177)
|
||||
MLAN_REG_CIU = 8,
|
||||
#endif
|
||||
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
|
||||
defined(PCIE9097) || defined(USB9097) || defined(SDNW62X) || \
|
||||
defined(PCIENW62X) || defined(USBNW62X) || defined(SD9097)
|
||||
MLAN_REG_MAC2 = 0x81,
|
||||
MLAN_REG_BBP2 = 0x82,
|
||||
MLAN_REG_RF2 = 0x83,
|
||||
|
@ -4261,6 +4189,16 @@ typedef struct _mlan_ds_11h_chan_rep_req {
|
|||
t_u8 host_based;
|
||||
} mlan_ds_11h_chan_rep_req;
|
||||
|
||||
/** channel dfs state for MLAN_OID_11H_CHAN_DFS_STATE */
|
||||
typedef struct _mlan_ds_11h_chan_dfs_state {
|
||||
/** channel */
|
||||
t_u8 channel;
|
||||
/** is dfs channel */
|
||||
t_u8 dfs_required;
|
||||
/** dfs state */
|
||||
dfs_state_t dfs_state;
|
||||
} mlan_ds_11h_chan_dfs_state;
|
||||
|
||||
typedef struct _mlan_ds_11h_dfs_w53_cfg {
|
||||
/** dfs w53 cfg */
|
||||
t_u8 dfs53cfg;
|
||||
|
@ -4282,6 +4220,8 @@ typedef struct _mlan_ds_11h_cfg {
|
|||
mlan_ds_11h_chan_rep_req chan_rpt_req;
|
||||
/** channel switch count for MLAN_OID_11H_CHAN_SWITCH_COUNT*/
|
||||
t_s8 cs_count;
|
||||
/** channel dfs state for MLAN_OID_11H_CHAN_DFS_STATE */
|
||||
mlan_ds_11h_chan_dfs_state ch_dfs_state;
|
||||
mlan_ds_11h_dfs_w53_cfg dfs_w53_cfg;
|
||||
} param;
|
||||
} mlan_ds_11h_cfg, *pmlan_ds_11h_cfg;
|
||||
|
@ -4370,6 +4310,26 @@ enum _mlan_func_cmd {
|
|||
MLAN_FUNC_SHUTDOWN,
|
||||
};
|
||||
|
||||
/** Net monitor filter: management frame */
|
||||
#define MLAN_NETMON_MANAGEMENT_FRAME MBIT(0)
|
||||
/** Net monitor filter: control frame */
|
||||
#define MLAN_NETMON_CONTROL_FRAME MBIT(1)
|
||||
/** Net monitor filter: data frame */
|
||||
#define MLAN_NETMON_DATA_FRAME MBIT(2)
|
||||
|
||||
typedef struct _mlan_ds_misc_net_monitor {
|
||||
/** Enable/disable network monitor */
|
||||
t_u32 enable_net_mon;
|
||||
/** Set net monitor filer flag */
|
||||
t_u32 filter_flag;
|
||||
/** Radio type */
|
||||
t_u32 band;
|
||||
/** Channel */
|
||||
t_u32 channel;
|
||||
/** Secondary channel bandwidth */
|
||||
t_u32 chan_bandwidth;
|
||||
} mlan_ds_misc_net_monitor;
|
||||
|
||||
/** Type definition of mlan_ds_misc_tx_datapause
|
||||
* for MLAN_OID_MISC_TX_DATAPAUSE
|
||||
*/
|
||||
|
@ -4780,6 +4740,166 @@ typedef struct _mlan_ds_misc_pmfcfg {
|
|||
|
||||
#define MAX_SSID_NUM 16
|
||||
#define MAX_AP_LIST 8
|
||||
#define RETRY_UNLIMITED_TIME 0xFF
|
||||
|
||||
#define FW_ROAM_ENABLE MBIT(0)
|
||||
#define FW_ROAM_TRIGGER_COND MBIT(1)
|
||||
#define FW_ROAM_BSSID MBIT(2)
|
||||
#define FW_ROAM_SSID MBIT(3)
|
||||
#define FW_ROAM_RETRY_COUNT MBIT(4)
|
||||
#define FW_ROAM_RSSI_PARA MBIT(5)
|
||||
#define FW_ROAM_BAND_RSSI MBIT(6)
|
||||
#define FW_ROAM_BGSCAN_PARAM MBIT(7)
|
||||
#define FW_ROAM_EES_PARAM MBIT(8)
|
||||
#define FW_ROAM_BCN_MISS_THRESHOLD MBIT(9)
|
||||
#define FW_ROAM_PRE_BCN_MISS_THRESHOLD MBIT(10)
|
||||
#define FW_ROAM_BLACKLIST MBIT(11)
|
||||
#define FW_ROAM_REPEAT_CNT MBIT(12)
|
||||
|
||||
/*Roam offload configuration for auto reconnection when suspend and resume*/
|
||||
typedef enum _roam_offload_config_mode {
|
||||
ROAM_OFFLOAD_ENABLE = 1,
|
||||
ROAM_OFFLOAD_SUSPEND_CFG,
|
||||
ROAM_OFFLOAD_RESUME_CFG,
|
||||
ROAM_OFFLOAD_PARAM_CFG,
|
||||
} roam_offload_config_mode;
|
||||
|
||||
typedef enum _roam_offload_set_mode {
|
||||
ROAM_OFFLOAD_DISABLE = 0,
|
||||
ROAM_OFFLOAD_WITH_APLIST,
|
||||
ROAM_OFFLOAD_WITHOUT_APLIST,
|
||||
ROAM_OFFLOAD_WITH_BSSID,
|
||||
ROAM_OFFLOAD_WITH_SSID,
|
||||
AUTO_RECONNECT,
|
||||
} roam_offload_set_mode;
|
||||
|
||||
typedef enum _roam_offload_trigger_mode {
|
||||
NO_TRIGGER = 0x00,
|
||||
RSSI_LOW_TRIGGER = 0x01,
|
||||
PRE_BEACON_LOST_TRIGGER = 0x02,
|
||||
LINK_LOST_TRIGGER = 0x04,
|
||||
DEAUTH_WITH_EXT_AP_TRIGGER = 0x08,
|
||||
} roam_offload_trigger_mode;
|
||||
|
||||
/** mlan_ds_misc_ees_cfg structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_ees_cfg {
|
||||
/* EES mode*/
|
||||
t_u16 ees_mode;
|
||||
/* EES report condition*/
|
||||
t_u16 ees_rpt_condition;
|
||||
/* High scan period(milliseconds)*/
|
||||
t_u16 high_scan_period;
|
||||
/* High scan count*/
|
||||
t_u16 high_scan_count;
|
||||
/* Middle scan period(milliseconds)*/
|
||||
t_u16 mid_scan_period;
|
||||
/* Middle scan count*/
|
||||
t_u16 mid_scan_count;
|
||||
/* Low scan period(milliseconds)*/
|
||||
t_u16 low_scan_period;
|
||||
/* Low scan count*/
|
||||
t_u16 low_scan_count;
|
||||
} MLAN_PACK_END mlan_ds_misc_ees_cfg;
|
||||
|
||||
/** mlan_ds_misc_bgscan_cfg structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_bgscan_cfg {
|
||||
/* BSS Type 0x1-bss independent, 0x2-bss infrastructure, 0x3-bss any*/
|
||||
t_u8 bss_type;
|
||||
/* Number of channels scanned for each scan*/
|
||||
t_u8 channels_per_scan;
|
||||
/* Interval between consective scans*/
|
||||
t_u32 scan_interval;
|
||||
/* Conditons to trigger report to host*/
|
||||
t_u32 bg_rpt_condition;
|
||||
} MLAN_PACK_END mlan_ds_misc_bgscan_cfg;
|
||||
|
||||
/** mlan_ds_misc_band_rssi structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_band_rssi {
|
||||
/* RSSI hysteresis*/
|
||||
t_u8 rssi_hysteresis;
|
||||
/* Preferred channel band for fw roaming
|
||||
* 0:2.4G band; 1: 5G band; 2:4G band; 0xFF:band not set(invalid)
|
||||
*/
|
||||
t_u8 band_preferred;
|
||||
} MLAN_PACK_END mlan_ds_misc_band_rssi;
|
||||
|
||||
/** mlan_ds_misc_ssid_list structure */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_ssid_list {
|
||||
/* SSID number*/
|
||||
t_u8 ssid_num;
|
||||
/* SSID for fw roaming/auto_reconnect*/
|
||||
mlan_802_11_ssid ssids[MAX_SSID_NUM];
|
||||
} MLAN_PACK_END mlan_ds_misc_ssid_list;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_roam_offload_aplist {
|
||||
/** Number of AP**/
|
||||
t_u8 ap_num;
|
||||
/** AP mac addrs**/
|
||||
t_u8 ap_mac[MAX_AP_LIST][MLAN_MAC_ADDR_LENGTH];
|
||||
} MLAN_PACK_END mlan_ds_misc_roam_offload_aplist;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_roam_offload_para_rssi {
|
||||
/** Setting flag**/
|
||||
t_u8 set_flag;
|
||||
/** Max value of RSSI threshold**/
|
||||
t_u8 max_rssi;
|
||||
/** Min value of RSSI threshold**/
|
||||
t_u8 min_rssi;
|
||||
/** Adjusting step value of RSSI threshold**/
|
||||
t_u8 step_rssi;
|
||||
} MLAN_PACK_END mlan_ds_misc_roam_offload_para_rssi;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_misc_roam_offload {
|
||||
/** Enable roam offload**/
|
||||
t_u8 enable;
|
||||
/** User set passphrase**/
|
||||
t_u8 userset_passphrase;
|
||||
/* Condition to trigger roaming
|
||||
* Bit0 : RSSI low trigger
|
||||
* Bit1 : Pre-beacon lost trigger
|
||||
* Bit2 : Link Lost trigger
|
||||
* Bit3 : Deauth by ext-AP trigger
|
||||
* Bit4 ~ Bit15 : Reserved
|
||||
* value 0 : no trigger
|
||||
* value 0xff : invalid
|
||||
*/
|
||||
t_u16 trigger_condition;
|
||||
/** AP list**/
|
||||
mlan_ds_misc_roam_offload_aplist aplist;
|
||||
/*Roam offload configuration mode for auto connection when suspend and
|
||||
* resume*/
|
||||
roam_offload_config_mode config_mode;
|
||||
/** Retry count**/
|
||||
t_u8 retry_count;
|
||||
/** RSSI para**/
|
||||
mlan_ds_misc_roam_offload_para_rssi para_rssi;
|
||||
/** BSSID of reconnection**/
|
||||
mlan_802_11_mac_addr bssid_reconnect;
|
||||
/* SSID List(White list)*/
|
||||
mlan_ds_misc_ssid_list ssid_list;
|
||||
/* Black list(BSSID list)*/
|
||||
mlan_ds_misc_roam_offload_aplist black_list;
|
||||
/* BAND and RSSI_HYSTERESIS set flag*/
|
||||
t_u8 band_rssi_flag;
|
||||
mlan_ds_misc_band_rssi band_rssi;
|
||||
|
||||
/* BGSCAN params set flag*/
|
||||
t_u8 bgscan_set_flag;
|
||||
mlan_ds_misc_bgscan_cfg bgscan_cfg;
|
||||
|
||||
/* EES mode params set flag*/
|
||||
t_u8 ees_param_set_flag;
|
||||
mlan_ds_misc_ees_cfg ees_cfg;
|
||||
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 bcn_miss_threshold;
|
||||
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 pre_bcn_miss_threshold;
|
||||
|
||||
/* Scan repeat count*/
|
||||
t_u16 repeat_count;
|
||||
} MLAN_PACK_END mlan_ds_misc_roam_offload;
|
||||
|
||||
/**Action ID for TDLS disable link*/
|
||||
#define WLAN_TDLS_DISABLE_LINK 0x00
|
||||
|
@ -4833,6 +4953,8 @@ typedef struct _mlan_ds_misc_tdls_oper {
|
|||
#define TDLS_IE_FLAGS_QOS_INFO 0x0080
|
||||
/** flag for TDLS SETUP */
|
||||
#define TDLS_IE_FLAGS_SETUP 0x0100
|
||||
#define TDLS_IE_FLAGS_HECAP 0x0200
|
||||
#define TDLS_IE_FLAGS_HEOP 0x0400
|
||||
|
||||
/** TDLS ie buffer */
|
||||
typedef struct _mlan_ds_misc_tdls_ies {
|
||||
|
@ -4854,6 +4976,10 @@ typedef struct _mlan_ds_misc_tdls_ies {
|
|||
t_u8 vht_oprat[IEEE_MAX_IE_SIZE];
|
||||
/** aid Info */
|
||||
t_u8 aid_info[IEEE_MAX_IE_SIZE];
|
||||
/** HE Capabilities IE */
|
||||
t_u8 he_cap[IEEE_MAX_IE_SIZE];
|
||||
/** HE Operation IE */
|
||||
t_u8 he_op[IEEE_MAX_IE_SIZE];
|
||||
/** supported channels */
|
||||
t_u8 supp_chan[IEEE_MAX_IE_SIZE];
|
||||
/** supported regulatory class */
|
||||
|
@ -5112,6 +5238,34 @@ typedef struct _mlan_ds_ssu_params {
|
|||
} mlan_ds_ssu_params;
|
||||
#endif
|
||||
|
||||
#define CSI_FILTER_MAX 16
|
||||
/** Structure of CSI filters */
|
||||
typedef MLAN_PACK_START struct _mlan_csi_filter_t {
|
||||
/** Source address of the packet to receive */
|
||||
t_u8 mac_addr[MLAN_MAC_ADDR_LENGTH];
|
||||
/** Pakcet type of the interested CSI */
|
||||
t_u8 pkt_type;
|
||||
/* Packet subtype of the interested CSI */
|
||||
t_u8 subtype;
|
||||
/* Other filter flags */
|
||||
t_u8 flags;
|
||||
} MLAN_PACK_END mlan_csi_filter_t;
|
||||
/** Structure of CSI parameters */
|
||||
typedef MLAN_PACK_START struct _mlan_ds_csi_params {
|
||||
/** CSI enable flag. 1: enable, 0: disable */
|
||||
t_u16 csi_enable;
|
||||
/** Header ID*/
|
||||
t_u32 head_id;
|
||||
/** Tail ID */
|
||||
t_u32 tail_id;
|
||||
/** Number of CSI filters */
|
||||
t_u8 csi_filter_cnt;
|
||||
/** Chip ID */
|
||||
t_u8 chip_id;
|
||||
/** CSI filters */
|
||||
mlan_csi_filter_t csi_filter[CSI_FILTER_MAX];
|
||||
} MLAN_PACK_END mlan_ds_csi_params;
|
||||
|
||||
typedef MLAN_PACK_START struct _mlan_ds_hal_phy_cfg_params {
|
||||
/** 11b pwr spectral density mask enable/disable */
|
||||
t_u8 dot11b_psd_mask_cfg;
|
||||
|
@ -5319,6 +5473,31 @@ typedef struct _mlan_ds_misc_cfp_tbl {
|
|||
chan_freq_power_t cfp_tbl[];
|
||||
} mlan_ds_misc_cfp_tbl;
|
||||
|
||||
/** mlan_ds_mc_aggr_cfg for MLAN_OID_MISC_MC_AGGR_CFG */
|
||||
typedef struct _mlan_ds_mc_aggr_cfg {
|
||||
/** action */
|
||||
t_u8 action;
|
||||
/* 1 enable, 0 disable
|
||||
* bit 0 MC aggregation
|
||||
* bit 1 packet expiry
|
||||
* bit 2 CTS2Self
|
||||
* bit 3 CTS2Self duration offset*/
|
||||
t_u8 enable_bitmap;
|
||||
/* 1 valid, 0 invalid
|
||||
* bit 0 MC aggregation
|
||||
* bit 1 packet expiry
|
||||
* bit 2 CTS2Self
|
||||
* bit 3 CTS2Self duration offset*/
|
||||
t_u8 mask_bitmap;
|
||||
/** CTS2Self duration offset */
|
||||
t_u16 cts2self_offset;
|
||||
} mlan_ds_mc_aggr_cfg;
|
||||
typedef struct _mlan_ds_ch_load {
|
||||
/** action */
|
||||
t_u8 action;
|
||||
t_u16 ch_load_param;
|
||||
} mlan_ds_ch_load;
|
||||
|
||||
/** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */
|
||||
typedef struct _mlan_ds_misc_cfg {
|
||||
/** Sub-command */
|
||||
|
@ -5358,6 +5537,8 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_tdls_ies tdls_ies;
|
||||
/**tdls cs off channel*/
|
||||
t_u8 tdls_cs_channel;
|
||||
/** Net monitor for MLAN_OID_MISC_NET_MONITOR */
|
||||
mlan_ds_misc_net_monitor net_mon;
|
||||
/** Tx data pause for MLAN_OID_MISC_TX_DATAPAUSE */
|
||||
mlan_ds_misc_tx_datapause tx_datapause;
|
||||
/** IP address configuration */
|
||||
|
@ -5419,6 +5600,8 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_gtk_rekey_data gtk_rekey;
|
||||
mlan_ds_bw_chan_oper bw_chan_oper;
|
||||
mlan_ds_ind_rst_cfg ind_rst_cfg;
|
||||
/** Roam offload */
|
||||
mlan_ds_misc_roam_offload roam_offload;
|
||||
t_u64 misc_tsf;
|
||||
mlan_ds_custom_reg_domain custom_reg_domain;
|
||||
mlan_ds_misc_keep_alive keep_alive;
|
||||
|
@ -5430,6 +5613,7 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
#if defined(PCIE)
|
||||
mlan_ds_ssu_params ssu_params;
|
||||
#endif
|
||||
mlan_ds_csi_params csi_params;
|
||||
/** boot sleep enable or disable */
|
||||
t_u16 boot_sleep;
|
||||
/** Mapping Policy */
|
||||
|
@ -5455,10 +5639,12 @@ typedef struct _mlan_ds_misc_cfg {
|
|||
mlan_ds_misc_dot11mc_unassoc_ftm_cfg dot11mc_unassoc_ftm_cfg;
|
||||
mlan_ds_misc_tp_state tp_state;
|
||||
mlan_ds_hal_phy_cfg_params hal_phy_cfg_params;
|
||||
mlan_ds_mc_aggr_cfg mc_aggr_cfg;
|
||||
#ifdef UAP_SUPPORT
|
||||
t_u8 wacp_mode;
|
||||
#endif
|
||||
t_u32 ips_ctrl;
|
||||
mlan_ds_ch_load ch_load;
|
||||
} param;
|
||||
} mlan_ds_misc_cfg, *pmlan_ds_misc_cfg;
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for CFG80211.
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2021 NXP
|
||||
* Copyright 2011-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -127,6 +127,9 @@ static struct ieee80211_channel cfg80211_channels_5ghz[] = {
|
|||
{.center_freq = 5785, .hw_value = 157, .max_power = 20},
|
||||
{.center_freq = 5805, .hw_value = 161, .max_power = 20},
|
||||
{.center_freq = 5825, .hw_value = 165, .max_power = 20},
|
||||
{.center_freq = 5845, .hw_value = 169, .max_power = 20},
|
||||
{.center_freq = 5865, .hw_value = 173, .max_power = 20},
|
||||
{.center_freq = 5885, .hw_value = 177, .max_power = 20},
|
||||
};
|
||||
|
||||
struct ieee80211_supported_band cfg80211_band_2ghz = {
|
||||
|
@ -145,68 +148,7 @@ struct ieee80211_supported_band cfg80211_band_5ghz = {
|
|||
.n_bitrates = ARRAY_SIZE(cfg80211_rates) - 4,
|
||||
};
|
||||
|
||||
/** Channel definitions for 2 GHz to be advertised to cfg80211 */
|
||||
static struct ieee80211_channel macl_cfg80211_channels_2ghz[] = {
|
||||
{.center_freq = 2412, .hw_value = 1, .max_power = 20},
|
||||
{.center_freq = 2417, .hw_value = 2, .max_power = 20},
|
||||
{.center_freq = 2422, .hw_value = 3, .max_power = 20},
|
||||
{.center_freq = 2427, .hw_value = 4, .max_power = 20},
|
||||
{.center_freq = 2432, .hw_value = 5, .max_power = 20},
|
||||
{.center_freq = 2437, .hw_value = 6, .max_power = 20},
|
||||
{.center_freq = 2442, .hw_value = 7, .max_power = 20},
|
||||
{.center_freq = 2447, .hw_value = 8, .max_power = 20},
|
||||
{.center_freq = 2452, .hw_value = 9, .max_power = 20},
|
||||
{.center_freq = 2457, .hw_value = 10, .max_power = 20},
|
||||
{.center_freq = 2462, .hw_value = 11, .max_power = 20},
|
||||
{.center_freq = 2467, .hw_value = 12, .max_power = 20},
|
||||
{.center_freq = 2472, .hw_value = 13, .max_power = 20},
|
||||
{.center_freq = 2484, .hw_value = 14, .max_power = 20},
|
||||
};
|
||||
|
||||
/** Channel definitions for 5 GHz to be advertised to cfg80211 */
|
||||
static struct ieee80211_channel mac1_cfg80211_channels_5ghz[] = {
|
||||
{.center_freq = 5180, .hw_value = 36, .max_power = 20},
|
||||
{.center_freq = 5200, .hw_value = 40, .max_power = 20},
|
||||
{.center_freq = 5220, .hw_value = 44, .max_power = 20},
|
||||
{.center_freq = 5240, .hw_value = 48, .max_power = 20},
|
||||
{.center_freq = 5260, .hw_value = 52, .max_power = 20},
|
||||
{.center_freq = 5280, .hw_value = 56, .max_power = 20},
|
||||
{.center_freq = 5300, .hw_value = 60, .max_power = 20},
|
||||
{.center_freq = 5320, .hw_value = 64, .max_power = 20},
|
||||
{.center_freq = 5500, .hw_value = 100, .max_power = 20},
|
||||
{.center_freq = 5520, .hw_value = 104, .max_power = 20},
|
||||
{.center_freq = 5540, .hw_value = 108, .max_power = 20},
|
||||
{.center_freq = 5560, .hw_value = 112, .max_power = 20},
|
||||
{.center_freq = 5580, .hw_value = 116, .max_power = 20},
|
||||
{.center_freq = 5600, .hw_value = 120, .max_power = 20},
|
||||
{.center_freq = 5620, .hw_value = 124, .max_power = 20},
|
||||
{.center_freq = 5640, .hw_value = 128, .max_power = 20},
|
||||
{.center_freq = 5660, .hw_value = 132, .max_power = 20},
|
||||
{.center_freq = 5680, .hw_value = 136, .max_power = 20},
|
||||
{.center_freq = 5700, .hw_value = 140, .max_power = 20},
|
||||
{.center_freq = 5720, .hw_value = 144, .max_power = 20},
|
||||
{.center_freq = 5745, .hw_value = 149, .max_power = 20},
|
||||
{.center_freq = 5765, .hw_value = 153, .max_power = 20},
|
||||
{.center_freq = 5785, .hw_value = 157, .max_power = 20},
|
||||
{.center_freq = 5805, .hw_value = 161, .max_power = 20},
|
||||
{.center_freq = 5825, .hw_value = 165, .max_power = 20},
|
||||
};
|
||||
|
||||
struct ieee80211_supported_band mac1_cfg80211_band_2ghz = {
|
||||
.channels = macl_cfg80211_channels_2ghz,
|
||||
.band = IEEE80211_BAND_2GHZ,
|
||||
.n_channels = ARRAY_SIZE(macl_cfg80211_channels_2ghz),
|
||||
.bitrates = cfg80211_rates,
|
||||
.n_bitrates = ARRAY_SIZE(cfg80211_rates),
|
||||
};
|
||||
|
||||
struct ieee80211_supported_band mac1_cfg80211_band_5ghz = {
|
||||
.channels = mac1_cfg80211_channels_5ghz,
|
||||
.band = IEEE80211_BAND_5GHZ,
|
||||
.n_channels = ARRAY_SIZE(mac1_cfg80211_channels_5ghz),
|
||||
.bitrates = cfg80211_rates + 4,
|
||||
.n_bitrates = ARRAY_SIZE(cfg80211_rates) - 4,
|
||||
};
|
||||
extern pmoal_handle m_handle[];
|
||||
|
||||
#if KERNEL_VERSION(2, 6, 29) < LINUX_VERSION_CODE
|
||||
#ifdef UAP_SUPPORT
|
||||
|
@ -1064,6 +1006,11 @@ int woal_cfg80211_change_virtual_intf(struct wiphy *wiphy,
|
|||
|
||||
ENTER();
|
||||
|
||||
if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_MONITOR) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (priv->wdev->iftype == type) {
|
||||
PRINTM(MINFO, "Already set to required type\n");
|
||||
goto done;
|
||||
|
@ -2476,7 +2423,11 @@ static void woal_cancel_chanrpt_event(moal_private *priv)
|
|||
return;
|
||||
}
|
||||
evt->priv = priv;
|
||||
#ifdef UAP_CFG80211
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
evt->type = WOAL_EVENT_CANCEL_CHANRPT;
|
||||
#endif
|
||||
#endif
|
||||
INIT_LIST_HEAD(&evt->link);
|
||||
spin_lock_irqsave(&handle->evt_lock, flags);
|
||||
list_add_tail(&evt->link, &handle->evt_queue);
|
||||
|
@ -2681,9 +2632,12 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
|
|||
case IEEE80211_STYPE_DISASSOC:
|
||||
/* Need cancel the CAC when stop hostapd during
|
||||
* CAC*/
|
||||
#ifdef UAP_CFG80211
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
if (priv->phandle->is_cac_timer_set)
|
||||
woal_cancel_chanrpt_event(priv);
|
||||
|
||||
#endif
|
||||
#endif
|
||||
if (!priv->bss_started) {
|
||||
PRINTM(MCMND,
|
||||
"Drop deauth packet before AP started\n");
|
||||
|
@ -4192,6 +4146,62 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets up the ieee80211_supported band
|
||||
* *
|
||||
* @param ht_info A pointer to ieee80211_sta_ht_cap structure
|
||||
* @param dev_cap Device capability information
|
||||
* @param mcs_set Device MCS sets
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
struct ieee80211_supported_band *woal_setup_wiphy_bands(t_u8 ieee_band)
|
||||
{
|
||||
struct ieee80211_supported_band *band = NULL;
|
||||
switch (ieee_band) {
|
||||
case IEEE80211_BAND_5GHZ:
|
||||
band = kmemdup(&cfg80211_band_5ghz,
|
||||
sizeof(struct ieee80211_supported_band),
|
||||
GFP_KERNEL);
|
||||
if (!band) {
|
||||
PRINTM(MERROR, "No memory for band\n");
|
||||
break;
|
||||
}
|
||||
band->channels =
|
||||
kmemdup(&cfg80211_channels_5ghz,
|
||||
sizeof(cfg80211_channels_5ghz), GFP_KERNEL);
|
||||
if (!band->channels) {
|
||||
PRINTM(MERROR, "No memory for band->channel\n");
|
||||
kfree(band);
|
||||
band = NULL;
|
||||
break;
|
||||
}
|
||||
band->n_channels = ARRAY_SIZE(cfg80211_channels_5ghz);
|
||||
break;
|
||||
case IEEE80211_BAND_2GHZ:
|
||||
default:
|
||||
band = kmemdup(&cfg80211_band_2ghz,
|
||||
sizeof(struct ieee80211_supported_band),
|
||||
GFP_KERNEL);
|
||||
if (!band) {
|
||||
PRINTM(MERROR, "No memory for band\n");
|
||||
break;
|
||||
}
|
||||
band->channels =
|
||||
kmemdup(&cfg80211_channels_2ghz,
|
||||
sizeof(cfg80211_channels_2ghz), GFP_KERNEL);
|
||||
if (!band->channels) {
|
||||
PRINTM(MERROR, "No memory for band->channel\n");
|
||||
kfree(band);
|
||||
band = NULL;
|
||||
break;
|
||||
}
|
||||
band->n_channels = ARRAY_SIZE(cfg80211_channels_2ghz);
|
||||
break;
|
||||
}
|
||||
return band;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Sets up the CFG802.11 specific HT capability fields
|
||||
* with default values
|
||||
|
@ -4411,12 +4421,12 @@ Bit75: 0x1 (Rx 1024-QAM Support < 242-tone RU)
|
|||
|
||||
/**
|
||||
* @brief update 11ax ie for AP mode *
|
||||
* @param band band config
|
||||
* @hecap_ie a pointer to mlan_ds_11ax_he_capa
|
||||
* @param band channel band
|
||||
* @hecap_ie a pointer to mlan_ds_11ax_he_capa
|
||||
*
|
||||
* @return 0--success, otherwise failure
|
||||
*/
|
||||
void woal_uap_update_11ax_ie(t_u8 band, mlan_ds_11ax_he_capa *hecap_ie)
|
||||
static void woal_uap_update_11ax_ie(t_u8 band, mlan_ds_11ax_he_capa *hecap_ie)
|
||||
{
|
||||
if (band == BAND_5GHZ) {
|
||||
hecap_ie->he_mac_cap[0] &= UAP_HE_MAC_CAP0_MASK;
|
||||
|
@ -4497,6 +4507,7 @@ void woal_cfg80211_setup_he_cap(moal_private *priv,
|
|||
PRINTM(MERROR, "Fail to allocate iftype data\n");
|
||||
goto done;
|
||||
}
|
||||
memset(iftype_data, 0, sizeof(struct ieee80211_sband_iftype_data));
|
||||
iftype_data->types_mask =
|
||||
MBIT(NL80211_IFTYPE_STATION) | MBIT(NL80211_IFTYPE_AP) |
|
||||
MBIT(NL80211_IFTYPE_P2P_CLIENT) | MBIT(NL80211_IFTYPE_P2P_GO);
|
||||
|
@ -4548,6 +4559,8 @@ done:
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief free iftype_data
|
||||
*
|
||||
|
@ -4556,20 +4569,24 @@ done:
|
|||
*
|
||||
* @return N/A
|
||||
*/
|
||||
void woal_cfg80211_free_iftype_data(struct wiphy *wiphy)
|
||||
void woal_cfg80211_free_bands(struct wiphy *wiphy)
|
||||
{
|
||||
enum nl80211_band band;
|
||||
|
||||
for (band = NL80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; ++band) {
|
||||
if (!wiphy->bands[band])
|
||||
continue;
|
||||
if (!wiphy->bands[band]->iftype_data)
|
||||
continue;
|
||||
kfree(wiphy->bands[band]->iftype_data);
|
||||
wiphy->bands[band]->n_iftype_data = 0;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
|
||||
if (wiphy->bands[band]->iftype_data) {
|
||||
kfree(wiphy->bands[band]->iftype_data);
|
||||
wiphy->bands[band]->n_iftype_data = 0;
|
||||
}
|
||||
#endif
|
||||
kfree(wiphy->bands[band]->channels);
|
||||
kfree(wiphy->bands[band]);
|
||||
wiphy->bands[band] = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* @brief prepare and send fake deauth packet to cfg80211 to
|
||||
|
@ -4881,6 +4898,10 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
(__force __le16)0xfffe;
|
||||
bands->vht_cap.vht_mcs.tx_mcs_map =
|
||||
(__force __le16)0xfffe;
|
||||
bands->vht_cap.vht_mcs.rx_highest =
|
||||
(__force __le16)0x186;
|
||||
bands->vht_cap.vht_mcs.tx_highest =
|
||||
(__force __le16)0x186;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
|
||||
if (bands->n_iftype_data &&
|
||||
bands->iftype_data &&
|
||||
|
@ -4911,6 +4932,10 @@ void woal_cfg80211_notify_antcfg(moal_private *priv, struct wiphy *wiphy,
|
|||
(__force __le16)0xfffa;
|
||||
bands->vht_cap.vht_mcs.tx_mcs_map =
|
||||
(__force __le16)0xfffa;
|
||||
bands->vht_cap.vht_mcs.rx_highest =
|
||||
(__force __le16)0x30c;
|
||||
bands->vht_cap.vht_mcs.tx_highest =
|
||||
(__force __le16)0x30c;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 20, 0)
|
||||
if (bands->n_iftype_data &&
|
||||
bands->iftype_data &&
|
||||
|
@ -5003,3 +5028,169 @@ done:
|
|||
return status;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Set given radar channel dfs_state to AVAILABLE
|
||||
*
|
||||
* @param wiphy A pointer to struct wiphy
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
void woal_clear_wiphy_dfs_state(struct wiphy *wiphy)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
int i;
|
||||
|
||||
ENTER();
|
||||
if (!wiphy) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
sband = wiphy->bands[NL80211_BAND_5GHZ];
|
||||
|
||||
if (!sband) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < sband->n_channels; i++) {
|
||||
if (sband->channels[i].flags & IEEE80211_CHAN_RADAR) {
|
||||
#if CFG80211_VERSION_CODE > KERNEL_VERSION(3, 8, 13)
|
||||
if (sband->channels[i].dfs_state ==
|
||||
NL80211_DFS_UNAVAILABLE) {
|
||||
sband->channels[i].dfs_state =
|
||||
NL80211_DFS_USABLE;
|
||||
sband->channels[i].dfs_state_entered = jiffies;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
LEAVE();
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set given radar channel dfs_state to AVAILABLE
|
||||
*
|
||||
* @param wiphy A pointer to struct wiphy
|
||||
* @param ch_dfs_state A pointer to struct mlan_ds_11h_chan_dfs_state
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
int woal_get_wiphy_chan_dfs_state(struct wiphy *wiphy,
|
||||
mlan_ds_11h_chan_dfs_state *ch_dfs_state)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
int i;
|
||||
int ret = -1;
|
||||
t_u8 channel = ch_dfs_state->channel;
|
||||
|
||||
ENTER();
|
||||
if (!wiphy) {
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
sband = wiphy->bands[NL80211_BAND_5GHZ];
|
||||
|
||||
if (!sband) {
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
for (i = 0; i < sband->n_channels; i++) {
|
||||
if (sband->channels[i].flags & IEEE80211_CHAN_RADAR) {
|
||||
if (sband->channels[i].hw_value == channel) {
|
||||
#if CFG80211_VERSION_CODE > KERNEL_VERSION(3, 8, 13)
|
||||
ch_dfs_state->dfs_state =
|
||||
sband->channels[i].dfs_state;
|
||||
ch_dfs_state->dfs_required = MTRUE;
|
||||
ret = 0;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set given radar channel dfs_state to AVAILABLE
|
||||
*
|
||||
* @param wiphy A pointer to struct wiphy
|
||||
* @param channel given radar channel
|
||||
* @param dfs_state dfs_state
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
static void woal_update_wiphy_chan_dfs_state(struct wiphy *wiphy, t_u8 channel,
|
||||
t_u8 dfs_state)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
int i;
|
||||
|
||||
ENTER();
|
||||
if (!wiphy) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
sband = wiphy->bands[NL80211_BAND_5GHZ];
|
||||
|
||||
if (!sband) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < sband->n_channels; i++) {
|
||||
if (sband->channels[i].flags & IEEE80211_CHAN_RADAR) {
|
||||
if (sband->channels[i].hw_value == channel) {
|
||||
#if CFG80211_VERSION_CODE > KERNEL_VERSION(3, 8, 13)
|
||||
sband->channels[i].dfs_state = dfs_state;
|
||||
sband->channels[i].dfs_state_entered = jiffies;
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#if CFG80211_VERSION_CODE > KERNEL_VERSION(3, 8, 13)
|
||||
if (i < sband->n_channels)
|
||||
PRINTM(MCMND, "ZERODFS: Set channel %d dfs_state: %d\n",
|
||||
channel, sband->channels[i].dfs_state);
|
||||
#endif
|
||||
LEAVE();
|
||||
}
|
||||
/**
|
||||
* @brief Set given radar channel dfs_state
|
||||
*
|
||||
* @param wiphy A pointer to wiphy structure
|
||||
* @param channel given radar channel
|
||||
* @param dfs_state dfs_state
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
static void woal_update_wiphy_channel_dfs_state(struct wiphy *wiphy,
|
||||
t_u8 channel, t_u8 dfs_state)
|
||||
{
|
||||
if (!wiphy) {
|
||||
LEAVE();
|
||||
return;
|
||||
}
|
||||
woal_update_wiphy_chan_dfs_state(wiphy, channel, dfs_state);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief update channel dfs state to all wiphy
|
||||
*
|
||||
* @param channel given radar channel
|
||||
* @param dfs_state dfs_state
|
||||
*
|
||||
* @return N/A
|
||||
*/
|
||||
void woal_update_channel_dfs_state(t_u8 channel, t_u8 dfs_state)
|
||||
{
|
||||
int index;
|
||||
for (index = 0; index < MAX_MLAN_ADAPTER; index++) {
|
||||
if (m_handle[index] && m_handle[index]->wiphy)
|
||||
woal_update_wiphy_channel_dfs_state(
|
||||
m_handle[index]->wiphy, channel, dfs_state);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the CFG80211 specific defines.
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2021 NXP
|
||||
* Copyright 2011-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -324,9 +324,7 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy,
|
|||
int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev);
|
||||
#endif
|
||||
|
||||
#if defined(WIFI_DIRECT_SUPPORT)
|
||||
void woal_remove_virtual_interface(moal_handle *handle);
|
||||
#endif
|
||||
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
/* Group Owner Negotiation Req */
|
||||
|
@ -490,9 +488,11 @@ mlan_status woal_chandef_create(moal_private *priv,
|
|||
#if KERNEL_VERSION(4, 20, 0) <= CFG80211_VERSION_CODE
|
||||
void woal_cfg80211_setup_he_cap(moal_private *priv,
|
||||
struct ieee80211_supported_band *band);
|
||||
void woal_cfg80211_free_iftype_data(struct wiphy *wiphy);
|
||||
#endif
|
||||
|
||||
void woal_cfg80211_free_bands(struct wiphy *wiphy);
|
||||
struct ieee80211_supported_band *woal_setup_wiphy_bands(t_u8 ieee_band);
|
||||
|
||||
void woal_clear_all_mgmt_ies(moal_private *priv, t_u8 wait_option);
|
||||
int woal_cfg80211_mgmt_frame_ie(
|
||||
moal_private *priv, const t_u8 *beacon_ies, size_t beacon_ies_len,
|
||||
|
@ -512,4 +512,8 @@ void woal_cfg80211_setup_vht_cap(moal_private *priv,
|
|||
int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
|
||||
pmlan_ds_misc_assoc_rsp assoc_rsp);
|
||||
|
||||
void woal_clear_wiphy_dfs_state(struct wiphy *wiphy);
|
||||
void woal_update_channel_dfs_state(t_u8 channel, t_u8 dfs_state);
|
||||
int woal_get_wiphy_chan_dfs_state(struct wiphy *wiphy,
|
||||
mlan_ds_11h_chan_dfs_state *ch_dfs_state);
|
||||
#endif /* _MOAL_CFG80211_H_ */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for CFG80211 vendor.
|
||||
*
|
||||
*
|
||||
* Copyright 2015-2021 NXP
|
||||
* Copyright 2015-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -56,6 +56,14 @@ static const struct nl80211_vendor_cmd_info vendor_events[] = {
|
|||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = event_rssi_monitor,
|
||||
}, /*event_id 0x1501*/
|
||||
{
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = event_set_key_mgmt_offload,
|
||||
}, /*event_id 0x10001*/
|
||||
{
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = event_fw_roam_success,
|
||||
}, /*event_id 0x10002*/
|
||||
{
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = event_cloud_keep_alive,
|
||||
|
@ -748,9 +756,11 @@ static int woal_cfg80211_subcmd_get_supp_feature_set(struct wiphy *wiphy,
|
|||
int data_len)
|
||||
{
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
struct net_device *dev = wdev->netdev;
|
||||
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
mlan_fw_info fw_info;
|
||||
|
||||
t_u32 reply_len = 0;
|
||||
int ret = 0;
|
||||
t_u32 supp_feature_set = 0;
|
||||
|
@ -3233,6 +3243,170 @@ done:
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief vendor command to key_mgmt_set_key
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success fail otherwise
|
||||
*/
|
||||
static int
|
||||
woal_cfg80211_subcmd_set_roaming_offload_key(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int data_len)
|
||||
{
|
||||
moal_private *priv;
|
||||
struct net_device *dev;
|
||||
struct sk_buff *skb = NULL;
|
||||
t_u8 *pos = (t_u8 *)data;
|
||||
int ret = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (data)
|
||||
DBG_HEXDUMP(MCMD_D, "Vendor pmk", (t_u8 *)data, data_len);
|
||||
|
||||
if (!wdev || !wdev->netdev) {
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
dev = wdev->netdev;
|
||||
priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
if (!priv || !pos) {
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (data_len > MLAN_MAX_KEY_LENGTH) {
|
||||
moal_memcpy_ext(priv->phandle, &priv->pmk.pmk_r0, pos,
|
||||
MLAN_MAX_KEY_LENGTH, MLAN_MAX_KEY_LENGTH);
|
||||
pos += MLAN_MAX_KEY_LENGTH;
|
||||
moal_memcpy_ext(priv->phandle, &priv->pmk.pmk_r0_name, pos,
|
||||
data_len - MLAN_MAX_KEY_LENGTH,
|
||||
MLAN_MAX_PMKR0_NAME_LENGTH);
|
||||
} else {
|
||||
moal_memcpy_ext(priv->phandle, &priv->pmk.pmk, data, data_len,
|
||||
MLAN_MAX_KEY_LENGTH);
|
||||
}
|
||||
priv->pmk_saved = MTRUE;
|
||||
|
||||
/** Allocate skb for cmd reply*/
|
||||
skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, data_len);
|
||||
if (!skb) {
|
||||
PRINTM(MERROR, "allocate memory fail for vendor cmd\n");
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
pos = skb_put(skb, data_len);
|
||||
moal_memcpy_ext(priv->phandle, pos, data, data_len, data_len);
|
||||
ret = cfg80211_vendor_cmd_reply(skb);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to supplicant to update AP info
|
||||
*
|
||||
* @param priv A pointer to moal_private
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success 1: fail
|
||||
*/
|
||||
int woal_roam_ap_info(moal_private *priv, t_u8 *data, int len)
|
||||
{
|
||||
struct wiphy *wiphy = priv->wdev->wiphy;
|
||||
struct sk_buff *skb = NULL;
|
||||
int ret = MLAN_STATUS_SUCCESS;
|
||||
key_info *pkey = NULL;
|
||||
apinfo *pinfo = NULL;
|
||||
apinfo *req_tlv = NULL;
|
||||
MrvlIEtypesHeader_t *tlv = NULL;
|
||||
t_u16 tlv_type = 0, tlv_len = 0, tlv_buf_left = 0;
|
||||
int event_id = 0;
|
||||
t_u8 authorized = 1;
|
||||
|
||||
ENTER();
|
||||
|
||||
event_id = woal_get_event_id(event_fw_roam_success);
|
||||
if (event_max == event_id) {
|
||||
PRINTM(MERROR, "Not find this event %d\n", event_id);
|
||||
ret = 1;
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
/**allocate skb*/
|
||||
#if KERNEL_VERSION(4, 1, 0) <= CFG80211_VERSION_CODE
|
||||
skb = cfg80211_vendor_event_alloc(wiphy, priv->wdev, len + 50,
|
||||
#else
|
||||
skb = cfg80211_vendor_event_alloc(wiphy, len + 50,
|
||||
#endif
|
||||
event_id, GFP_ATOMIC);
|
||||
|
||||
if (!skb) {
|
||||
PRINTM(MERROR, "allocate memory fail for vendor event\n");
|
||||
ret = 1;
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
nla_put(skb, MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID,
|
||||
MLAN_MAC_ADDR_LENGTH, (t_u8 *)data);
|
||||
nla_put(skb, MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED,
|
||||
sizeof(authorized), &authorized);
|
||||
tlv = (MrvlIEtypesHeader_t *)(data + MLAN_MAC_ADDR_LENGTH);
|
||||
tlv_buf_left = len - MLAN_MAC_ADDR_LENGTH;
|
||||
while (tlv_buf_left >= sizeof(MrvlIEtypesHeader_t)) {
|
||||
tlv_type = woal_le16_to_cpu(tlv->type);
|
||||
tlv_len = woal_le16_to_cpu(tlv->len);
|
||||
|
||||
if (tlv_buf_left < (tlv_len + sizeof(MrvlIEtypesHeader_t))) {
|
||||
PRINTM(MERROR,
|
||||
"Error processing firmware roam success TLVs, bytes left < TLV length\n");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (tlv_type) {
|
||||
case TLV_TYPE_APINFO:
|
||||
pinfo = (apinfo *)tlv;
|
||||
nla_put(skb, MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE,
|
||||
pinfo->header.len, pinfo->rsp_ie);
|
||||
break;
|
||||
case TLV_TYPE_ASSOC_REQ_IE:
|
||||
req_tlv = (apinfo *)tlv;
|
||||
nla_put(skb, MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE,
|
||||
req_tlv->header.len, req_tlv->rsp_ie);
|
||||
break;
|
||||
case TLV_TYPE_KEYINFO:
|
||||
pkey = (key_info *)tlv;
|
||||
nla_put(skb,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR,
|
||||
MLAN_REPLAY_CTR_LEN, pkey->key.replay_ctr);
|
||||
nla_put(skb, MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK,
|
||||
MLAN_KCK_LEN, pkey->key.kck);
|
||||
nla_put(skb, MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK,
|
||||
MLAN_KEK_LEN, pkey->key.kek);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
tlv_buf_left -= tlv_len + sizeof(MrvlIEtypesHeader_t);
|
||||
tlv = (MrvlIEtypesHeader_t *)((t_u8 *)tlv + tlv_len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
}
|
||||
|
||||
/**send event*/
|
||||
cfg80211_vendor_event(skb, GFP_ATOMIC);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to get fw roaming capability
|
||||
*
|
||||
|
@ -3305,6 +3479,11 @@ static int woal_cfg80211_subcmd_fw_roaming_enable(struct wiphy *wiphy,
|
|||
const struct nlattr *iter;
|
||||
int type, rem, err;
|
||||
t_u32 fw_roaming_enable = 0;
|
||||
#ifdef STA_CFG80211
|
||||
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
|
||||
t_u8 enable = 0;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -3335,12 +3514,7 @@ static int woal_cfg80211_subcmd_fw_roaming_enable(struct wiphy *wiphy,
|
|||
|
||||
PRINTM(MMSG, "FW roaming set enable=%d from wifi hal.\n",
|
||||
fw_roaming_enable);
|
||||
#if defined(STA_CFG80211)
|
||||
if (fw_roaming_enable)
|
||||
priv->roaming_enabled = MTRUE;
|
||||
else
|
||||
priv->roaming_enabled = MFALSE;
|
||||
#endif
|
||||
ret = woal_enable_fw_roaming(priv, fw_roaming_enable);
|
||||
/* Alloc the SKB for vendor_event */
|
||||
skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, sizeof(t_u32) + 50);
|
||||
if (unlikely(!skb)) {
|
||||
|
@ -3354,6 +3528,14 @@ static int woal_cfg80211_subcmd_fw_roaming_enable(struct wiphy *wiphy,
|
|||
if (unlikely(err))
|
||||
PRINTM(MERROR, "Vendor Command reply failed ret:%d\n", err);
|
||||
|
||||
#ifdef STA_CFG80211
|
||||
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
|
||||
if (!fw_roaming_enable)
|
||||
woal_cfg80211_vendor_event(priv, event_set_key_mgmt_offload,
|
||||
&enable, sizeof(enable));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
|
@ -3378,6 +3560,7 @@ static int woal_cfg80211_subcmd_fw_roaming_config(struct wiphy *wiphy,
|
|||
int ret = MLAN_STATUS_SUCCESS;
|
||||
const struct nlattr *iter;
|
||||
int type, rem;
|
||||
woal_roam_offload_cfg *roam_offload_cfg = NULL;
|
||||
wifi_bssid_params blacklist;
|
||||
wifi_ssid_params whitelist;
|
||||
|
||||
|
@ -3417,7 +3600,60 @@ static int woal_cfg80211_subcmd_fw_roaming_config(struct wiphy *wiphy,
|
|||
}
|
||||
}
|
||||
|
||||
if (moal_extflg_isset(priv->phandle, EXT_ROAMOFFLOAD_IN_HS)) {
|
||||
/*save blacklist and whitelist in driver*/
|
||||
priv->phandle->fw_roam_params.black_list.ap_num =
|
||||
blacklist.num_bssid;
|
||||
moal_memcpy_ext(
|
||||
priv->phandle,
|
||||
(t_u8 *)priv->phandle->fw_roam_params.black_list.ap_mac,
|
||||
(t_u8 *)blacklist.mac_addr,
|
||||
sizeof(wifi_bssid_params) - sizeof(blacklist.num_bssid),
|
||||
sizeof(mlan_ds_misc_roam_offload_aplist) -
|
||||
sizeof(priv->phandle->fw_roam_params.black_list
|
||||
.ap_num));
|
||||
priv->phandle->fw_roam_params.ssid_list.ssid_num =
|
||||
whitelist.num_ssid;
|
||||
moal_memcpy_ext(
|
||||
priv->phandle,
|
||||
(t_u8 *)priv->phandle->fw_roam_params.ssid_list.ssids,
|
||||
(t_u8 *)whitelist.whitelist_ssid,
|
||||
sizeof(wifi_ssid_params) - sizeof(whitelist.num_ssid),
|
||||
MAX_SSID_NUM * sizeof(mlan_802_11_ssid));
|
||||
} else {
|
||||
roam_offload_cfg = (woal_roam_offload_cfg *)kmalloc(
|
||||
sizeof(woal_roam_offload_cfg), GFP_KERNEL);
|
||||
if (!roam_offload_cfg) {
|
||||
PRINTM(MERROR, "kmalloc failed!\n");
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
/*download parameters directly to fw*/
|
||||
memset((char *)roam_offload_cfg, 0,
|
||||
sizeof(woal_roam_offload_cfg));
|
||||
roam_offload_cfg->black_list.ap_num = blacklist.num_bssid;
|
||||
moal_memcpy_ext(priv->phandle,
|
||||
(t_u8 *)&roam_offload_cfg->black_list.ap_mac,
|
||||
(t_u8 *)blacklist.mac_addr,
|
||||
sizeof(wifi_bssid_params) -
|
||||
sizeof(blacklist.num_bssid),
|
||||
sizeof(mlan_ds_misc_roam_offload_aplist) -
|
||||
sizeof(priv->phandle->fw_roam_params
|
||||
.black_list.ap_num));
|
||||
roam_offload_cfg->ssid_list.ssid_num = whitelist.num_ssid;
|
||||
moal_memcpy_ext(priv->phandle,
|
||||
(t_u8 *)&roam_offload_cfg->ssid_list.ssids,
|
||||
(t_u8 *)whitelist.whitelist_ssid,
|
||||
sizeof(wifi_ssid_params) -
|
||||
sizeof(whitelist.num_ssid),
|
||||
MAX_SSID_NUM * sizeof(mlan_802_11_ssid));
|
||||
woal_config_fw_roaming(priv, ROAM_OFFLOAD_PARAM_CFG,
|
||||
roam_offload_cfg);
|
||||
}
|
||||
|
||||
done:
|
||||
if (roam_offload_cfg)
|
||||
kfree(roam_offload_cfg);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
@ -3789,6 +4025,348 @@ static int woal_cfg80211_subcmd_set_dfs_offload(struct wiphy *wiphy,
|
|||
return ret;
|
||||
}
|
||||
|
||||
#define CSI_DUMP_FILE_MAX 1200000
|
||||
|
||||
/**
|
||||
* @brief vendor command to set CSI params
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
* @param csi_enable enable/disable CSI
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static int woal_cfg80211_subcmd_set_csi(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int len,
|
||||
int csi_enable)
|
||||
{
|
||||
struct net_device *dev = NULL;
|
||||
moal_private *priv = NULL;
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_misc_cfg *cfg = NULL;
|
||||
struct nlattr *tb_vendor[ATTR_CSI_MAX + 1];
|
||||
int ret = 0;
|
||||
int status = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!wdev || !wdev->netdev) {
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
dev = wdev->netdev;
|
||||
priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (req == NULL) {
|
||||
PRINTM(MERROR, "Could not allocate mlan ioctl request!\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
cfg = (mlan_ds_misc_cfg *)req->pbuf;
|
||||
cfg->sub_command = MLAN_OID_MISC_CSI;
|
||||
|
||||
priv->csi_enable = csi_enable;
|
||||
if (csi_enable == 1) {
|
||||
nla_parse(tb_vendor, ATTR_CSI_MAX, (struct nlattr *)data, len,
|
||||
NULL
|
||||
#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE
|
||||
,
|
||||
NULL
|
||||
#endif
|
||||
);
|
||||
if (!tb_vendor[ATTR_CSI_CONFIG]) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
moal_memcpy_ext(priv->phandle, &cfg->param.csi_params,
|
||||
(mlan_ds_csi_params *)nla_data(
|
||||
tb_vendor[ATTR_CSI_CONFIG]),
|
||||
sizeof(mlan_ds_csi_params),
|
||||
sizeof(mlan_ds_csi_params));
|
||||
moal_memcpy_ext(priv->phandle, &priv->csi_config,
|
||||
&cfg->param.csi_params,
|
||||
sizeof(mlan_ds_csi_params),
|
||||
sizeof(mlan_ds_csi_params));
|
||||
if (tb_vendor[ATTR_CSI_DUMP_FORMAT])
|
||||
priv->csi_dump_format =
|
||||
nla_get_u8(tb_vendor[ATTR_CSI_DUMP_FORMAT]);
|
||||
} else if (csi_enable == 0) {
|
||||
nla_parse(tb_vendor, ATTR_CSI_MAX, (struct nlattr *)data, len,
|
||||
NULL
|
||||
#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE
|
||||
,
|
||||
NULL
|
||||
#endif
|
||||
);
|
||||
if (!tb_vendor[ATTR_PEER_MAC_ADDR]) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
memset(&cfg->param.csi_params, 0, sizeof(mlan_ds_csi_params));
|
||||
moal_memcpy_ext(priv->phandle,
|
||||
cfg->param.csi_params.csi_filter[0].mac_addr,
|
||||
(t_u8 *)nla_data(tb_vendor[ATTR_PEER_MAC_ADDR]),
|
||||
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to enable CSI
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static int woal_cfg80211_subcmd_csi_enable(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int len)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
ret = woal_cfg80211_subcmd_set_csi(wiphy, wdev, data, len, 1);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to disable CSI
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static int woal_cfg80211_subcmd_csi_disable(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int len)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
ret = woal_cfg80211_subcmd_set_csi(wiphy, wdev, data, len, 0);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to get CSI dump path
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static int woal_cfg80211_subcmd_get_csi_dump_path(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int len)
|
||||
{
|
||||
int ret = 0;
|
||||
struct net_device *dev = NULL;
|
||||
moal_private *priv = NULL;
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!wdev || !wdev->netdev) {
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
dev = wdev->netdev;
|
||||
priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
|
||||
skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
|
||||
sizeof(priv->csi_dump_path));
|
||||
if (unlikely(!skb)) {
|
||||
PRINTM(MERROR, "skb alloc failed\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Push the data to the skb */
|
||||
nla_put(skb, ATTR_CSI_DUMP_PATH, sizeof(priv->csi_dump_path),
|
||||
(t_u8 *)priv->csi_dump_path);
|
||||
|
||||
ret = cfg80211_vendor_cmd_reply(skb);
|
||||
if (unlikely(ret)) {
|
||||
PRINTM(MERROR, "Vendor Command reply failed ret:%d\n", ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to get CSI config
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static int woal_cfg80211_subcmd_get_csi_config(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int len)
|
||||
{
|
||||
int ret = 0;
|
||||
struct net_device *dev = NULL;
|
||||
moal_private *priv = NULL;
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!wdev || !wdev->netdev) {
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
dev = wdev->netdev;
|
||||
priv = (moal_private *)woal_get_netdev_priv(dev);
|
||||
|
||||
skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy,
|
||||
sizeof(priv->csi_config));
|
||||
if (unlikely(!skb)) {
|
||||
PRINTM(MERROR, "skb alloc failed\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
/* Push the data to the skb */
|
||||
nla_put(skb, ATTR_CSI_CONFIG, sizeof(mlan_ds_csi_params),
|
||||
(t_u8 *)&priv->csi_config);
|
||||
|
||||
ret = cfg80211_vendor_cmd_reply(skb);
|
||||
if (unlikely(ret)) {
|
||||
PRINTM(MERROR, "Vendor Command reply failed ret:%d\n", ret);
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor command to get CSI capability
|
||||
*
|
||||
* @param wiphy A pointer to wiphy struct
|
||||
* @param wdev A pointer to wireless_dev struct
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static int woal_cfg80211_subcmd_get_csi_capa(struct wiphy *wiphy,
|
||||
struct wireless_dev *wdev,
|
||||
const void *data, int len)
|
||||
{
|
||||
ENTER();
|
||||
LEAVE();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Save CSI dump to file
|
||||
*
|
||||
* @param dir_name Directory name
|
||||
* @param file_name File name
|
||||
* @param buf Pointer to dump buffer
|
||||
* @param buf_len Length of buf
|
||||
* @param name Full path name of CSI dump
|
||||
*
|
||||
* @return 0: success -1: fail
|
||||
*/
|
||||
static mlan_status woal_save_csi_dump_to_file(char *dir_name, char *file_name,
|
||||
t_u8 *buf, int buf_len,
|
||||
t_u8 format, char *name)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
ENTER();
|
||||
|
||||
if (!dir_name || !file_name || !buf) {
|
||||
PRINTM(MERROR, "Can't save dump info to file\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief vendor event to upload csi dump
|
||||
*
|
||||
* @param priv A pointer to moal_private
|
||||
* @param data a pointer to data
|
||||
* @param len data length
|
||||
*
|
||||
* @return mlan_status
|
||||
*/
|
||||
mlan_status woal_cfg80211_event_csi_dump(moal_private *priv, t_u8 *data,
|
||||
int len)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
char path_name[20];
|
||||
char file_name[20];
|
||||
|
||||
ENTER();
|
||||
|
||||
DBG_HEXDUMP(MCMD_D, "CSI dump data", data, len);
|
||||
sprintf(path_name, "/data");
|
||||
if (priv->csi_dump_format == 1)
|
||||
sprintf(file_name, "csi_dump.bin");
|
||||
else
|
||||
sprintf(file_name, "csi_dump.txt");
|
||||
priv->csi_dump_len += len;
|
||||
if (priv->csi_dump_len > CSI_DUMP_FILE_MAX) {
|
||||
PRINTM(MERROR,
|
||||
"Reached file maximum size. Not saving CSI records.\n");
|
||||
goto done;
|
||||
}
|
||||
/* Save CSI dump to file */
|
||||
ret = woal_save_csi_dump_to_file(path_name, file_name, data, len,
|
||||
priv->csi_dump_format,
|
||||
priv->csi_dump_path);
|
||||
if (ret != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MERROR, "Failed to save CSI dump to file\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
static const struct wiphy_vendor_command vendor_commands[] = {
|
||||
{
|
||||
|
@ -3882,6 +4460,18 @@ static const struct wiphy_vendor_command vendor_commands[] = {
|
|||
#endif
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = sub_cmd_set_roaming_offload_key,
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||
WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = woal_cfg80211_subcmd_set_roaming_offload_key,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
|
@ -4140,6 +4730,66 @@ static const struct wiphy_vendor_command vendor_commands[] = {
|
|||
.doit = woal_cfg80211_subcmd_get_packet_filter_capability,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = subcmd_cfr_request,
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||
WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = woal_cfg80211_subcmd_csi_enable,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = subcmd_cfr_cancel,
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||
WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = woal_cfg80211_subcmd_csi_disable,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = subcmd_get_csi_dump_path,
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||
WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = woal_cfg80211_subcmd_get_csi_dump_path,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = subcmd_get_csi_config,
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||
WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = woal_cfg80211_subcmd_get_csi_config,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
{
|
||||
.info = {
|
||||
.vendor_id = MRVL_VENDOR_ID,
|
||||
.subcmd = subcmd_get_csi_capa,
|
||||
},
|
||||
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||
WIPHY_VENDOR_CMD_NEED_NETDEV,
|
||||
.doit = woal_cfg80211_subcmd_get_csi_capa,
|
||||
#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE
|
||||
.policy = VENDOR_CMD_RAW_DATA,
|
||||
#endif
|
||||
},
|
||||
};
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the CFG80211 vendor specific defines.
|
||||
*
|
||||
*
|
||||
* Copyright 2015-2020 NXP
|
||||
* Copyright 2015-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -25,6 +25,26 @@
|
|||
|
||||
#include "moal_main.h"
|
||||
|
||||
#define TLV_TYPE_APINFO (PROPRIETARY_TLV_BASE_ID + 249)
|
||||
#define TLV_TYPE_KEYINFO (PROPRIETARY_TLV_BASE_ID + 250)
|
||||
#define TLV_TYPE_ASSOC_REQ_IE (PROPRIETARY_TLV_BASE_ID + 292)
|
||||
|
||||
/** Key Info structure */
|
||||
typedef struct _key_info_tlv {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** kck, kek, key_replay*/
|
||||
mlan_ds_misc_gtk_rekey_data key;
|
||||
} key_info;
|
||||
|
||||
/** APinfo TLV structure */
|
||||
typedef struct _apinfo_tlv {
|
||||
/** Header */
|
||||
MrvlIEtypesHeader_t header;
|
||||
/** Assoc response buffer */
|
||||
t_u8 rsp_ie[1];
|
||||
} apinfo;
|
||||
|
||||
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
|
||||
#define RING_NAME_MAX 32
|
||||
typedef int wifi_ring_buffer_id;
|
||||
|
@ -605,6 +625,8 @@ enum vendor_event {
|
|||
event_hang = 0,
|
||||
event_fw_dump_done = 1,
|
||||
event_rssi_monitor = 0x1501,
|
||||
event_set_key_mgmt_offload = 0x10001,
|
||||
event_fw_roam_success = 0x10002,
|
||||
event_cloud_keep_alive = 0x10003,
|
||||
event_dfs_radar_detected = 0x10004,
|
||||
event_dfs_cac_started = 0x10005,
|
||||
|
@ -667,6 +689,7 @@ void woal_cfg80211_rssi_monitor_event(moal_private *priv, t_s16 rssi);
|
|||
/**vendor sub command*/
|
||||
enum vendor_sub_command {
|
||||
sub_cmd_set_drvdbg = 0,
|
||||
sub_cmd_set_roaming_offload_key = 0x0002,
|
||||
sub_cmd_start_keep_alive = 0x0003,
|
||||
sub_cmd_stop_keep_alive = 0x0004,
|
||||
sub_cmd_dfs_capability = 0x0005,
|
||||
|
@ -694,6 +717,11 @@ enum vendor_sub_command {
|
|||
sub_cmd_get_roaming_capability = 0x1700,
|
||||
sub_cmd_fw_roaming_enable = 0x1701,
|
||||
sub_cmd_fw_roaming_config = 0x1702,
|
||||
subcmd_cfr_request = 0x1900,
|
||||
subcmd_cfr_cancel,
|
||||
subcmd_get_csi_dump_path,
|
||||
subcmd_get_csi_config,
|
||||
subcmd_get_csi_capa,
|
||||
sub_cmd_max,
|
||||
};
|
||||
|
||||
|
@ -733,6 +761,25 @@ enum mkeep_alive_attributes {
|
|||
MKEEP_ALIVE_ATTRIBUTE_MAX = MKEEP_ALIVE_ATTRIBUTE_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
int woal_roam_ap_info(moal_private *priv, t_u8 *data, int len);
|
||||
|
||||
/*Attribute for wpa_supplicant*/
|
||||
enum mrvl_wlan_vendor_attr_roam_auth {
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_INVALID = 0,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_BSSID,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_REQ_IE,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_RESP_IE,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AUTHORIZED,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_KEY_REPLAY_CTR,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KCK,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_PTK_KEK,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_SUBNET_STATUS,
|
||||
/* keep last */
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST,
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_MAX =
|
||||
MRVL_WLAN_VENDOR_ATTR_ROAM_AUTH_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
/** WiFi roaming capabilities structure */
|
||||
typedef struct {
|
||||
/** max blacklist size */
|
||||
|
@ -778,5 +825,28 @@ enum mrvl_wlan_vendor_attr_fw_roaming {
|
|||
MRVL_WLAN_VENDOR_ATTR_FW_ROAMING_AFTER_LAST - 1
|
||||
};
|
||||
|
||||
enum attr_csi {
|
||||
ATTR_CSI_INVALID = 0,
|
||||
ATTR_CSI_CONFIG,
|
||||
ATTR_PEER_MAC_ADDR,
|
||||
ATTR_CSI_DUMP_PATH,
|
||||
ATTR_CSI_CAPA,
|
||||
ATTR_CSI_DUMP_FORMAT,
|
||||
ATTR_CSI_AFTER_LAST,
|
||||
ATTR_CSI_MAX = ATTR_CSI_AFTER_LAST - 1,
|
||||
};
|
||||
|
||||
/** CSI capability structure */
|
||||
typedef struct {
|
||||
/**Bit mask indicates what BW is supported */
|
||||
t_u8 bw_support;
|
||||
/** Bit mask indicates what capturing method is supported */
|
||||
t_u8 method_support;
|
||||
/** Max number of capture peers supported */
|
||||
t_u8 max_peer;
|
||||
} wifi_csi_capabilities;
|
||||
|
||||
mlan_status woal_cfg80211_event_csi_dump(moal_private *priv, t_u8 *data,
|
||||
int len);
|
||||
#endif
|
||||
#endif /* _MOAL_CFGVENDOR_H_ */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains functions for debug proc file.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -4,7 +4,7 @@
|
|||
* @brief This file contains definition for private IOCTL call.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -213,9 +213,16 @@ typedef struct _chan_stats {
|
|||
#define PRIV_CMD_MPA_CTRL "mpactrl"
|
||||
#endif
|
||||
#define PRIV_CMD_SLEEP_PARAMS "sleepparams"
|
||||
#define PRIV_CMD_NET_MON "netmon"
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
#define PRIV_CMD_MONITOR_MODE "monitormode"
|
||||
#endif
|
||||
#define PRIV_CMD_DFS_TESTING "dfstesting"
|
||||
#define PRIV_CMD_CLEAR_NOP "clear_nop"
|
||||
#define PRIV_CMD_FAKE_RADAR "fake_radar"
|
||||
#define PRIV_CMD_DFS53_CFG "dfs53cfg"
|
||||
#define PRIV_CMD_DFS_CAC "dfs_cac"
|
||||
#define PRIV_CMD_AUTODFS "autodfs"
|
||||
#define PRIV_CMD_CFP_CODE "cfpcode"
|
||||
#define PRIV_CMD_CWMODE "cwmode"
|
||||
#define PRIV_CMD_ANT_CFG "antcfg"
|
||||
|
@ -239,7 +246,8 @@ typedef struct _chan_stats {
|
|||
#endif
|
||||
#define PRIV_CMD_CFG_CLOCK_SYNC "clocksync"
|
||||
#define PRIV_CMD_CFG_GET_TSF_INFO "gettsfinfo"
|
||||
#define PRIV_CMD_TRANSITION_CHANNEL "transchan"
|
||||
#define PRIV_CMD_TARGET_CHANNEL "targetchan"
|
||||
#define PRIV_CMD_BACKUP_CHANNEL "backupchan"
|
||||
|
||||
#define PRIV_CMD_DFS_REPEATER_CFG "dfs_repeater"
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
|
@ -284,6 +292,10 @@ typedef struct _chan_stats {
|
|||
/**Private command ID to set/get independent reset*/
|
||||
#define PRIV_CMD_IND_RST_CFG "indrstcfg"
|
||||
|
||||
#define PRIV_CMD_MCAST_AGGR_GROUP "mcast_aggr_group"
|
||||
#define PRIV_CMD_MC_AGGR_CFG "mc_aggr_cfg"
|
||||
#define PRIV_CMD_CH_LOAD "getchload"
|
||||
|
||||
#define PRIV_CMD_ARB_CFG "arb"
|
||||
|
||||
/**Private command to configure static rx abort config */
|
||||
|
@ -356,6 +368,8 @@ typedef struct _ssu_params_cfg {
|
|||
} __attribute__((packed)) ssu_params_cfg;
|
||||
#endif
|
||||
|
||||
#define PRIV_CMD_CSI "csi"
|
||||
|
||||
#define PRIV_CMD_BOOTSLEEP "bootsleep"
|
||||
|
||||
/** Private command: 11AX Cfg */
|
||||
|
@ -510,6 +524,27 @@ typedef struct woal_priv_addba {
|
|||
t_u32 rx_amsdu;
|
||||
} woal_addba;
|
||||
|
||||
/** Action field value : get */
|
||||
#define ACTION_GET 0
|
||||
/** Action field value : set */
|
||||
#define ACTION_SET 1
|
||||
/** Action field value: add */
|
||||
#define ACTION_ADD 2
|
||||
/** Action field value: remove */
|
||||
#define ACTION_REMOVE 3
|
||||
#define MC_AGGR_CTRL MBIT(0)
|
||||
/* mcast_aggr_group */
|
||||
typedef struct _mcast_aggr_group {
|
||||
/** action */
|
||||
t_u32 action;
|
||||
/** mcast addr */
|
||||
t_u8 mcast_addr[ETH_ALEN];
|
||||
/** Number of multicast addresses in the list */
|
||||
t_u32 num_mcast_addr;
|
||||
/** Multicast address list */
|
||||
mlan_802_11_mac_addr mac_list[MLAN_MAX_MULTICAST_LIST_SIZE];
|
||||
} mcast_aggr_group, *pmcast_aggr_group;
|
||||
|
||||
typedef struct _txrate_setting {
|
||||
t_u16 preamble : 2; /*BIT1-BIT0:
|
||||
* For legacy 11b: preamble type
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* driver.
|
||||
*
|
||||
*
|
||||
* Copyright 2018-2021 NXP
|
||||
* Copyright 2018-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -65,6 +65,8 @@ static int host_mlme;
|
|||
#endif
|
||||
#endif
|
||||
|
||||
static int roamoffload_in_hs;
|
||||
|
||||
/** Auto deep sleep */
|
||||
static int auto_ds;
|
||||
|
||||
|
@ -135,6 +137,8 @@ static int pmqos = 1;
|
|||
static int pmqos = 0;
|
||||
#endif
|
||||
|
||||
static int chan_track = 0;
|
||||
|
||||
#if defined(STA_SUPPORT)
|
||||
/** 802.11d configuration */
|
||||
static int cfg_11d;
|
||||
|
@ -209,7 +213,9 @@ int dts_enable = 1;
|
|||
static int dfs_offload;
|
||||
#endif
|
||||
|
||||
#ifdef ANDROID_KERNEL
|
||||
int wakelock_timeout = WAKE_LOCK_TIMEOUT;
|
||||
#endif
|
||||
|
||||
#if defined(STA_SUPPORT) && defined(UAP_SUPPORT)
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
|
@ -299,6 +305,9 @@ static card_type_entry card_type_map_tbl[] = {
|
|||
#ifdef SD9177
|
||||
{CARD_TYPE_SD9177, 0, CARD_SD9177},
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
{CARD_TYPE_SDNW62X, 0, CARD_SDNW62X},
|
||||
#endif
|
||||
#ifdef PCIE8897
|
||||
{CARD_TYPE_PCIE8897, 0, CARD_PCIE8897},
|
||||
#endif
|
||||
|
@ -311,6 +320,9 @@ static card_type_entry card_type_map_tbl[] = {
|
|||
#ifdef PCIE9098
|
||||
{CARD_TYPE_PCIE9098, 0, CARD_PCIE9098},
|
||||
#endif
|
||||
#ifdef PCIENW62X
|
||||
{CARD_TYPE_PCIENW62X, 0, CARD_PCIENW62X},
|
||||
#endif
|
||||
#ifdef USB8801
|
||||
{CARD_TYPE_USB8801, 0, CARD_USB8801},
|
||||
#endif
|
||||
|
@ -330,6 +342,10 @@ static card_type_entry card_type_map_tbl[] = {
|
|||
#ifdef USB9097
|
||||
{CARD_TYPE_USB9097, 0, CARD_USB9097},
|
||||
#endif
|
||||
#ifdef USBNW62X
|
||||
{CARD_TYPE_USBNW62X, 0, CARD_USBNW62X},
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
static int dfs53cfg = DFS_W53_DEFAULT_FW;
|
||||
|
@ -970,16 +986,20 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
moal_extflg_isset(handle, EXT_LOW_PW_MODE) ?
|
||||
"on" :
|
||||
"off");
|
||||
} else if (strncmp(line, "wakelock_timeout",
|
||||
strlen("wakelock_timeout")) == 0) {
|
||||
}
|
||||
#ifdef ANDROID_KERNEL
|
||||
else if (strncmp(line, "wakelock_timeout",
|
||||
strlen("wakelock_timeout")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
params->wakelock_timeout = out_data;
|
||||
PRINTM(MMSG, "wakelock_timeout=%d\n",
|
||||
params->wakelock_timeout);
|
||||
} else if (strncmp(line, "dev_cap_mask",
|
||||
strlen("dev_cap_mask")) == 0) {
|
||||
}
|
||||
#endif
|
||||
else if (strncmp(line, "dev_cap_mask",
|
||||
strlen("dev_cap_mask")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
|
@ -1002,11 +1022,6 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
"off");
|
||||
}
|
||||
#endif
|
||||
#if defined(SD8997) || defined(PCIE8997) || defined(USB8997) || \
|
||||
defined(SD8977) || defined(SD8987) || defined(SD9098) || \
|
||||
defined(USB9098) || defined(PCIE9098) || defined(SD9097) || \
|
||||
defined(USB9097) || defined(PCIE9097) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
else if (strncmp(line, "pmic", strlen("pmic")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
|
@ -1018,9 +1033,7 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
PRINTM(MMSG, "pmic %s\n",
|
||||
moal_extflg_isset(handle, EXT_PMIC) ? "on" :
|
||||
"off");
|
||||
}
|
||||
#endif
|
||||
else if (strncmp(line, "antcfg", strlen("antcfg")) == 0) {
|
||||
} else if (strncmp(line, "antcfg", strlen("antcfg")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
|
@ -1206,6 +1219,22 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
"off");
|
||||
}
|
||||
#endif
|
||||
else if (strncmp(line, "roamoffload_in_hs",
|
||||
strlen("roamoffload_in_hs")) == 0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
if (out_data)
|
||||
moal_extflg_set(handle, EXT_ROAMOFFLOAD_IN_HS);
|
||||
else
|
||||
moal_extflg_clear(handle,
|
||||
EXT_ROAMOFFLOAD_IN_HS);
|
||||
PRINTM(MMSG, "roamoffload_in_hs %s\n",
|
||||
moal_extflg_isset(handle,
|
||||
EXT_ROAMOFFLOAD_IN_HS) ?
|
||||
"on" :
|
||||
"off");
|
||||
}
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
else if (strncmp(line, "disable_regd_by_driver",
|
||||
strlen("disable_regd_by_driver")) == 0) {
|
||||
|
@ -1303,6 +1332,17 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
|
|||
goto err;
|
||||
params->dfs53cfg = out_data;
|
||||
PRINTM(MMSG, "dfs53cfg= %d\n", params->dfs53cfg);
|
||||
} else if (strncmp(line, "chan_track", strlen("chan_track")) ==
|
||||
0) {
|
||||
if (parse_line_read_int(line, &out_data) !=
|
||||
MLAN_STATUS_SUCCESS)
|
||||
goto err;
|
||||
if (out_data)
|
||||
moal_extflg_set(handle, EXT_CHAN_TRACK);
|
||||
|
||||
PRINTM(MMSG, "chan_track= %s\n",
|
||||
moal_extflg_isset(handle, EXT_PMQOS) ? "on" :
|
||||
"off");
|
||||
}
|
||||
}
|
||||
if (end)
|
||||
|
@ -1509,9 +1549,11 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
|
|||
if (low_power_mode_enable)
|
||||
moal_extflg_set(handle, EXT_LOW_PW_MODE);
|
||||
|
||||
#ifdef ANDROID_KERNEL
|
||||
handle->params.wakelock_timeout = wakelock_timeout;
|
||||
if (params)
|
||||
handle->params.wakelock_timeout = params->wakelock_timeout;
|
||||
#endif
|
||||
handle->params.dev_cap_mask = dev_cap_mask;
|
||||
if (params)
|
||||
handle->params.dev_cap_mask = params->dev_cap_mask;
|
||||
|
@ -1519,14 +1561,8 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
|
|||
if (sdio_rx_aggr)
|
||||
moal_extflg_set(handle, EXT_SDIO_RX_AGGR);
|
||||
#endif
|
||||
#if defined(SD8997) || defined(PCIE8997) || defined(USB8997) || \
|
||||
defined(SD8977) || defined(SD8987) || defined(SD9098) || \
|
||||
defined(USB9098) || defined(PCIE9098) || defined(SD9097) || \
|
||||
defined(USB9097) || defined(PCIE9097) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
if (pmic)
|
||||
moal_extflg_set(handle, EXT_PMIC);
|
||||
#endif
|
||||
handle->params.antcfg = antcfg;
|
||||
if (params)
|
||||
handle->params.antcfg = params->antcfg;
|
||||
|
@ -1573,10 +1609,15 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
|
|||
if (pmqos)
|
||||
moal_extflg_set(handle, EXT_PMQOS);
|
||||
|
||||
if (chan_track)
|
||||
moal_extflg_set(handle, EXT_CHAN_TRACK);
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (dfs_offload)
|
||||
moal_extflg_set(handle, EXT_DFS_OFFLOAD);
|
||||
#endif
|
||||
if (roamoffload_in_hs)
|
||||
moal_extflg_set(handle, EXT_ROAMOFFLOAD_IN_HS);
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (host_mlme)
|
||||
|
@ -2035,8 +2076,15 @@ void woal_init_from_dev_tree(void)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
else if (!strncmp(prop->name, "gtk_rekey_offload",
|
||||
strlen("gtk_rekey_offload"))) {
|
||||
else if (!strncmp(prop->name, "roamoffload_in_hs",
|
||||
strlen("roamoffload_in_hs"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
roamoffload_in_hs = data;
|
||||
PRINTM(MIOCTL, "roamoffload_in_hs=%d\n",
|
||||
roamoffload_in_hs);
|
||||
}
|
||||
} else if (!strncmp(prop->name, "gtk_rekey_offload",
|
||||
strlen("gtk_rekey_offload"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
gtk_rekey_offload = data;
|
||||
PRINTM(MIOCTL, "gtk_rekey_offload=%d\n",
|
||||
|
@ -2075,6 +2123,12 @@ void woal_init_from_dev_tree(void)
|
|||
PRINTM(MIOCTL, "sched_scan=%d\n", data);
|
||||
sched_scan = data;
|
||||
}
|
||||
} else if (!strncmp(prop->name, "chan_track",
|
||||
strlen("chan_track"))) {
|
||||
if (!of_property_read_u32(dt_node, prop->name, &data)) {
|
||||
chan_track = data;
|
||||
PRINTM(MIOCTL, "chan_track=%d\n", chan_track);
|
||||
}
|
||||
}
|
||||
}
|
||||
LEAVE();
|
||||
|
@ -2293,7 +2347,8 @@ MODULE_PARM_DESC(mfg_mode,
|
|||
"0: Download normal firmware; 1: Download MFG firmware");
|
||||
#endif /* MFG_CMD_SUPPORT */
|
||||
module_param(drv_mode, int, 0660);
|
||||
MODULE_PARM_DESC(drv_mode, "Bit 0: STA; Bit 1: uAP; Bit 2: WIFIDIRECT");
|
||||
MODULE_PARM_DESC(drv_mode,
|
||||
"Bit 0: STA; Bit 1: uAP; Bit 2: WIFIDIRECT; Bit 7: ZERO_DFS");
|
||||
|
||||
#ifdef STA_SUPPORT
|
||||
module_param(max_sta_bss, int, 0);
|
||||
|
@ -2439,8 +2494,10 @@ MODULE_PARM_DESC(pcie_int_mode, "0: Legacy mode; 1: MSI mode; 2: MSI-X mode");
|
|||
module_param(low_power_mode_enable, int, 0);
|
||||
MODULE_PARM_DESC(low_power_mode_enable, "0/1: Disable/Enable Low Power Mode");
|
||||
|
||||
#ifdef ANDROID_KERNEL
|
||||
module_param(wakelock_timeout, int, 0);
|
||||
MODULE_PARM_DESC(wakelock_timeout, "set wakelock_timeout value (ms)");
|
||||
#endif
|
||||
|
||||
module_param(dev_cap_mask, uint, 0);
|
||||
MODULE_PARM_DESC(dev_cap_mask, "Device capability mask");
|
||||
|
@ -2522,6 +2579,11 @@ module_param(dfs_offload, int, 0);
|
|||
MODULE_PARM_DESC(dfs_offload, "1: enable dfs offload; 0: disable dfs offload.");
|
||||
#endif
|
||||
|
||||
module_param(roamoffload_in_hs, int, 0);
|
||||
MODULE_PARM_DESC(
|
||||
roamoffload_in_hs,
|
||||
"1: enable fw roaming only when host suspend; 0: always enable fw roaming.");
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
module_param(uap_max_sta, int, 0);
|
||||
MODULE_PARM_DESC(uap_max_sta, "Maximum station number for UAP/GO.");
|
||||
|
@ -2558,3 +2620,8 @@ MODULE_PARM_DESC(beacon_hints,
|
|||
|
||||
module_param(dfs53cfg, int, 0);
|
||||
MODULE_PARM_DESC(dfs53cfg, "0: fw default; 1: new w53 dfs; 2: old w53 dfs");
|
||||
|
||||
module_param(chan_track, int, 0);
|
||||
MODULE_PARM_DESC(
|
||||
chan_track,
|
||||
"1: Set channel tracking; 0: Restore channel tracking for 9098 only");
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains ioctl function to MLAN
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -113,11 +113,11 @@ static t_u8 eu_country_code_table[][COUNTRY_CODE_LEN] = {
|
|||
"LU", "MT", "MD", "MC", "ME", "NL", "NO", "PL", "RO", "SM", "RS", "SI",
|
||||
"SK", "ES", "SE", "CH", "TR", "UA", "UK", "GB", "NE", "NZ", "DZ", "AO",
|
||||
"AM", "AW", "BH", "BD", "BT", "BO", "BQ", "BW", "VG", "BF", "BI", "KH",
|
||||
"CL", "CN", "KM", "CG", "CD", "CW", "EG", "FO", "GF", "PF", "GE", "GI",
|
||||
"GP", "HK", "IN", "ID", "IM", "IL", "JE", "KE", "XK", "KW", "LA", "LR",
|
||||
"MW", "MV", "MQ", "MR", "YT", "MA", "MZ", "MM", "NA", "NC", "NG", "OM",
|
||||
"PS", "PT", "QA", "RW", "RE", "BL", "MF", "VC", "SA", "SC", "ZA", "SZ",
|
||||
"SY", "TZ", "TG", "TN", "AE", "VA", "EH", "YE", "ZM", "ZW"};
|
||||
"CL", "KM", "CG", "CD", "CW", "EG", "FO", "GF", "PF", "GE", "GI", "GP",
|
||||
"HK", "IN", "ID", "IM", "IL", "JE", "KE", "XK", "KW", "LA", "LR", "MW",
|
||||
"MV", "MQ", "MR", "YT", "MA", "MZ", "MM", "NA", "NC", "NG", "OM", "PS",
|
||||
"PT", "QA", "RW", "RE", "BL", "MF", "VC", "SA", "SC", "ZA", "SZ", "SY",
|
||||
"TZ", "TG", "TN", "AE", "VA", "EH", "YE", "ZM", "ZW"};
|
||||
|
||||
/********************************************************
|
||||
Global Variables
|
||||
|
@ -269,7 +269,7 @@ t_u8 woal_get_second_channel_offset(moal_private *priv, int chan)
|
|||
|
||||
/* Special Case: 20Mhz-only Channel */
|
||||
woal_get_bss_info(priv, MOAL_IOCTL_WAIT, &bss_info);
|
||||
if (chan == 165)
|
||||
if (bss_info.region_code != COUNTRY_CODE_US && chan == 165)
|
||||
return chan2Offset;
|
||||
|
||||
switch (chan) {
|
||||
|
@ -285,6 +285,8 @@ t_u8 woal_get_second_channel_offset(moal_private *priv, int chan)
|
|||
case 140:
|
||||
case 149:
|
||||
case 157:
|
||||
case 165:
|
||||
case 173:
|
||||
chan2Offset = SEC_CHAN_ABOVE;
|
||||
break;
|
||||
case 40:
|
||||
|
@ -299,6 +301,8 @@ t_u8 woal_get_second_channel_offset(moal_private *priv, int chan)
|
|||
case 144:
|
||||
case 153:
|
||||
case 161:
|
||||
case 169:
|
||||
case 177:
|
||||
chan2Offset = SEC_CHAN_BELOW;
|
||||
break;
|
||||
}
|
||||
|
@ -1926,8 +1930,11 @@ mlan_status woal_request_get_fw_info(moal_private *priv, t_u8 wait_option,
|
|||
priv->phandle->fw_hotfix_version =
|
||||
info->param.fw_info.hotfix_version;
|
||||
priv->phandle->fw_ecsa_enable = info->param.fw_info.ecsa_enable;
|
||||
priv->phandle->fw_bands = info->param.fw_info.fw_bands;
|
||||
priv->phandle->fw_getlog_enable =
|
||||
info->param.fw_info.getlog_enable;
|
||||
priv->phandle->fw_roaming_support =
|
||||
info->param.fw_info.fw_roaming_support;
|
||||
if (priv->current_addr[0] == 0xff)
|
||||
moal_memcpy_ext(priv->phandle, priv->current_addr,
|
||||
&info->param.fw_info.mac_addr,
|
||||
|
@ -2841,6 +2848,94 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static mlan_status woal_set_wake_on_mdns(moal_handle *handle, t_u8 enable)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_misc_mef_flt_cfg *mef_cfg = NULL;
|
||||
mef_entry_t *entry = NULL;
|
||||
mef_filter_t *filter = NULL;
|
||||
|
||||
ENTER();
|
||||
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (req == NULL) {
|
||||
PRINTM(MIOCTL, "IOCTL req allocated failed!\n");
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
misc = (mlan_ds_misc_cfg *)req->pbuf;
|
||||
misc->sub_command = MLAN_OID_MISC_MEF_FLT_CFG;
|
||||
req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
req->action = MLAN_ACT_SET;
|
||||
|
||||
mef_cfg = (mlan_ds_misc_mef_flt_cfg *)(&misc->param.mef_flt_cfg);
|
||||
mef_cfg->mef_act_type = MEF_ACT_WOWLAN;
|
||||
mef_cfg->criteria = MBIT(3);
|
||||
|
||||
entry = (mef_entry_t *)&mef_cfg->mef_entry;
|
||||
entry->mode = MBIT(0);
|
||||
entry->action = 3;
|
||||
|
||||
filter = (mef_filter_t *)entry->filter_item;
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_REPEAT | FILLING_OFFSET |
|
||||
FILLING_BYTE_SEQ);
|
||||
filter->type = TYPE_BYTE_EQ;
|
||||
filter->repeat = 1;
|
||||
filter->offset = 20;
|
||||
filter->num_byte_seq = 2;
|
||||
moal_memcpy_ext(handle, filter->byte_seq, "\x08\x00", 2,
|
||||
sizeof(filter->byte_seq));
|
||||
entry->rpn[1] = RPN_TYPE_AND;
|
||||
|
||||
filter++;
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_REPEAT | FILLING_OFFSET |
|
||||
FILLING_BYTE_SEQ);
|
||||
filter->type = TYPE_BYTE_EQ;
|
||||
filter->repeat = 1;
|
||||
filter->offset = 38;
|
||||
filter->num_bytes = 4;
|
||||
moal_memcpy_ext(handle, filter->byte_seq, "\xe0\x00\x00\xfb", 4,
|
||||
sizeof(filter->byte_seq));
|
||||
entry->rpn[2] = RPN_TYPE_AND;
|
||||
filter++;
|
||||
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_PATTERN | FILLING_OFFSET |
|
||||
FILLING_NUM_BYTES);
|
||||
filter->type = TYPE_BYTE_EQ + 1;
|
||||
filter->pattern = 17;
|
||||
filter->offset = 31;
|
||||
filter->num_bytes = 1;
|
||||
entry->rpn[3] = RPN_TYPE_AND;
|
||||
filter++;
|
||||
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_PATTERN | FILLING_OFFSET |
|
||||
FILLING_NUM_BYTES);
|
||||
filter->type = TYPE_BYTE_EQ + 1;
|
||||
filter->pattern = 5353;
|
||||
filter->offset = 44;
|
||||
filter->num_bytes = 2;
|
||||
filter++;
|
||||
entry->filter_num = 4;
|
||||
if (enable) {
|
||||
ret = woal_request_ioctl(woal_get_priv(handle,
|
||||
MLAN_BSS_ROLE_ANY),
|
||||
req, MOAL_NO_WAIT);
|
||||
if (ret != MLAN_STATUS_SUCCESS && ret != MLAN_STATUS_PENDING)
|
||||
PRINTM(MIOCTL, "Set Mdns wake up failed! ret=%d\n",
|
||||
ret);
|
||||
} else {
|
||||
PRINTM(MIOCTL, "Mdns wake up is disable\n");
|
||||
}
|
||||
|
||||
done:
|
||||
if (ret != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Enable IPv6 Neighbor Solicitation offload
|
||||
*
|
||||
|
@ -2879,7 +2974,6 @@ static mlan_status woal_set_ipv6_ns_offload(moal_handle *handle)
|
|||
entry = (mef_entry_t *)&mef_cfg->mef_entry;
|
||||
entry->mode = MBIT(0);
|
||||
entry->action = 0x40;
|
||||
|
||||
filter = (mef_filter_t *)entry->filter_item;
|
||||
filter->fill_flag = (FILLING_TYPE | FILLING_REPEAT | FILLING_OFFSET |
|
||||
FILLING_BYTE_SEQ);
|
||||
|
@ -2900,7 +2994,6 @@ static mlan_status woal_set_ipv6_ns_offload(moal_handle *handle)
|
|||
filter->num_byte_seq = 1;
|
||||
moal_memcpy_ext(handle, filter->byte_seq, "\x87", 1,
|
||||
sizeof(filter->byte_seq));
|
||||
|
||||
entry->filter_num = 2;
|
||||
|
||||
ret = woal_request_ioctl(woal_get_priv(handle, MLAN_BSS_ROLE_ANY), req,
|
||||
|
@ -3311,14 +3404,33 @@ mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option)
|
|||
hscfg.is_invoke_hostcmd = MTRUE;
|
||||
ret = woal_set_get_hs_params(priv, MLAN_ACT_SET, wait_option, &hscfg);
|
||||
|
||||
if (moal_extflg_isset(priv->phandle, EXT_ROAMOFFLOAD_IN_HS)) {
|
||||
/*Disable firmware roaming*/
|
||||
woal_enable_fw_roaming(priv, 0);
|
||||
}
|
||||
if (priv->phandle->fw_roam_enable == ROAM_OFFLOAD_WITH_BSSID ||
|
||||
priv->phandle->fw_roam_enable == ROAM_OFFLOAD_WITH_SSID ||
|
||||
priv->phandle->fw_roam_enable == AUTO_RECONNECT)
|
||||
woal_config_fw_roaming(priv, ROAM_OFFLOAD_RESUME_CFG, NULL);
|
||||
#ifdef STA_CFG80211
|
||||
if (priv->phandle->fw_roam_enable == AUTO_RECONNECT)
|
||||
woal_set_clear_pmk(priv, MLAN_ACT_CLEAR);
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (priv->phandle->hs_auto_arp) {
|
||||
PRINTM(MIOCTL, "Canecl Host Sleep... remove ipv6 offload\n");
|
||||
PRINTM(MIOCTL, "Cancel Host Sleep... remove ipv6 offload\n");
|
||||
/** Set ipv6 router advertisement message offload */
|
||||
woal_set_ipv6_ra_offload(priv->phandle, MFALSE);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (priv->phandle->hs_auto_arp) {
|
||||
PRINTM(MIOCTL, "Cancel Host Sleep... remove Mdns wake up\n");
|
||||
/** Set ipv6 router advertisement message offload */
|
||||
woal_set_wake_on_mdns(priv->phandle, MFALSE);
|
||||
}
|
||||
|
||||
if (priv->phandle->hs_auto_arp) {
|
||||
PRINTM(MIOCTL, "Cancel Host Sleep... remove FW auto arp\n");
|
||||
/* remove auto arp from FW */
|
||||
|
@ -3350,6 +3462,154 @@ mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/** @brief This function config fw roaming parameters
|
||||
*
|
||||
* @param priv A Pointer to the moal_private structure
|
||||
* @return MTRUE or MFALSE
|
||||
*/
|
||||
static int woal_set_fw_roaming_params(moal_private *priv)
|
||||
{
|
||||
int ret = 0;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_sec_cfg *sec = NULL;
|
||||
woal_roam_offload_cfg roam_offload_cfg;
|
||||
#ifdef STA_CFG80211
|
||||
t_u8 zero[MLAN_MAX_KEY_LENGTH] = {0};
|
||||
#endif
|
||||
|
||||
/*Enable fw roaming*/
|
||||
woal_config_fw_roaming(priv, ROAM_OFFLOAD_ENABLE, NULL);
|
||||
/*Download fw roaming parameters*/
|
||||
woal_config_fw_roaming(priv, ROAM_OFFLOAD_PARAM_CFG,
|
||||
&priv->phandle->fw_roam_params);
|
||||
|
||||
/*Download userset passphrase key and current connection's PMK*/
|
||||
#ifdef STA_CFG80211
|
||||
if (!priv->phandle->fw_roam_params.userset_passphrase) {
|
||||
woal_set_clear_pmk(priv, MLAN_ACT_SET);
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_sec_cfg));
|
||||
if (req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
req->req_id = MLAN_IOCTL_SEC_CFG;
|
||||
sec = (mlan_ds_sec_cfg *)req->pbuf;
|
||||
sec->sub_command = MLAN_OID_SEC_CFG_PASSPHRASE;
|
||||
sec->multi_passphrase = 1;
|
||||
req->action = MLAN_ACT_SET;
|
||||
|
||||
/*Copy user set passphrase*/
|
||||
moal_memcpy_ext(priv->phandle, (char *)sec->param.roam_passphrase,
|
||||
(char *)priv->phandle->ssid_passphrase,
|
||||
MAX_SEC_SSID_NUM * sizeof(mlan_ds_passphrase),
|
||||
MAX_SEC_SSID_NUM * sizeof(mlan_ds_passphrase));
|
||||
roam_offload_cfg.userset_passphrase =
|
||||
priv->phandle->fw_roam_params.userset_passphrase;
|
||||
#ifdef STA_CFG80211
|
||||
if (memcmp(priv->pmk.pmk, zero, MLAN_MAX_KEY_LENGTH)) {
|
||||
/*Download current connection PMK*/
|
||||
if (priv->pmk_saved) {
|
||||
woal_set_clear_pmk(priv, MLAN_ACT_SET);
|
||||
priv->pmk_saved = false;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/*Set userset to mlan adapter*/
|
||||
woal_config_fw_roaming(priv, ROAM_OFFLOAD_ENABLE, &roam_offload_cfg);
|
||||
|
||||
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief This function enable/disable fw roaming
|
||||
*
|
||||
* @param priv A Pointer to the moal_private structure
|
||||
* @param enable Enable/disable fw roaming
|
||||
* @return MTRUE or MFALSE
|
||||
*/
|
||||
int woal_enable_fw_roaming(moal_private *priv, int data)
|
||||
{
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_ds_misc_roam_offload *roam = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv || !priv->phandle) {
|
||||
PRINTM(MERROR, "priv or handle is null\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (ioctl_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
if (!data && !priv->phandle->fw_roam_enable) {
|
||||
PRINTM(MIOCTL, "Fw roaming already disabled\n");
|
||||
goto done;
|
||||
}
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
|
||||
misc->sub_command = MLAN_OID_MISC_ROAM_OFFLOAD;
|
||||
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
|
||||
roam = (mlan_ds_misc_roam_offload *)&misc->param.roam_offload;
|
||||
roam->aplist.ap_num = 0;
|
||||
/* SET operation */
|
||||
ioctl_req->action = MLAN_ACT_SET;
|
||||
roam->enable = data;
|
||||
roam->config_mode = ROAM_OFFLOAD_ENABLE;
|
||||
|
||||
if (moal_extflg_isset(priv->phandle, EXT_ROAMOFFLOAD_IN_HS) && data) {
|
||||
priv->phandle->fw_roam_enable = data;
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
priv->phandle->fw_roam_enable = data;
|
||||
if (!data) {
|
||||
memset((char *)&priv->phandle->fw_roam_params, 0,
|
||||
sizeof(woal_roam_offload_cfg));
|
||||
memset((char *)&priv->phandle->ssid_passphrase, 0,
|
||||
MAX_SEC_SSID_NUM * sizeof(mlan_ds_passphrase));
|
||||
}
|
||||
#ifdef STA_CFG80211
|
||||
else if (priv->media_connected && priv->pmk_saved) {
|
||||
woal_set_clear_pmk(priv, MLAN_ACT_SET);
|
||||
priv->pmk_saved = false;
|
||||
}
|
||||
#endif
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(ioctl_req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** @brief This function enables the host sleep
|
||||
*
|
||||
* @param priv A Pointer to the moal_private structure
|
||||
|
@ -3438,6 +3698,19 @@ int woal_enable_hs(moal_private *priv)
|
|||
woal_reconfig_bgscan(priv->phandle);
|
||||
#endif
|
||||
|
||||
if (moal_extflg_isset(priv->phandle, EXT_ROAMOFFLOAD_IN_HS) &&
|
||||
handle->fw_roam_enable) {
|
||||
woal_set_fw_roaming_params(priv);
|
||||
}
|
||||
if (handle->fw_roam_enable == ROAM_OFFLOAD_WITH_BSSID ||
|
||||
handle->fw_roam_enable == ROAM_OFFLOAD_WITH_SSID ||
|
||||
handle->fw_roam_enable == AUTO_RECONNECT) {
|
||||
woal_config_fw_roaming(priv, ROAM_OFFLOAD_SUSPEND_CFG, NULL);
|
||||
#ifdef STA_CFG80211
|
||||
if (priv->phandle->fw_roam_enable == AUTO_RECONNECT)
|
||||
woal_set_clear_pmk(priv, MLAN_ACT_SET);
|
||||
#endif
|
||||
}
|
||||
media_connected = woal_check_media_connected(handle);
|
||||
#if IS_ENABLED(CONFIG_IPV6)
|
||||
if (handle->hs_auto_arp && media_connected) {
|
||||
|
@ -3448,6 +3721,13 @@ int woal_enable_hs(moal_private *priv)
|
|||
woal_set_ipv6_ns_offload(handle);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (handle->hs_auto_arp) {
|
||||
PRINTM(MIOCTL, "Host Sleep enabled... set mdns wake up\n");
|
||||
/**MDNS wake up**/
|
||||
woal_set_wake_on_mdns(handle, MTRUE);
|
||||
}
|
||||
|
||||
if (handle->hs_auto_arp && media_connected) {
|
||||
PRINTM(MIOCTL, "Host Sleep enabled... set FW auto arp\n");
|
||||
/* Set auto arp response configuration to Fw */
|
||||
|
@ -5544,6 +5824,136 @@ int woal_find_essid(moal_private *priv, mlan_ssid_bssid *ssid_bssid,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief auto reconnection configure
|
||||
*
|
||||
* @param priv Pointer to moal_private structure
|
||||
* @param cfg_mode configure mode
|
||||
* @param roam_offload_cfg Pointer to woal_roam_offload_cfg structure
|
||||
*
|
||||
* @return Number of bytes written, negative for failure.
|
||||
*/
|
||||
mlan_status woal_config_fw_roaming(moal_private *priv, t_u8 cfg_mode,
|
||||
woal_roam_offload_cfg *roam_offload_cfg)
|
||||
{
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_ds_misc_roam_offload *roam = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
int ret = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv || !priv->phandle) {
|
||||
PRINTM(MERROR, "priv or handle is null\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (ioctl_req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
|
||||
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
|
||||
misc->sub_command = MLAN_OID_MISC_ROAM_OFFLOAD;
|
||||
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
|
||||
roam = (mlan_ds_misc_roam_offload *)&misc->param.roam_offload;
|
||||
roam->aplist.ap_num = 0;
|
||||
ioctl_req->action = MLAN_ACT_SET;
|
||||
roam->enable = priv->phandle->fw_roam_enable;
|
||||
roam->config_mode = cfg_mode;
|
||||
|
||||
if ((roam->config_mode == ROAM_OFFLOAD_ENABLE) && roam_offload_cfg) {
|
||||
roam->userset_passphrase = roam_offload_cfg->userset_passphrase;
|
||||
if (roam->userset_passphrase)
|
||||
roam->enable = 0;
|
||||
}
|
||||
if (roam->config_mode == ROAM_OFFLOAD_PARAM_CFG) {
|
||||
moal_memcpy_ext(priv->phandle, (t_u8 *)&roam->bssid_reconnect,
|
||||
(t_u8 *)&roam_offload_cfg->bssid,
|
||||
MLAN_MAC_ADDR_LENGTH,
|
||||
sizeof(roam->bssid_reconnect));
|
||||
if (roam_offload_cfg->ssid_list.ssid_num) {
|
||||
moal_memcpy_ext(priv->phandle, (t_u8 *)&roam->ssid_list,
|
||||
(t_u8 *)&roam_offload_cfg->ssid_list,
|
||||
sizeof(mlan_ds_misc_ssid_list),
|
||||
sizeof(mlan_ds_misc_ssid_list));
|
||||
}
|
||||
if (roam_offload_cfg->black_list.ap_num) {
|
||||
moal_memcpy_ext(
|
||||
priv->phandle, (t_u8 *)&roam->black_list,
|
||||
(t_u8 *)&roam_offload_cfg->black_list,
|
||||
sizeof(mlan_ds_misc_roam_offload_aplist),
|
||||
sizeof(mlan_ds_misc_roam_offload_aplist));
|
||||
}
|
||||
roam->trigger_condition = roam_offload_cfg->trigger_condition;
|
||||
roam->retry_count = roam_offload_cfg->retry_count;
|
||||
if (roam_offload_cfg->rssi_param_set_flag) {
|
||||
roam->para_rssi.set_flag = 1;
|
||||
roam->para_rssi.max_rssi = roam_offload_cfg->max_rssi;
|
||||
roam->para_rssi.min_rssi = roam_offload_cfg->min_rssi;
|
||||
roam->para_rssi.step_rssi = roam_offload_cfg->step_rssi;
|
||||
}
|
||||
if (roam_offload_cfg->band_rssi_flag) {
|
||||
roam->band_rssi_flag = roam_offload_cfg->band_rssi_flag;
|
||||
moal_memcpy_ext(priv->phandle, (t_u8 *)&roam->band_rssi,
|
||||
(t_u8 *)&roam_offload_cfg->band_rssi,
|
||||
sizeof(mlan_ds_misc_band_rssi),
|
||||
sizeof(mlan_ds_misc_band_rssi));
|
||||
}
|
||||
if (roam_offload_cfg->bgscan_set_flag) {
|
||||
roam->bgscan_set_flag =
|
||||
roam_offload_cfg->bgscan_set_flag;
|
||||
moal_memcpy_ext(priv->phandle,
|
||||
(t_u8 *)&roam->bgscan_cfg,
|
||||
(t_u8 *)&roam_offload_cfg->bgscan_cfg,
|
||||
sizeof(mlan_ds_misc_bgscan_cfg),
|
||||
sizeof(mlan_ds_misc_bgscan_cfg));
|
||||
}
|
||||
if (roam_offload_cfg->ees_param_set_flag) {
|
||||
roam->ees_param_set_flag =
|
||||
roam_offload_cfg->ees_param_set_flag;
|
||||
moal_memcpy_ext(priv->phandle, (t_u8 *)&roam->ees_cfg,
|
||||
(t_u8 *)&roam_offload_cfg->ees_cfg,
|
||||
sizeof(mlan_ds_misc_ees_cfg),
|
||||
sizeof(mlan_ds_misc_ees_cfg));
|
||||
}
|
||||
roam->bcn_miss_threshold = roam_offload_cfg->bcn_miss_threshold;
|
||||
roam->pre_bcn_miss_threshold =
|
||||
roam_offload_cfg->pre_bcn_miss_threshold;
|
||||
roam->repeat_count = roam_offload_cfg->repeat_count;
|
||||
}
|
||||
if (roam->config_mode == ROAM_OFFLOAD_SUSPEND_CFG) {
|
||||
moal_memcpy_ext(priv->phandle, roam->bssid_reconnect,
|
||||
priv->phandle->auto_reconnect_bssid,
|
||||
MLAN_MAC_ADDR_LENGTH,
|
||||
sizeof(roam->bssid_reconnect));
|
||||
roam->ssid_list.ssid_num = 1;
|
||||
moal_memcpy_ext(
|
||||
priv->phandle, (t_u8 *)&roam->ssid_list.ssids[0].ssid,
|
||||
(t_u8 *)&priv->phandle->auto_reconnect_ssid.ssid,
|
||||
priv->phandle->auto_reconnect_ssid.ssid_len,
|
||||
MLAN_MAX_SSID_LENGTH);
|
||||
roam->retry_count = priv->phandle->auto_reconnect_retry_count;
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(ioctl_req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Request user scan
|
||||
*
|
||||
|
@ -6114,7 +6524,7 @@ done:
|
|||
int woal_set_combo_scan(moal_private *priv, char *buf, int length)
|
||||
{
|
||||
int ret = 0;
|
||||
wlan_user_scan_cfg scan_cfg;
|
||||
wlan_user_scan_cfg *scan_cfg;
|
||||
t_u8 *ptr = buf + WEXT_CSCAN_HEADER_SIZE;
|
||||
int buf_left = length - WEXT_CSCAN_HEADER_SIZE;
|
||||
int num_ssid = 0;
|
||||
|
@ -6125,7 +6535,16 @@ int woal_set_combo_scan(moal_private *priv, char *buf, int length)
|
|||
t_u16 specific_scan_time = 0;
|
||||
|
||||
ENTER();
|
||||
memset(&scan_cfg, 0, sizeof(scan_cfg));
|
||||
|
||||
scan_cfg = (wlan_user_scan_cfg *)kmalloc(sizeof(wlan_user_scan_cfg),
|
||||
GFP_KERNEL);
|
||||
if (!scan_cfg) {
|
||||
PRINTM(MERROR, "Malloc buffer failed\n");
|
||||
LEAVE();
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(scan_cfg, 0, sizeof(wlan_user_scan_cfg));
|
||||
while (buf_left >= 2) {
|
||||
switch (*ptr) {
|
||||
case WEXT_CSCAN_SSID_SECTION:
|
||||
|
@ -6140,11 +6559,11 @@ int woal_set_combo_scan(moal_private *priv, char *buf, int length)
|
|||
}
|
||||
if (ssid_len &&
|
||||
(num_ssid < (MRVDRV_MAX_SSID_LIST_LENGTH - 1))) {
|
||||
strncpy(scan_cfg.ssid_list[num_ssid].ssid,
|
||||
strncpy(scan_cfg->ssid_list[num_ssid].ssid,
|
||||
ptr + 2, ssid_len);
|
||||
scan_cfg.ssid_list[num_ssid].max_len = 0;
|
||||
scan_cfg->ssid_list[num_ssid].max_len = 0;
|
||||
PRINTM(MIOCTL, "Combo scan: ssid=%s\n",
|
||||
scan_cfg.ssid_list[num_ssid].ssid);
|
||||
scan_cfg->ssid_list[num_ssid].ssid);
|
||||
num_ssid++;
|
||||
}
|
||||
buf_left -= ssid_len + 2;
|
||||
|
@ -6161,9 +6580,9 @@ int woal_set_combo_scan(moal_private *priv, char *buf, int length)
|
|||
break;
|
||||
}
|
||||
for (i = 0; i < num_chan; i++) {
|
||||
scan_cfg.chan_list[i].chan_number = ptr[2 + i];
|
||||
scan_cfg->chan_list[i].chan_number = ptr[2 + i];
|
||||
PRINTM(MIOCTL, "Combo scan: chan=%d\n",
|
||||
scan_cfg.chan_list[i].chan_number);
|
||||
scan_cfg->chan_list[i].chan_number);
|
||||
}
|
||||
buf_left -= 2 + num_chan;
|
||||
ptr += 2 + num_chan;
|
||||
|
@ -6211,11 +6630,11 @@ int woal_set_combo_scan(moal_private *priv, char *buf, int length)
|
|||
if (num_ssid || num_chan) {
|
||||
if (num_ssid) {
|
||||
/* Add broadcast scan to ssid_list */
|
||||
scan_cfg.ssid_list[num_ssid].max_len = 0xff;
|
||||
scan_cfg->ssid_list[num_ssid].max_len = 0xff;
|
||||
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
|
||||
woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE);
|
||||
}
|
||||
if (MLAN_STATUS_FAILURE == woal_do_scan(priv, &scan_cfg))
|
||||
if (MLAN_STATUS_FAILURE == woal_do_scan(priv, scan_cfg))
|
||||
ret = -EFAULT;
|
||||
if (num_ssid && (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE))
|
||||
woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE);
|
||||
|
@ -6225,6 +6644,7 @@ int woal_set_combo_scan(moal_private *priv, char *buf, int length)
|
|||
ret = -EFAULT;
|
||||
}
|
||||
done:
|
||||
kfree(scan_cfg);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
@ -6854,6 +7274,65 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
/**
|
||||
* @brief Set/Get network monitor configurations
|
||||
*
|
||||
* @param priv Pointer to moal_private structure
|
||||
* @param wait_option wait option
|
||||
* @param enable Enable/Disable
|
||||
* @param filter Filter flag - Management/Control/Data
|
||||
* @param band_chan_cfg Network monitor band channel config
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS -- success, otherwise fail
|
||||
*/
|
||||
mlan_status woal_set_net_monitor(moal_private *priv, t_u8 wait_option,
|
||||
t_u8 enable, t_u8 filter,
|
||||
netmon_band_chan_cfg *band_chan_cfg)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_ds_misc_net_monitor *net_mon = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (req == NULL) {
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
misc = (mlan_ds_misc_cfg *)req->pbuf;
|
||||
net_mon = (mlan_ds_misc_net_monitor *)&misc->param.net_mon;
|
||||
misc->sub_command = MLAN_OID_MISC_NET_MONITOR;
|
||||
req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
req->action = MLAN_ACT_SET;
|
||||
net_mon->enable_net_mon = enable;
|
||||
if (net_mon->enable_net_mon) {
|
||||
net_mon->filter_flag = filter;
|
||||
if (net_mon->enable_net_mon == CHANNEL_SPEC_SNIFFER_MODE) {
|
||||
net_mon->band = band_chan_cfg->band;
|
||||
net_mon->channel = band_chan_cfg->channel;
|
||||
net_mon->chan_bandwidth = band_chan_cfg->chan_bandwidth;
|
||||
}
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, req, wait_option);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = MLAN_STATUS_FAILURE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Send delelte all BA command to MLAN
|
||||
*
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains wlan driver specific defines etc.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -104,12 +104,16 @@ Change log:
|
|||
|
||||
#include <linux/firmware.h>
|
||||
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
#include <linux/pm_wakeup.h>
|
||||
#include <linux/device.h>
|
||||
#else
|
||||
#include <linux/wakelock.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <net/ieee80211_radiotap.h>
|
||||
|
||||
#include "mlan.h"
|
||||
#include "moal_shim.h"
|
||||
|
@ -217,6 +221,7 @@ Change log:
|
|||
#define default_nan_name "nan%d"
|
||||
#define default_mpl_name "mpl%d"
|
||||
#define default_11p_name "ocb%d"
|
||||
#define default_dfs_name "dfs%d"
|
||||
#define mwiphy_name "mwiphy%d"
|
||||
|
||||
/** country txpower mode */
|
||||
|
@ -315,6 +320,8 @@ typedef enum _MOAL_HARDWARE_STATUS {
|
|||
|
||||
/** fw cap info 11p */
|
||||
#define FW_CAPINFO_80211P MBIT(24)
|
||||
/** fw cap info bit26 for 0-DFS support */
|
||||
#define FW_CAPINFO_ZERO_DFS MBIT(31)
|
||||
/** fw cap info disable nan */
|
||||
#define FW_CAPINFO_DISABLE_NAN MBIT(29)
|
||||
/** fw cap info BGA */
|
||||
|
@ -704,10 +711,12 @@ out:
|
|||
/* IOCTL Timeout */
|
||||
#define MOAL_IOCTL_TIMEOUT (20 * HZ)
|
||||
|
||||
#ifdef ANDROID_KERNEL
|
||||
/** Wake lock timeout in msec */
|
||||
#define WAKE_LOCK_TIMEOUT 3000
|
||||
/** Roaming Wake lock timeout in msec */
|
||||
#define ROAMING_WAKE_LOCK_TIMEOUT 10000
|
||||
#endif
|
||||
|
||||
/** Threshold value of number of times the Tx timeout happened */
|
||||
/* WAR For EDMAC Test */
|
||||
|
@ -796,6 +805,15 @@ typedef enum {
|
|||
RESERVED // Others: reserved
|
||||
} HSWakeupReason_t;
|
||||
|
||||
/** Custom event : Radar Detected */
|
||||
#define CUS_EVT_RADAR_DETECTED "EVENT=RADAR_DETECTED"
|
||||
/** Custom event : CAC finished */
|
||||
#define CUS_EVT_CAC_FINISHED "EVENT=CAC_FINISHED"
|
||||
void woal_move_to_next_channel(moal_private *priv);
|
||||
void woal_chan_event(moal_private *priv, t_u8 type, t_u8 channel, t_u8 radar);
|
||||
void woal_process_chan_event(moal_private *priv, t_u8 type, t_u8 channel,
|
||||
t_u8 radar);
|
||||
|
||||
/** Custom event : WEP ICV error */
|
||||
#define CUS_EVT_WEP_ICV_ERR "EVENT=WEP_ICV_ERR"
|
||||
|
||||
|
@ -815,6 +833,8 @@ typedef enum {
|
|||
#endif
|
||||
#define FW_DEBUG_INFO "EVENT=FW_DEBUG_INFO"
|
||||
|
||||
#define CUS_EVT_CSI "EVENT=MLAN_CSI"
|
||||
|
||||
/** 10 seconds */
|
||||
#define MOAL_TIMER_10S 10000
|
||||
/** 5 seconds */
|
||||
|
@ -960,6 +980,13 @@ typedef struct _wait_queue {
|
|||
#endif
|
||||
#endif /* WIFI_DIRECT_SUPPORT */
|
||||
|
||||
/**Driver mode 0DFS bit**/
|
||||
#define DRV_MODE_DFS MBIT(7)
|
||||
/**Maxinmum DFS BSS**/
|
||||
#define MAX_DFS_BSS 1
|
||||
/**Default DFS BSS**/
|
||||
#define DEF_DFS_BSS 1
|
||||
|
||||
#define DRV_MODE_WLAN (MBIT(0) | MBIT(1) | MBIT(2) | MBIT(3) | MBIT(4))
|
||||
|
||||
/**
|
||||
|
@ -1046,6 +1073,8 @@ struct tcp_sess {
|
|||
moal_drv_timer ack_timer __ATTRIB_ALIGN__;
|
||||
/** timer is set */
|
||||
BOOLEAN is_timer_set;
|
||||
/** last update time*/
|
||||
wifi_timeval update_time;
|
||||
};
|
||||
|
||||
struct tx_status_info {
|
||||
|
@ -1071,6 +1100,8 @@ enum woal_event_type {
|
|||
WOAL_EVENT_ASSOC_RESP,
|
||||
#endif
|
||||
#endif
|
||||
WOAL_EVENT_CHAN_RPT,
|
||||
WOAL_EVENT_RADAR,
|
||||
#ifdef UAP_CFG80211
|
||||
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
|
||||
WOAL_EVENT_CANCEL_CHANRPT,
|
||||
|
@ -1078,6 +1109,14 @@ enum woal_event_type {
|
|||
#endif
|
||||
};
|
||||
|
||||
/** chan_rpt_info */
|
||||
typedef struct _chan_radar_info {
|
||||
/** channel */
|
||||
t_u8 channel;
|
||||
/** radar */
|
||||
t_u8 radar;
|
||||
} chan_radar_info;
|
||||
|
||||
typedef struct _woal_evt_buf {
|
||||
/** Event len */
|
||||
t_u16 event_len;
|
||||
|
@ -1098,6 +1137,7 @@ struct woal_event {
|
|||
woal_evt_buf evt;
|
||||
mlan_ds_assoc_info assoc_info;
|
||||
int reason_code;
|
||||
chan_radar_info radar_info;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -1184,6 +1224,13 @@ struct tdls_peer {
|
|||
t_u8 num_failure;
|
||||
};
|
||||
|
||||
/** mcast node */
|
||||
struct mcast_node {
|
||||
struct list_head link;
|
||||
/** mcast address information */
|
||||
t_u8 mcast_addr[ETH_ALEN];
|
||||
};
|
||||
|
||||
struct rf_test_mode_data {
|
||||
/* tx antenna num */
|
||||
t_u32 tx_antenna;
|
||||
|
@ -1256,6 +1303,30 @@ enum ring_id {
|
|||
RING_ID_MAX,
|
||||
};
|
||||
|
||||
#define AUTO_DFS_ENABLE 0x1
|
||||
#define AUTO_DFS_DISABLE 0x0
|
||||
#define MAX_DFS_CHAN_LIST 16
|
||||
|
||||
/** Auto Zero DFS config structure */
|
||||
typedef struct _auto_zero_dfs_cfg {
|
||||
/** 1: start 0: stop */
|
||||
t_u8 start_auto_zero_dfs;
|
||||
/** start channel for ZeroDFS */
|
||||
t_u8 cac_start_chan;
|
||||
/** cac timer */
|
||||
t_u32 cac_timer;
|
||||
/** bw: 0: 20MHz 1: 40Mz above 3: 40MHz below 4: Bandwidth 80MHz */
|
||||
t_u8 bw;
|
||||
/** enable uap chan switch after first CAC finished*/
|
||||
t_u8 uap_chan_switch;
|
||||
/** enable auto zero dfs */
|
||||
t_u8 multi_chan_dfs;
|
||||
/** num of chan */
|
||||
t_u8 num_of_chan;
|
||||
/** dfs channel list */
|
||||
t_u8 dfs_chan_list[MAX_DFS_CHAN_LIST];
|
||||
} __ATTRIB_PACK__ auto_zero_dfs_cfg;
|
||||
|
||||
/** Private structure for MOAL */
|
||||
struct _moal_private {
|
||||
/** Handle structure */
|
||||
|
@ -1291,8 +1362,10 @@ struct _moal_private {
|
|||
BOOLEAN bss_started;
|
||||
/** host based uap flag */
|
||||
BOOLEAN uap_host_based;
|
||||
/** transition channel */
|
||||
t_u8 trans_chan;
|
||||
/** target channel */
|
||||
t_u8 target_chan;
|
||||
/** backup channel */
|
||||
t_u8 backup_chan;
|
||||
/** uAP skip CAC*/
|
||||
BOOLEAN skip_cac;
|
||||
/** tx block flag */
|
||||
|
@ -1301,6 +1374,14 @@ struct _moal_private {
|
|||
t_u32 user_cac_period_msec;
|
||||
/** channel under nop */
|
||||
BOOLEAN chan_under_nop;
|
||||
/** chan_rpt_req on Zero DFS interface */
|
||||
mlan_ds_11h_chan_rep_req chan_rpt_req;
|
||||
/** chan_rpt pending */
|
||||
t_u8 chan_rpt_pending;
|
||||
/** auto dfs cfg */
|
||||
auto_zero_dfs_cfg auto_dfs_cfg;
|
||||
/** index of cac */
|
||||
int curr_cac_idx;
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
/** current working channel */
|
||||
|
@ -1396,6 +1477,10 @@ struct _moal_private {
|
|||
/** cipher */
|
||||
t_u32 cipher;
|
||||
#endif
|
||||
/** pmk saved flag */
|
||||
t_u8 pmk_saved;
|
||||
/** pmk */
|
||||
mlan_pmk_t pmk;
|
||||
/** beacon ie index */
|
||||
t_u16 beacon_index;
|
||||
/** proberesp ie index */
|
||||
|
@ -1544,6 +1629,14 @@ struct _moal_private {
|
|||
t_u8 tcp_ack_max_hold;
|
||||
/** TCP session spin lock */
|
||||
spinlock_t tcp_sess_lock;
|
||||
/** mcast spin lock */
|
||||
spinlock_t mcast_lock;
|
||||
/** mcast list */
|
||||
struct list_head mcast_list;
|
||||
/** num_mcast_addr */
|
||||
t_u32 num_mcast_addr;
|
||||
/** enable mc_aggr */
|
||||
t_u8 enable_mc_aggr;
|
||||
/** tcp list */
|
||||
struct list_head tdls_list;
|
||||
/** tdls spin lock */
|
||||
|
@ -1572,6 +1665,17 @@ struct _moal_private {
|
|||
mlan_ds_misc_gtk_rekey_data gtk_rekey_data;
|
||||
dot11_protocol tx_protocols;
|
||||
dot11_protocol rx_protocols;
|
||||
t_u16 csi_seq;
|
||||
/** 0-disable, 1-enable */
|
||||
t_u16 csi_enable;
|
||||
/** default-ASCII, 1-binary */
|
||||
t_u8 csi_dump_format;
|
||||
/** total length of csi dump */
|
||||
t_u32 csi_dump_len;
|
||||
/** path name of csi dump */
|
||||
char csi_dump_path[64];
|
||||
/** CSI config */
|
||||
mlan_ds_csi_params csi_config;
|
||||
#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT)
|
||||
/** hostcmd_wait_q */
|
||||
wait_queue_head_t hostcmd_wait_q __ATTRIB_ALIGN__;
|
||||
|
@ -1648,13 +1752,240 @@ typedef struct _card_info {
|
|||
t_u32 slew_rate_reg;
|
||||
t_u8 slew_rate_bit_offset;
|
||||
#endif
|
||||
t_u8 sniffer_support;
|
||||
t_u8 per_pkt_cfg_support;
|
||||
} card_info;
|
||||
|
||||
/** channel_field.flags */
|
||||
#define CHANNEL_FLAGS_TURBO 0x0010
|
||||
#define CHANNEL_FLAGS_CCK 0x0020
|
||||
#define CHANNEL_FLAGS_OFDM 0x0040
|
||||
#define CHANNEL_FLAGS_2GHZ 0x0080
|
||||
#define CHANNEL_FLAGS_5GHZ 0x0100
|
||||
#define CHANNEL_FLAGS_ONLY_PASSIVSCAN_ALLOW 0x0200
|
||||
#define CHANNEL_FLAGS_DYNAMIC_CCK_OFDM 0x0400
|
||||
#define CHANNEL_FLAGS_GFSK 0x0800
|
||||
struct channel_field {
|
||||
/** frequency */
|
||||
t_u16 frequency;
|
||||
/** flags */
|
||||
t_u16 flags;
|
||||
} __packed;
|
||||
|
||||
/** mcs_field.known */
|
||||
#define MCS_KNOWN_BANDWIDTH 0x01
|
||||
#define MCS_KNOWN_MCS_INDEX_KNOWN 0x02
|
||||
#define MCS_KNOWN_GUARD_INTERVAL 0x04
|
||||
#define MCS_KNOWN_HT_FORMAT 0x08
|
||||
#define MCS_KNOWN_FEC_TYPE 0x10
|
||||
#define MCS_KNOWN_STBC_KNOWN 0x20
|
||||
#define MCS_KNOWN_NESS_KNOWN 0x40
|
||||
#define MCS_KNOWN_NESS_DATA 0x80
|
||||
/** bandwidth */
|
||||
#define RX_BW_20 0
|
||||
#define RX_BW_40 1
|
||||
#define RX_BW_20L 2
|
||||
#define RX_BW_20U 3
|
||||
#define RX_BW_80 4
|
||||
/** mcs_field.flags
|
||||
The flags field is any combination of the following:
|
||||
0x03 bandwidth - 0: 20, 1: 40, 2: 20L, 3: 20U
|
||||
0x04 guard interval - 0: long GI, 1: short GI
|
||||
0x08 HT format - 0: mixed, 1: greenfield
|
||||
0x10 FEC type - 0: BCC, 1: LDPC
|
||||
0x60 Number of STBC streams
|
||||
0x80 Ness - bit 0 (LSB) of Number of extension spatial streams */
|
||||
struct mcs_field {
|
||||
/** known */
|
||||
t_u8 known;
|
||||
/** flags */
|
||||
t_u8 flags;
|
||||
/** mcs */
|
||||
t_u8 mcs;
|
||||
} __packed;
|
||||
|
||||
/** vht_field.known */
|
||||
#define VHT_KNOWN_STBC 0x0001
|
||||
#define VHT_KNOWN_TXOP_PS_NA 0x0002
|
||||
#define VHT_KNOWN_GI 0x0004
|
||||
#define VHT_KNOWN_SGI_NSYM_DIS 0x0008
|
||||
#define VHT_KNOWN_LDPC_EXTRA_OFDM_SYM 0x0010
|
||||
#define VHT_KNOWN_BEAMFORMED 0x0020
|
||||
#define VHT_KNOWN_BANDWIDTH 0x0040
|
||||
#define VHT_KNOWN_GROUP_ID 0x0080
|
||||
#define VHT_KNOWN_PARTIAL_AID 0x0100
|
||||
|
||||
/** vht_field.flags */
|
||||
#define VHT_FLAG_STBC 0x01
|
||||
#define VHT_FLAG_TXOP_PS_NA 0x02
|
||||
#define VHT_FLAG_SGI 0x04
|
||||
#define VHT_FLAG_SGI_NSYM_M10_9 0x08
|
||||
#define VHT_FLAG_LDPC_EXTRA_OFDM_SYM 0x10
|
||||
#define VHT_FLAG_BEAMFORMED 0x20
|
||||
|
||||
/** vht_field.coding */
|
||||
#define VHT_CODING_LDPC_USER0 0x01
|
||||
#define VHT_CODING_LDPC_USER1 0x02
|
||||
#define VHT_CODING_LDPC_USER2 0x04
|
||||
#define VHT_CODING_LDPC_USER3 0x08
|
||||
|
||||
/** vht_field */
|
||||
struct vht_field {
|
||||
/** pad: for vht field require 2 bytes alignment */
|
||||
t_u8 pad;
|
||||
/** known */
|
||||
t_u16 known;
|
||||
/** flags */
|
||||
t_u8 flags;
|
||||
/** bandwidth */
|
||||
t_u8 bandwidth;
|
||||
/** mcs_nss for up to 4 users */
|
||||
t_u8 mcs_nss[4];
|
||||
/** coding for up to 4 users */
|
||||
t_u8 coding;
|
||||
/** group_id */
|
||||
t_u8 group_id;
|
||||
/** partial_aid */
|
||||
t_u16 partial_aid;
|
||||
} __packed;
|
||||
|
||||
/** radiotap_body.flags */
|
||||
#define RADIOTAP_FLAGS_DURING_CFG 0x01
|
||||
#define RADIOTAP_FLAGS_SHORT_PREAMBLE 0x02
|
||||
#define RADIOTAP_FLAGS_WEP_ENCRYPTION 0x04
|
||||
#define RADIOTAP_FLAGS_WITH_FRAGMENT 0x08
|
||||
#define RADIOTAP_FLAGS_INCLUDE_FCS 0x10
|
||||
#define RADIOTAP_FLAGS_PAD_BTW_HEADER_PAYLOAD 0x20
|
||||
#define RADIOTAP_FLAGS_FAILED_FCS_CHECK 0x40
|
||||
#define RADIOTAP_FLAGS_USE_SGI_HT 0x80
|
||||
struct radiotap_body {
|
||||
/** timestamp */
|
||||
t_u64 timestamp;
|
||||
/** flags */
|
||||
t_u8 flags;
|
||||
/** rate for LG pkt, RATE flag will be present, it shows datarate in
|
||||
* 500Kbps. For HT/VHT pkt, RATE flag will not be present, it is not
|
||||
* used. */
|
||||
t_u8 rate;
|
||||
/** channel */
|
||||
struct channel_field channel;
|
||||
/** antenna_signal */
|
||||
t_s8 antenna_signal;
|
||||
/** antenna_noise */
|
||||
t_s8 antenna_noise;
|
||||
/** antenna */
|
||||
t_u8 antenna;
|
||||
/** union for HT/VHT pkt */
|
||||
union {
|
||||
/** mcs field */
|
||||
struct mcs_field mcs;
|
||||
/** vht field */
|
||||
struct vht_field vht;
|
||||
} u;
|
||||
} __packed;
|
||||
|
||||
struct radiotap_header {
|
||||
struct ieee80211_radiotap_header hdr;
|
||||
struct radiotap_body body;
|
||||
} __packed;
|
||||
|
||||
/** Roam offload config parameters */
|
||||
typedef struct woal_priv_fw_roam_offload_cfg {
|
||||
/* User set passphrase*/
|
||||
t_u8 userset_passphrase;
|
||||
/* BSSID for fw roaming/auto_reconnect*/
|
||||
t_u8 bssid[MLAN_MAC_ADDR_LENGTH];
|
||||
/* Retry_count for fw roaming/auto_reconnect*/
|
||||
t_u8 retry_count;
|
||||
/* Condition to trigger roaming
|
||||
* Bit0 : RSSI low trigger
|
||||
* Bit1 : Pre-beacon lost trigger
|
||||
* Bit2 : Link Lost trigger
|
||||
* Bit3 : Deauth by ext-AP trigger
|
||||
* Bit4 ~ Bit15 : Reserved
|
||||
* value 0 : no trigger
|
||||
* value 0xff : invalid
|
||||
*/
|
||||
t_u16 trigger_condition;
|
||||
/* SSID List(White list)*/
|
||||
mlan_ds_misc_ssid_list ssid_list;
|
||||
/* Black list(BSSID list)*/
|
||||
mlan_ds_misc_roam_offload_aplist black_list;
|
||||
|
||||
/* RSSI paramters set flag*/
|
||||
t_u8 rssi_param_set_flag;
|
||||
/* MAX_RSSI for fw roaming*/
|
||||
t_u8 max_rssi;
|
||||
/* MIN_RSSI for fw roaming*/
|
||||
t_u8 min_rssi;
|
||||
/* Step_RSSI for fw roaming*/
|
||||
t_u8 step_rssi;
|
||||
|
||||
/* BAND and RSSI_HYSTERESIS set flag*/
|
||||
t_u8 band_rssi_flag;
|
||||
mlan_ds_misc_band_rssi band_rssi;
|
||||
|
||||
/* BGSCAN params set flag*/
|
||||
t_u8 bgscan_set_flag;
|
||||
mlan_ds_misc_bgscan_cfg bgscan_cfg;
|
||||
|
||||
/* EES mode params set flag*/
|
||||
t_u8 ees_param_set_flag;
|
||||
mlan_ds_misc_ees_cfg ees_cfg;
|
||||
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 bcn_miss_threshold;
|
||||
|
||||
/* Beacon miss threshold*/
|
||||
t_u8 pre_bcn_miss_threshold;
|
||||
|
||||
/* scan repeat count*/
|
||||
t_u16 repeat_count;
|
||||
} woal_roam_offload_cfg;
|
||||
#ifdef STA_CFG80211
|
||||
int woal_set_clear_pmk(moal_private *priv, t_u8 action);
|
||||
#endif
|
||||
mlan_status woal_config_fw_roaming(moal_private *priv, t_u8 cfg_mode,
|
||||
woal_roam_offload_cfg *roam_offload_cfg);
|
||||
int woal_enable_fw_roaming(moal_private *priv, int data);
|
||||
|
||||
#define GTK_REKEY_OFFLOAD_DISABLE 0
|
||||
#define GTK_REKEY_OFFLOAD_ENABLE 1
|
||||
#define GTK_REKEY_OFFLOAD_SUSPEND 2
|
||||
|
||||
/** Monitor Band Channel Config */
|
||||
typedef struct _netmon_band_chan_cfg {
|
||||
t_u32 band;
|
||||
t_u32 channel;
|
||||
t_u32 chan_bandwidth;
|
||||
} netmon_band_chan_cfg;
|
||||
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
typedef struct _monitor_iface {
|
||||
/* The priv data of interface on which the monitor iface is based */
|
||||
moal_private *priv;
|
||||
struct wireless_dev wdev;
|
||||
/** 0 - Disabled
|
||||
* 1 - Channel Specified sniffer mode
|
||||
* 2 - In-Channel sniffer mode
|
||||
*/
|
||||
int sniffer_mode;
|
||||
int radiotap_enabled;
|
||||
/* The net_device on which the monitor iface is based. */
|
||||
struct net_device *base_ndev;
|
||||
struct net_device *mon_ndev;
|
||||
char ifname[IFNAMSIZ];
|
||||
int flag;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
struct cfg80211_chan_def chandef;
|
||||
#endif
|
||||
/** Netmon Band Channel Config */
|
||||
netmon_band_chan_cfg band_chan_cfg;
|
||||
/** Monitor device statistics structure */
|
||||
struct net_device_stats stats;
|
||||
} monitor_iface;
|
||||
#endif
|
||||
|
||||
#define MAX_KEEP_ALIVE_ID 4
|
||||
|
||||
/** Operation data structure for MOAL bus interfaces */
|
||||
|
@ -1712,6 +2043,7 @@ enum ext_mod_params {
|
|||
EXT_COUNTRY_IE_IGNORE,
|
||||
EXT_BEACON_HINTS,
|
||||
#endif
|
||||
EXT_ROAMOFFLOAD_IN_HS,
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
EXT_HOST_MLME,
|
||||
|
@ -1721,6 +2053,7 @@ enum ext_mod_params {
|
|||
EXT_RPS,
|
||||
EXT_TX_SKB_CLONE,
|
||||
EXT_PMQOS,
|
||||
EXT_CHAN_TRACK,
|
||||
EXT_MAX_PARAM,
|
||||
};
|
||||
|
||||
|
@ -1794,15 +2127,11 @@ typedef struct _moal_mod_para {
|
|||
int pcie_int_mode;
|
||||
int ring_size;
|
||||
#endif /* PCIE */
|
||||
#ifdef ANDROID_KERNEL
|
||||
int wakelock_timeout;
|
||||
unsigned int dev_cap_mask;
|
||||
#if defined(SD8997) || defined(PCIE8997) || defined(USB8997) || \
|
||||
defined(SD8977) || defined(SD8987) || defined(SD9098) || \
|
||||
defined(USB9098) || defined(PCIE9098) || defined(SD9097) || \
|
||||
defined(USB9097) || defined(PCIE9097) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
int pmic;
|
||||
#endif
|
||||
unsigned int dev_cap_mask;
|
||||
int pmic;
|
||||
int antcfg;
|
||||
unsigned int uap_oper_ctrl;
|
||||
int hs_wake_interval;
|
||||
|
@ -1898,6 +2227,11 @@ struct _moal_handle {
|
|||
/** Bss attr */
|
||||
moal_drv_mode drv_mode;
|
||||
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
/** Monitor interface */
|
||||
monitor_iface *mon_if;
|
||||
#endif
|
||||
|
||||
/** set mac address flag */
|
||||
t_u8 set_mac_addr;
|
||||
/** MAC address */
|
||||
|
@ -1939,8 +2273,25 @@ struct _moal_handle {
|
|||
t_u32 fw_release_number;
|
||||
/** Firmware Hotfix version */
|
||||
t_u8 fw_hotfix_version;
|
||||
/** Firmware support bands */
|
||||
t_u16 fw_bands;
|
||||
/** ECSA support */
|
||||
t_u8 fw_ecsa_enable;
|
||||
/** FW ROAMING support */
|
||||
t_u8 fw_roam_enable;
|
||||
/** FW ROAMING capability in fw */
|
||||
t_u8 fw_roaming_support;
|
||||
/** Retry count for auto reconnect based on FW ROAMING*/
|
||||
t_u16 auto_reconnect_retry_count;
|
||||
/** The SSID for auto reconnect FW ROAMING*/
|
||||
mlan_802_11_ssid auto_reconnect_ssid;
|
||||
/** The BSSID for auto reconnect FW ROAMING*/
|
||||
mlan_802_11_mac_addr auto_reconnect_bssid;
|
||||
/** The parameters for FW ROAMING*/
|
||||
woal_roam_offload_cfg fw_roam_params;
|
||||
/** The keys for FW ROAMING*/
|
||||
mlan_ds_passphrase ssid_passphrase[MAX_SEC_SSID_NUM];
|
||||
|
||||
/** Getlog support */
|
||||
t_u8 fw_getlog_enable;
|
||||
/** Init wait queue token */
|
||||
|
@ -2045,6 +2396,8 @@ struct _moal_handle {
|
|||
struct wiphy *wiphy;
|
||||
/** Country code for regulatory domain */
|
||||
t_u8 country_code[COUNTRY_CODE_LEN];
|
||||
/** dfs_region */
|
||||
t_u8 dfs_region;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
/** regulatory work */
|
||||
struct work_struct regulatory_work;
|
||||
|
@ -2215,10 +2568,12 @@ struct _moal_handle {
|
|||
/** Card specific driver version */
|
||||
t_s8 driver_version[MLAN_MAX_VER_STR_LEN];
|
||||
char *fwdump_fname;
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
struct wakeup_source ws;
|
||||
#else
|
||||
struct wake_lock wake_lock;
|
||||
#endif
|
||||
#endif
|
||||
t_u16 dfs_repeater_mode;
|
||||
/* feature_control */
|
||||
|
@ -2270,11 +2625,7 @@ struct _moal_handle {
|
|||
|
||||
t_u8 request_pm;
|
||||
#ifdef IMX_SUPPORT
|
||||
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
|
||||
struct dev_pm_qos_request woal_pm_qos_req;
|
||||
#endif
|
||||
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)
|
||||
struct pm_qos_request woal_pm_qos_req;
|
||||
#endif
|
||||
#endif
|
||||
|
@ -2632,20 +2983,6 @@ static inline void hexdump(t_u32 level, char *prompt, t_u8 *buf, int len)
|
|||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifdef BIG_ENDIAN_SUPPORT
|
||||
/** Convert from 16 bit little endian format to CPU format */
|
||||
#define woal_le16_to_cpu(x) le16_to_cpu(x)
|
||||
/** Convert from 32 bit little endian format to CPU format */
|
||||
#define woal_le32_to_cpu(x) le32_to_cpu(x)
|
||||
/** Convert from 64 bit little endian format to CPU format */
|
||||
#define woal_le64_to_cpu(x) le64_to_cpu(x)
|
||||
/** Convert to 16 bit little endian format from CPU format */
|
||||
#define woal_cpu_to_le16(x) cpu_to_le16(x)
|
||||
/** Convert to 32 bit little endian format from CPU format */
|
||||
#define woal_cpu_to_le32(x) cpu_to_le32(x)
|
||||
/** Convert to 64 bit little endian format from CPU format */
|
||||
#define woal_cpu_to_le64(x) cpu_to_le64(x)
|
||||
#else
|
||||
/** Do nothing */
|
||||
#define woal_le16_to_cpu(x) x
|
||||
/** Do nothing */
|
||||
|
@ -2658,7 +2995,6 @@ static inline void hexdump(t_u32 level, char *prompt, t_u8 *buf, int len)
|
|||
#define woal_cpu_to_le32(x) x
|
||||
/** Do nothing */
|
||||
#define woal_cpu_to_le64(x) x
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function returns first available priv
|
||||
|
@ -2724,6 +3060,18 @@ static inline moal_private *woal_get_vir_priv_bss_type(moal_handle *handle,
|
|||
}
|
||||
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
/** get any cfg80211 priv */
|
||||
static inline moal_private *woal_get_priv_with_wdev(moal_handle *handle)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < MIN(handle->priv_num, MLAN_MAX_BSS_NUM); i++) {
|
||||
if (handle->priv[i]) {
|
||||
if (handle->priv[i]->wdev)
|
||||
return handle->priv[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
static inline void woal_get_monotonic_time(wifi_timeval *tv)
|
||||
|
@ -2884,6 +3232,7 @@ void woal_free_moal_handle(moal_handle *handle);
|
|||
/** shutdown fw */
|
||||
mlan_status woal_shutdown_fw(moal_private *priv, t_u8 wait_option);
|
||||
/* Functions in interface module */
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 4, 0)
|
||||
static inline void wakeup_source_init(struct wakeup_source *ws,
|
||||
const char *name)
|
||||
|
@ -2913,6 +3262,7 @@ static inline void wakeup_source_trash(struct wakeup_source *ws)
|
|||
LEAVE();
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
/** Add card */
|
||||
moal_handle *woal_add_card(void *card, struct device *dev, moal_if_ops *if_ops,
|
||||
t_u16 card_type);
|
||||
|
@ -3283,6 +3633,9 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_num,
|
|||
void woal_remove_interface(moal_handle *handle, t_u8 bss_index);
|
||||
void woal_set_multicast_list(struct net_device *dev);
|
||||
mlan_status woal_request_fw(moal_handle *handle);
|
||||
mlan_status woal_ioctl_aggr_prio_tbl(moal_private *priv, t_u32 action,
|
||||
mlan_ds_11n_aggr_prio_tbl *aggr_prio_tbl);
|
||||
|
||||
int woal_11h_channel_check_ioctl(moal_private *priv, t_u8 wait_option);
|
||||
void woal_cancel_cac_block(moal_private *priv);
|
||||
void woal_moal_debug_info(moal_private *priv, moal_handle *handle, u8 flag);
|
||||
|
@ -3354,12 +3707,18 @@ void woal_flush_tx_stat_queue(moal_private *priv);
|
|||
struct tx_status_info *woal_get_tx_info(moal_private *priv, t_u8 tx_seq_num);
|
||||
void woal_remove_tx_info(moal_private *priv, t_u8 tx_seq_num);
|
||||
|
||||
void woal_flush_mcast_list(moal_private *priv);
|
||||
t_void woal_add_mcast_node(moal_private *priv, t_u8 *mcast_addr);
|
||||
void woal_remove_mcast_node(moal_private *priv, t_u8 *mcast_addr);
|
||||
t_u8 woal_find_mcast_node_tx(moal_private *priv, struct sk_buff *skb);
|
||||
|
||||
mlan_status woal_request_country_power_table(moal_private *priv, char *region);
|
||||
#ifdef RX_PACKET_COALESCE
|
||||
mlan_status woal_rx_pkt_coalesce_cfg(moal_private *priv, t_u16 *enable,
|
||||
t_u8 wait_option, t_u8 action);
|
||||
#endif
|
||||
mlan_status woal_set_low_pwr_mode(moal_handle *handle, t_u8 wait_option);
|
||||
mlan_status woal_set_chan_track_mode(moal_handle *handle, t_u8 wait_option);
|
||||
int woal_hexval(char chr);
|
||||
mlan_status woal_pmic_configure(moal_handle *handle, t_u8 wait_option);
|
||||
mlan_status woal_set_user_antcfg(moal_handle *handle, t_u8 wait_option);
|
||||
|
@ -3375,6 +3734,11 @@ mlan_status woal_set_get_wowlan_config(moal_private *priv, t_u16 action,
|
|||
t_u8 wait_option,
|
||||
mlan_ds_misc_mef_flt_cfg *mefcfg);
|
||||
mlan_status woal_set_auto_arp_ext(moal_handle *handle, t_u8 enable);
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
mlan_status woal_set_net_monitor(moal_private *priv, t_u8 wait_option,
|
||||
t_u8 enable, t_u8 filter,
|
||||
netmon_band_chan_cfg *band_chan_cfg);
|
||||
#endif
|
||||
mlan_status woal_delba_all(moal_private *priv, t_u8 wait_option);
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
|
@ -3397,6 +3761,12 @@ mlan_status woal_set_wacp_mode(moal_private *priv, t_u8 wait_option);
|
|||
#endif
|
||||
mlan_status woal_init_aggr_ctrl(moal_handle *handle, t_u8 wait_option);
|
||||
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
monitor_iface *woal_prepare_mon_if(moal_private *priv, const char *name,
|
||||
unsigned char name_assign_type,
|
||||
int sniffer_mode);
|
||||
#endif
|
||||
|
||||
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
|
||||
void woal_cfg80211_vendor_event_fw_dump(moal_private *priv);
|
||||
#endif
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* related functions.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -56,8 +56,8 @@ static mlan_status woal_pcie_init(pcie_service_card *card);
|
|||
static const struct pci_device_id wlan_ids[] = {
|
||||
#ifdef PCIE8897
|
||||
{
|
||||
PCIE_VENDOR_ID_NXP,
|
||||
PCIE_DEVICE_ID_NXP_88W8897P,
|
||||
PCIE_VENDOR_ID_MRVL,
|
||||
PCIE_DEVICE_ID_88W8897P,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
|
@ -66,16 +66,16 @@ static const struct pci_device_id wlan_ids[] = {
|
|||
#endif
|
||||
#ifdef PCIE8997
|
||||
{
|
||||
PCIE_VENDOR_ID_NXP,
|
||||
PCIE_DEVICE_ID_NXP_88W8997P,
|
||||
PCIE_VENDOR_ID_MRVL,
|
||||
PCIE_DEVICE_ID_88W8997P,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
0,
|
||||
},
|
||||
{
|
||||
PCIE_VENDOR_ID_V2_NXP,
|
||||
PCIE_DEVICE_ID_NXP_88W8997P,
|
||||
PCIE_VENDOR_ID_V2_MRVL,
|
||||
PCIE_DEVICE_ID_88W8997P,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
|
@ -84,8 +84,8 @@ static const struct pci_device_id wlan_ids[] = {
|
|||
#endif
|
||||
#ifdef PCIE9097
|
||||
{
|
||||
PCIE_VENDOR_ID_V2_NXP,
|
||||
PCIE_DEVICE_ID_NXP_88W9097,
|
||||
PCIE_VENDOR_ID_V2_MRVL,
|
||||
PCIE_DEVICE_ID_88W9097,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
|
@ -94,22 +94,33 @@ static const struct pci_device_id wlan_ids[] = {
|
|||
#endif
|
||||
#ifdef PCIE9098
|
||||
{
|
||||
PCIE_VENDOR_ID_V2_NXP,
|
||||
PCIE_DEVICE_ID_NXP_88W9098P_FN0,
|
||||
PCIE_VENDOR_ID_V2_MRVL,
|
||||
PCIE_DEVICE_ID_88W9098P_FN0,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
0,
|
||||
},
|
||||
{
|
||||
PCIE_VENDOR_ID_V2_NXP,
|
||||
PCIE_DEVICE_ID_NXP_88W9098P_FN1,
|
||||
PCIE_VENDOR_ID_V2_MRVL,
|
||||
PCIE_DEVICE_ID_88W9098P_FN1,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
0,
|
||||
},
|
||||
#endif
|
||||
#ifdef PCIENW62X
|
||||
{
|
||||
PCIE_VENDOR_ID_NXP,
|
||||
PCIE_DEVICE_ID_88WNW62X,
|
||||
PCI_ANY_ID,
|
||||
PCI_ANY_ID,
|
||||
0,
|
||||
0,
|
||||
},
|
||||
#endif
|
||||
|
||||
{},
|
||||
};
|
||||
/* moal interface ops */
|
||||
|
@ -139,7 +150,7 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
|
||||
/* Update card type */
|
||||
#ifdef PCIE8897
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_NXP_88W8897P) {
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88W8897P) {
|
||||
card_type = CARD_TYPE_PCIE8897;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_PCIE8897,
|
||||
strlen(CARD_PCIE8897), strlen(driver_version));
|
||||
|
@ -152,7 +163,7 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
}
|
||||
#endif
|
||||
#ifdef PCIE8997
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_NXP_88W8997P) {
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88W8997P) {
|
||||
card_type = CARD_TYPE_PCIE8997;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_PCIE8997,
|
||||
strlen(CARD_PCIE8997), strlen(driver_version));
|
||||
|
@ -165,10 +176,10 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
}
|
||||
#endif
|
||||
#ifdef PCIE9097
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_NXP_88W9097) {
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88W9097) {
|
||||
card_type = CARD_TYPE_PCIE9097;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_PCIEIW620,
|
||||
strlen(CARD_PCIEIW620), strlen(driver_version));
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_PCIE9097,
|
||||
strlen(CARD_PCIE9097), strlen(driver_version));
|
||||
moal_memcpy_ext(NULL,
|
||||
driver_version + strlen(INTF_CARDTYPE) +
|
||||
strlen(KERN_VERSION),
|
||||
|
@ -178,8 +189,8 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
}
|
||||
#endif
|
||||
#ifdef PCIE9098
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_NXP_88W9098P_FN0 ||
|
||||
cardp_pcie->dev->device == PCIE_DEVICE_ID_NXP_88W9098P_FN1) {
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88W9098P_FN0 ||
|
||||
cardp_pcie->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) {
|
||||
card_type = CARD_TYPE_PCIE9098;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_PCIE9098,
|
||||
strlen(CARD_PCIE9098), strlen(driver_version));
|
||||
|
@ -191,6 +202,20 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
strlen(KERN_VERSION));
|
||||
}
|
||||
#endif
|
||||
#ifdef PCIENW62X
|
||||
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WNW62X) {
|
||||
card_type = CARD_TYPE_PCIENW62X;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_PCIENW62X,
|
||||
strlen(CARD_PCIENW62X), strlen(driver_version));
|
||||
moal_memcpy_ext(NULL,
|
||||
driver_version + strlen(INTF_CARDTYPE) +
|
||||
strlen(KERN_VERSION),
|
||||
V17, strlen(V17),
|
||||
strlen(driver_version) - strlen(INTF_CARDTYPE) -
|
||||
strlen(KERN_VERSION));
|
||||
}
|
||||
#endif
|
||||
|
||||
return card_type;
|
||||
}
|
||||
|
||||
|
@ -237,6 +262,7 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag)
|
|||
|
||||
if (!IS_PCIE8997(handle->card_type) &&
|
||||
!IS_PCIE9097(handle->card_type) &&
|
||||
!IS_PCIENW62X(handle->card_type) &&
|
||||
!IS_PCIE9098(handle->card_type)) {
|
||||
LEAVE();
|
||||
return status;
|
||||
|
@ -312,7 +338,7 @@ perform_init:
|
|||
}
|
||||
|
||||
#ifdef PCIE9098
|
||||
if (card->dev->device == PCIE_DEVICE_ID_NXP_88W9098P_FN1)
|
||||
if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1)
|
||||
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1);
|
||||
else
|
||||
#endif
|
||||
|
@ -355,11 +381,13 @@ err_init_fw:
|
|||
wait_event_interruptible(handle->init_wait_q,
|
||||
handle->init_wait_q_woken);
|
||||
}
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
wakeup_source_trash(&handle->ws);
|
||||
#else
|
||||
wake_lock_destroy(&handle->wake_lock);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_PROC_FS
|
||||
woal_proc_exit(handle);
|
||||
#endif
|
||||
|
@ -593,7 +621,9 @@ static int woal_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||
}
|
||||
woal_flush_workqueue(handle);
|
||||
if (!keep_power) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
|
||||
woal_do_flr(handle, true, false);
|
||||
#endif
|
||||
handle->surprise_removed = MTRUE;
|
||||
handle->is_suspended = MTRUE;
|
||||
}
|
||||
|
@ -659,7 +689,9 @@ static int woal_pcie_resume(struct pci_dev *pdev)
|
|||
pci_enable_wake(pdev, PCI_D0, 0);
|
||||
if (!keep_power) {
|
||||
handle->surprise_removed = MFALSE;
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
|
||||
woal_do_flr(handle, false, false);
|
||||
#endif
|
||||
} else {
|
||||
if (woal_check_driver_status(handle)) {
|
||||
PRINTM(MERROR, "Resuem, device is in hang state\n");
|
||||
|
@ -1304,7 +1336,7 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
|
|||
}
|
||||
|
||||
#ifdef PCIE9098
|
||||
if (card->dev->device == PCIE_DEVICE_ID_NXP_88W9098P_FN1)
|
||||
if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1)
|
||||
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1);
|
||||
else
|
||||
#endif
|
||||
|
@ -1430,7 +1462,7 @@ void woal_pcie_bus_unregister(void)
|
|||
LEAVE();
|
||||
}
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
#define PCIE9098_DUMP_CTRL_REG 0x1C94
|
||||
#define PCIE9098_DUMP_START_REG 0x1C98
|
||||
#define PCIE9098_DUMP_END_REG 0x1C9F
|
||||
|
@ -1441,7 +1473,7 @@ void woal_pcie_bus_unregister(void)
|
|||
#define DEBUG_DUMP_END_REG 0xCFF
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
#define PCIE9098_SCRATCH_12_REG 0x1C90
|
||||
#define PCIE9098_SCRATCH_14_REG 0x1C98
|
||||
#define PCIE9098_SCRATCH_15_REG 0x1C9C
|
||||
|
@ -1477,7 +1509,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
|
|||
t_u32 dump_end_reg = 0;
|
||||
t_u32 scratch_14_reg = 0;
|
||||
t_u32 scratch_15_reg = 0;
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/* Tx/Rx/Event AMDA start address */
|
||||
t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080};
|
||||
t_u8 j;
|
||||
|
@ -1505,8 +1537,9 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
reg = PCIE9098_SCRATCH_12_REG;
|
||||
dump_start_reg = PCIE9098_DUMP_REG_START;
|
||||
|
@ -1548,8 +1581,9 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
|
|||
}
|
||||
i++;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
drv_ptr += sprintf(
|
||||
drv_ptr,
|
||||
|
@ -1570,6 +1604,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
|
|||
drv_ptr += sprintf(drv_ptr, "%s\n", buf);
|
||||
}
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
drv_ptr += sprintf(drv_ptr,
|
||||
"ADMA Tx/Rx/Event/Cmd/CmdResp registers:\n");
|
||||
|
@ -1623,7 +1658,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
|
|||
t_u32 dump_end_reg = 0;
|
||||
t_u32 scratch_14_reg = 0;
|
||||
t_u32 scratch_15_reg = 0;
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
/* Tx/Rx/Event AMDA start address */
|
||||
t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080};
|
||||
t_u8 j;
|
||||
|
@ -1647,8 +1682,9 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
reg = PCIE9098_SCRATCH_12_REG;
|
||||
dump_start_reg = PCIE9098_DUMP_START_REG;
|
||||
|
@ -1685,8 +1721,9 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
|
|||
}
|
||||
i++;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
PRINTM(MMSG, "PCIE registers from offset 0x1c20 to 0x1c9c:\n");
|
||||
memset(buf, 0, sizeof(buf));
|
||||
|
@ -1705,6 +1742,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
|
|||
PRINTM(MMSG, "%s\n", buf);
|
||||
}
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
PRINTM(MMSG, "ADMA Tx/Rx/Event/Cmd/CmdResp registers:\n");
|
||||
for (j = 0; j < ARRAY_SIZE(adma_reg_table); j++) {
|
||||
|
@ -1771,7 +1809,8 @@ static memory_type_mapping mem_type_mapping_tbl_8897[] = {
|
|||
};
|
||||
#endif
|
||||
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
|
||||
defined(PCIENW62X)
|
||||
#define DEBUG_HOST_READY_8997 0xCC
|
||||
#define DEBUG_HOST_EVENT_READY 0xAA
|
||||
static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL,
|
||||
|
@ -1780,7 +1819,7 @@ static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL,
|
|||
#endif
|
||||
|
||||
#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \
|
||||
defined(PCIE9097)
|
||||
defined(PCIE9097) || defined(PCIENW62X)
|
||||
/**
|
||||
* @brief This function reads data by 8 bit from card register
|
||||
*
|
||||
|
@ -1828,8 +1867,9 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
if (phandle->event_fw_dump)
|
||||
debug_host_ready = DEBUG_HOST_EVENT_READY;
|
||||
|
@ -1844,8 +1884,9 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag)
|
|||
PRINTM(MERROR, "PCIE Write ERR\n");
|
||||
return RDWR_STATUS_FAILURE;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
if (phandle->event_fw_dump)
|
||||
return RDWR_STATUS_SUCCESS;
|
||||
|
@ -2049,7 +2090,8 @@ done:
|
|||
}
|
||||
#endif
|
||||
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
|
||||
defined(PCIENW62X)
|
||||
/**
|
||||
* @brief This function dump firmware memory to file
|
||||
*
|
||||
|
@ -2077,8 +2119,9 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
|
|||
PRINTM(MERROR, "Could not dump firmwware info\n");
|
||||
return;
|
||||
}
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
if (phandle->event_fw_dump) {
|
||||
if (RDWR_STATUS_FAILURE !=
|
||||
|
@ -2098,8 +2141,9 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
|
|||
/* read the number of the memories which will dump */
|
||||
if (RDWR_STATUS_FAILURE == woal_pcie_rdwr_firmware(phandle, doneflag))
|
||||
goto done;
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
if (IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
dump_start_reg = PCIE9098_DUMP_START_REG;
|
||||
dump_end_reg = PCIE9098_DUMP_END_REG;
|
||||
|
@ -2224,7 +2268,7 @@ static t_u8 woal_pcie_is_second_mac(moal_handle *handle)
|
|||
{
|
||||
#ifdef PCIE9098
|
||||
pcie_service_card *card = (pcie_service_card *)handle->card;
|
||||
if (card->dev->device == PCIE_DEVICE_ID_NXP_88W9098P_FN1)
|
||||
if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1)
|
||||
return MTRUE;
|
||||
#endif
|
||||
return MFALSE;
|
||||
|
@ -2238,8 +2282,10 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
|
|||
if (IS_PCIE8897(phandle->card_type))
|
||||
woal_pcie_dump_fw_info_v1(phandle);
|
||||
#endif
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
|
||||
defined(PCIENW62X)
|
||||
if (IS_PCIE8997(phandle->card_type) ||
|
||||
IS_PCIENW62X(phandle->card_type) ||
|
||||
IS_PCIE9098(phandle->card_type) ||
|
||||
IS_PCIE9097(phandle->card_type)) {
|
||||
woal_pcie_dump_fw_info_v2(phandle);
|
||||
|
@ -2268,12 +2314,14 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
|
|||
moal_handle *ref_handle = NULL;
|
||||
#endif
|
||||
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
|
||||
defined(PCIENW62X)
|
||||
t_u32 rev_id_reg = handle->card_info->rev_id_reg;
|
||||
t_u32 revision_id = 0;
|
||||
#endif
|
||||
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097)
|
||||
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
|
||||
defined(PCIENW62X)
|
||||
t_u32 host_strap_reg = handle->card_info->host_strap_reg;
|
||||
t_u32 magic_reg = handle->card_info->magic_reg;
|
||||
t_u32 strap = 0;
|
||||
|
@ -2326,7 +2374,7 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
|
|||
#endif
|
||||
#ifdef PCIE9098
|
||||
if (IS_PCIE9098(handle->card_type)) {
|
||||
if (card->dev->device == PCIE_DEVICE_ID_NXP_88W9098P_FN0) {
|
||||
if (card->dev->device == PCIE_DEVICE_ID_88W9098P_FN0) {
|
||||
woal_pcie_read_reg(handle, rev_id_reg, &revision_id);
|
||||
woal_pcie_read_reg(handle, host_strap_reg, &strap);
|
||||
woal_pcie_read_reg(handle, magic_reg, &magic);
|
||||
|
@ -2431,6 +2479,26 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef PCIENW62X
|
||||
if (IS_PCIENW62X(handle->card_type)) {
|
||||
woal_pcie_read_reg(handle, rev_id_reg, &revision_id);
|
||||
woal_pcie_read_reg(handle, host_strap_reg, &strap);
|
||||
woal_pcie_read_reg(handle, magic_reg, &magic);
|
||||
revision_id &= 0xff;
|
||||
strap &= 0x7;
|
||||
magic &= 0xff;
|
||||
PRINTM(MCMND, "magic=0x%x, strap=0x%x, revision_id=0x%x\n",
|
||||
magic, strap, revision_id);
|
||||
if (magic == CHIP_MAGIC_VALUE) {
|
||||
if (strap == CARD_TYPE_PCIE_UART)
|
||||
strcpy(handle->card_info->fw_name,
|
||||
PCIEUARTNW62X_DEFAULT_COMBO_FW_NAME);
|
||||
else
|
||||
strcpy(handle->card_info->fw_name,
|
||||
PCIEUSBNW62X_DEFAULT_COMBO_FW_NAME);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
done:
|
||||
PRINTM(MCMND, "combo fw:%s wlan fw:%s \n", handle->card_info->fw_name,
|
||||
handle->card_info->fw_name_wlan);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* driver.
|
||||
*
|
||||
*
|
||||
* Copyright 2014-2020 NXP
|
||||
* Copyright 2014-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -29,27 +29,34 @@ Change log:
|
|||
#ifndef _MOAL_PCIE_H_
|
||||
#define _MOAL_PCIE_H_
|
||||
|
||||
#define PCIE_VENDOR_ID_NXP (0x11ab)
|
||||
#define PCIE_VENDOR_ID_V2_NXP (0x1b4b)
|
||||
#define PCIE_VENDOR_ID_MRVL (0x11ab)
|
||||
#define PCIE_VENDOR_ID_V2_MRVL (0x1b4b)
|
||||
#define PCIE_VENDOR_ID_NXP (0x1131)
|
||||
|
||||
#ifdef PCIE8997
|
||||
/** PCIE device ID for 8997 card */
|
||||
#define PCIE_DEVICE_ID_NXP_88W8997P (0x2b42)
|
||||
#define PCIE_DEVICE_ID_88W8997P (0x2b42)
|
||||
#endif
|
||||
#ifdef PCIE8897
|
||||
/** PCIE device ID for 8897 card */
|
||||
#define PCIE_DEVICE_ID_NXP_88W8897P (0x2b38)
|
||||
#define PCIE_DEVICE_ID_88W8897P (0x2b38)
|
||||
#endif
|
||||
|
||||
#ifdef PCIE9097
|
||||
/** PCIE device ID for 9097 card */
|
||||
#define PCIE_DEVICE_ID_NXP_88W9097 (0x2b56)
|
||||
#define PCIE_DEVICE_ID_88W9097 (0x2b56)
|
||||
#endif
|
||||
|
||||
#ifdef PCIE9098
|
||||
/** PCIE device ID for 9098 card FN0 */
|
||||
#define PCIE_DEVICE_ID_NXP_88W9098P_FN0 (0x2b43)
|
||||
#define PCIE_DEVICE_ID_88W9098P_FN0 (0x2b43)
|
||||
/** PCIE device ID for 9098 card FN1 */
|
||||
#define PCIE_DEVICE_ID_NXP_88W9098P_FN1 (0x2b44)
|
||||
#define PCIE_DEVICE_ID_88W9098P_FN1 (0x2b44)
|
||||
#endif
|
||||
|
||||
#ifdef PCIENW62X
|
||||
/** PCIE device ID for NW62X card FN0 */
|
||||
#define PCIE_DEVICE_ID_88WNW62X (0x3000)
|
||||
#endif
|
||||
|
||||
#include <linux/version.h>
|
||||
|
@ -106,7 +113,14 @@ Change log:
|
|||
#define PCIE9097_WLAN_V1_FW_NAME "nxp/pcieiw620_wlan_v1.bin"
|
||||
#endif /* PCIE9097 */
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097)
|
||||
#ifdef PCIENW62X
|
||||
#define PCIENW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbnw62x_combo.bin"
|
||||
#define PCIEUARTNW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieuartnw62x_combo.bin"
|
||||
#define PCIEUSBNW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbnw62x_combo.bin"
|
||||
#define PCIENW62X_DEFAULT_WLAN_FW_NAME "nxp/pcienw62x_wlan.bin"
|
||||
#endif /* PCIE8997 */
|
||||
|
||||
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIENW62X)
|
||||
#define PCIE_NUM_MSIX_VECTORS 32
|
||||
#else
|
||||
#define PCIE_NUM_MSIX_VECTORS 4
|
||||
|
|
|
@ -1792,6 +1792,145 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Get network monitor configurations
|
||||
*
|
||||
* @param priv A pointer to moal_private structure
|
||||
* @param wrq A pointer to iwreq structure
|
||||
*
|
||||
* @return 0 --success, otherwise fail
|
||||
*/
|
||||
static int woal_net_monitor_ioctl(moal_private *priv, struct iwreq *wrq)
|
||||
{
|
||||
int user_data_len = wrq->u.data.length;
|
||||
int data[5] = {0}, copy_len;
|
||||
int ret = 0;
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_misc_cfg *misc = NULL;
|
||||
mlan_ds_misc_net_monitor *net_mon = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
|
||||
ENTER();
|
||||
|
||||
copy_len = MIN(sizeof(data), sizeof(int) * user_data_len);
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
|
||||
if (req == NULL) {
|
||||
LEAVE();
|
||||
return -ENOMEM;
|
||||
}
|
||||
misc = (mlan_ds_misc_cfg *)req->pbuf;
|
||||
net_mon = (mlan_ds_misc_net_monitor *)&misc->param.net_mon;
|
||||
misc->sub_command = MLAN_OID_MISC_NET_MONITOR;
|
||||
req->req_id = MLAN_IOCTL_MISC_CFG;
|
||||
|
||||
if (!user_data_len) {
|
||||
req->action = MLAN_ACT_GET;
|
||||
} else if (user_data_len == 1 || user_data_len == 4 ||
|
||||
user_data_len == 5) {
|
||||
if (copy_from_user(data, wrq->u.data.pointer, copy_len)) {
|
||||
PRINTM(MERROR, "Copy from user failed\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (data[0] != MTRUE && data[0] != MFALSE) {
|
||||
PRINTM(MERROR,
|
||||
"NET_MON: Activity should be enable(=1)/disable(=0)\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
net_mon->enable_net_mon = data[0];
|
||||
if (data[0] == MTRUE) {
|
||||
int i;
|
||||
if (user_data_len != 4 && user_data_len != 5) {
|
||||
PRINTM(MERROR,
|
||||
"NET_MON: Invalid number of args!\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
/* Supported filter flags */
|
||||
if (!data[1] ||
|
||||
data[1] & ~(MLAN_NETMON_DATA_FRAME |
|
||||
MLAN_NETMON_MANAGEMENT_FRAME |
|
||||
MLAN_NETMON_CONTROL_FRAME)) {
|
||||
PRINTM(MERROR,
|
||||
"NET_MON: Invalid filter flag\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
/* Supported bands */
|
||||
for (i = 0; i < (int)sizeof(SupportedInfraBand); i++)
|
||||
if (data[2] == SupportedInfraBand[i])
|
||||
break;
|
||||
if (i == sizeof(SupportedInfraBand)) {
|
||||
PRINTM(MERROR, "NET_MON: Invalid band\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
/* Supported channel */
|
||||
if (data[3] < 1 || data[3] > MLAN_MAX_CHANNEL) {
|
||||
PRINTM(MERROR,
|
||||
"NET_MON: Invalid channel number\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
if (user_data_len == 5) {
|
||||
/* Secondary channel offset */
|
||||
if (!(data[2] & (BAND_GN | BAND_AN))) {
|
||||
PRINTM(MERROR,
|
||||
"No 11n in band, can not set "
|
||||
"secondary channel offset\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
if ((data[4] != CHANNEL_BW_20MHZ) &&
|
||||
(data[4] != CHANNEL_BW_40MHZ_ABOVE) &&
|
||||
(data[4] != CHANNEL_BW_40MHZ_BELOW) &&
|
||||
(data[4] != CHANNEL_BW_80MHZ)) {
|
||||
PRINTM(MERROR,
|
||||
"Invalid secondary channel bandwidth, "
|
||||
"only allowed 0, 1, 3 or 4\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
net_mon->chan_bandwidth = data[4];
|
||||
}
|
||||
net_mon->filter_flag = data[1];
|
||||
net_mon->band = data[2];
|
||||
net_mon->channel = data[3];
|
||||
}
|
||||
req->action = MLAN_ACT_SET;
|
||||
} else {
|
||||
PRINTM(MERROR, "NET_MON: Invalid number of args!\n");
|
||||
ret = -EINVAL;
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
data[0] = net_mon->enable_net_mon;
|
||||
data[1] = net_mon->filter_flag;
|
||||
data[2] = net_mon->band;
|
||||
data[3] = net_mon->channel;
|
||||
data[4] = net_mon->chan_bandwidth;
|
||||
wrq->u.data.length = 5;
|
||||
if (copy_to_user(wrq->u.data.pointer, data,
|
||||
sizeof(int) * wrq->u.data.length)) {
|
||||
PRINTM(MERROR, "Copy to user failed\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get LOG
|
||||
*
|
||||
|
@ -4587,17 +4726,26 @@ done:
|
|||
static int woal_set_user_scan_ext_ioctl(moal_private *priv, struct iwreq *wrq)
|
||||
{
|
||||
int ret = 0;
|
||||
wlan_user_scan_cfg scan_req;
|
||||
wlan_user_scan_cfg *scan_req;
|
||||
ENTER();
|
||||
memset(&scan_req, 0x00, sizeof(scan_req));
|
||||
if (copy_from_user(&scan_req, wrq->u.data.pointer,
|
||||
MIN(wrq->u.data.length, sizeof(scan_req)))) {
|
||||
scan_req = (wlan_user_scan_cfg *)kmalloc(sizeof(wlan_user_scan_cfg),
|
||||
GFP_KERNEL);
|
||||
if (!scan_req) {
|
||||
PRINTM(MERROR, "Malloc buffer failed\n");
|
||||
LEAVE();
|
||||
return -ENOMEM;
|
||||
}
|
||||
memset(scan_req, 0x00, sizeof(wlan_user_scan_cfg));
|
||||
if (copy_from_user(scan_req, wrq->u.data.pointer,
|
||||
MIN(wrq->u.data.length,
|
||||
sizeof(wlan_user_scan_cfg)))) {
|
||||
PRINTM(MINFO, "Copy from user failed\n");
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
if (MLAN_STATUS_FAILURE == woal_do_scan(priv, &scan_req))
|
||||
if (MLAN_STATUS_FAILURE == woal_do_scan(priv, scan_req))
|
||||
ret = -EFAULT;
|
||||
kfree(scan_req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
@ -6578,6 +6726,9 @@ int woal_wext_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd)
|
|||
case WOAL_SLEEP_PARAMS:
|
||||
ret = woal_sleep_params_ioctl(priv, wrq);
|
||||
break;
|
||||
case WOAL_NET_MONITOR:
|
||||
ret = woal_net_monitor_ioctl(priv, wrq);
|
||||
break;
|
||||
case WOAL_DFS_TESTING:
|
||||
ret = woal_dfs_testing(priv, wrq);
|
||||
break;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* @brief This file contains definition for extended private IOCTL call.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -130,6 +130,8 @@ Change log:
|
|||
#define WOAL_ADDBA_REJECT 27
|
||||
/** Private command ID to set/get sleep parameters */
|
||||
#define WOAL_SLEEP_PARAMS 28
|
||||
/** Private command ID to set/get network monitor */
|
||||
#define WOAL_NET_MONITOR 30
|
||||
/** Private command ID to set/get TX BF capabilities */
|
||||
#define WOAL_TX_BF_CAP 31
|
||||
/** Private command ID to set/get dfs testing settings */
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains functions for proc file.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* driver.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -139,15 +139,26 @@ Change log:
|
|||
#define SD9097_WLAN_V1_FW_NAME "nxp/sdiw620_wlan_v1.bin"
|
||||
#endif /* SD9097 */
|
||||
|
||||
#ifdef SDNW62X
|
||||
#define SDNW62X_DEFAULT_COMBO_FW_NAME "nxp/sdsd_nw62x.bin"
|
||||
#define SDUARTNW62X_COMBO_FW_NAME "nxp/sduart_nw62x.bin"
|
||||
#define SDSDNW62X_COMBO_FW_NAME "sdsd_nw62x.bin"
|
||||
#define SDNW62X_DEFAULT_WLAN_FW_NAME "nxp/sd_nw62x.bin"
|
||||
#endif /* SDNW62X */
|
||||
|
||||
#ifdef SD9177
|
||||
#define SD9177_A0 0x01
|
||||
#define SD9177_A0 0x00
|
||||
#define SD9177_A1 0x01
|
||||
#define SD9177_DEFAULT_COMBO_FW_NAME "nxp/sdsd_nw61x.bin"
|
||||
#define SD9177_DEFAULT_COMBO_V1_FW_NAME "nxp/sduart_nw61x_v1.bin"
|
||||
#define SDUART9177_DEFAULT_COMBO_FW_NAME "nxp/sduart_nw61x.bin"
|
||||
#define SDSD9177_DEFAULT_COMBO_FW_NAME "sdsd_nw61x.bin"
|
||||
#define SD9177_DEFAULT_WLAN_FW_NAME "nxp/sd_w61x.bin"
|
||||
/** Device ID for SD9177 */
|
||||
#define SD_DEVICE_ID_9177 (0x0205)
|
||||
#define SDUART9177_DEFAULT_COMBO_V1_FW_NAME "nxp/sduart_nw61x_v1.bin"
|
||||
#define SDSD9177_DEFAULT_COMBO_V1_FW_NAME "sdsd_nw61x_v1.bin"
|
||||
#define SD9177_DEFAULT_WLAN_V1_FW_NAME "nxp/sd_w61x_v1.bin"
|
||||
#endif /* SD9177 */
|
||||
|
||||
/********************************************************
|
||||
Global Functions
|
||||
********************************************************/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* related functions.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -31,9 +31,7 @@ Change log:
|
|||
#include "moal_sdio.h"
|
||||
|
||||
/** define nxp vendor id */
|
||||
#ifdef SD9177
|
||||
#define NXP_VENDOR_ID 0x0471
|
||||
#endif
|
||||
#define MRVL_VENDOR_ID 0x02df
|
||||
|
||||
/********************************************************
|
||||
|
@ -83,6 +81,14 @@ static moal_if_ops sdiommc_ops;
|
|||
/** Device ID for SD9097 */
|
||||
#define SD_DEVICE_ID_9097 (0x9155)
|
||||
#endif
|
||||
#ifdef SD9177
|
||||
/** Device ID for SD9177 */
|
||||
#define SD_DEVICE_ID_9177 (0x0205)
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
/** Device ID for SDNW62X */
|
||||
#define SD_DEVICE_ID_NW62X (0x020C)
|
||||
#endif
|
||||
|
||||
/** WLAN IDs */
|
||||
static const struct sdio_device_id wlan_ids[] = {
|
||||
|
@ -116,6 +122,9 @@ static const struct sdio_device_id wlan_ids[] = {
|
|||
#endif
|
||||
#ifdef SD9177
|
||||
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_9177)},
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_NW62X)},
|
||||
#endif
|
||||
{},
|
||||
};
|
||||
|
@ -381,6 +390,20 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
(strlen(INTF_CARDTYPE) + strlen(KERN_VERSION)));
|
||||
}
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
if (cardp_sd->func->device == SD_DEVICE_ID_NW62X) {
|
||||
card_type = CARD_TYPE_SDNW62X;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_SDNW62X,
|
||||
strlen(CARD_SDNW62X), strlen(driver_version));
|
||||
moal_memcpy_ext(
|
||||
NULL,
|
||||
driver_version + strlen(INTF_CARDTYPE) +
|
||||
strlen(KERN_VERSION),
|
||||
V17, strlen(V17),
|
||||
strlen(driver_version) -
|
||||
(strlen(INTF_CARDTYPE) + strlen(KERN_VERSION)));
|
||||
}
|
||||
#endif
|
||||
#ifdef SD9097
|
||||
if (cardp_sd->func->device == SD_DEVICE_ID_9097) {
|
||||
card_type = CARD_TYPE_SD9097;
|
||||
|
@ -1334,7 +1357,8 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
|
|||
t_u32 rev_id_reg = handle->card_info->rev_id_reg;
|
||||
|
||||
#if defined(SD8987) || defined(SD8997) || defined(SD9098) || \
|
||||
defined(SD9097) || defined(SD8978) || defined(SD9177)
|
||||
defined(SD9097) || defined(SDNW62X) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
t_u32 magic_reg = handle->card_info->magic_reg;
|
||||
t_u32 magic = 0;
|
||||
t_u32 host_strap_reg = handle->card_info->host_strap_reg;
|
||||
|
@ -1354,7 +1378,8 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
|
|||
PRINTM(MCMND, "revision_id=0x%x\n", revision_id);
|
||||
|
||||
#if defined(SD8987) || defined(SD8997) || defined(SD9098) || \
|
||||
defined(SD9097) || defined(SD8978) || defined(SD9177)
|
||||
defined(SD9097) || defined(SDNW62X) || defined(SD8978) || \
|
||||
defined(SD9177)
|
||||
/** Revision ID register */
|
||||
woal_sdiommc_read_reg(handle, magic_reg, &magic);
|
||||
/** Revision ID register */
|
||||
|
@ -1502,6 +1527,19 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef SDNW62X
|
||||
if (IS_SDNW62X(handle->card_type)) {
|
||||
if (magic == CHIP_MAGIC_VALUE) {
|
||||
if (strap == CARD_TYPE_SD_UART)
|
||||
strcpy(handle->card_info->fw_name,
|
||||
SDUARTNW62X_COMBO_FW_NAME);
|
||||
else
|
||||
strcpy(handle->card_info->fw_name,
|
||||
SDSDNW62X_COMBO_FW_NAME);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SD9177
|
||||
if (IS_SD9177(handle->card_type)) {
|
||||
switch (revision_id) {
|
||||
|
@ -1517,6 +1555,18 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
|
|||
strcpy(handle->card_info->fw_name_wlan,
|
||||
SD9177_DEFAULT_WLAN_FW_NAME);
|
||||
break;
|
||||
case SD9177_A1:
|
||||
if (magic == CHIP_MAGIC_VALUE) {
|
||||
if (strap == CARD_TYPE_SD_UART)
|
||||
strcpy(handle->card_info->fw_name,
|
||||
SDUART9177_DEFAULT_COMBO_V1_FW_NAME);
|
||||
else
|
||||
strcpy(handle->card_info->fw_name,
|
||||
SDSD9177_DEFAULT_COMBO_V1_FW_NAME);
|
||||
}
|
||||
strcpy(handle->card_info->fw_name_wlan,
|
||||
SD9177_DEFAULT_WLAN_V1_FW_NAME);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the callback functions registered to MLAN
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -862,9 +862,9 @@ mlan_status moal_get_vdll_data(t_void *pmoal, t_u32 len, t_u8 *pbuf)
|
|||
mlan_status moal_get_hw_spec_complete(t_void *pmoal, mlan_status status,
|
||||
mlan_hw_info *phw, pmlan_bss_tbl ptbl)
|
||||
{
|
||||
#if defined(PCIE9098)
|
||||
moal_handle *handle = (moal_handle *)pmoal;
|
||||
#endif
|
||||
int i;
|
||||
t_u32 drv_mode = handle->params.drv_mode;
|
||||
|
||||
ENTER();
|
||||
if (status == MLAN_STATUS_SUCCESS) {
|
||||
|
@ -890,6 +890,38 @@ mlan_status moal_get_hw_spec_complete(t_void *pmoal, mlan_status status,
|
|||
MLAN_MAX_VER_STR_LEN - 1);
|
||||
}
|
||||
#endif
|
||||
/** FW should only enable DFS on one mac */
|
||||
if (!(phw->fw_cap & FW_CAPINFO_ZERO_DFS))
|
||||
handle->params.drv_mode &= ~DRV_MODE_DFS;
|
||||
|
||||
if (!(phw->fw_cap & FW_CAPINFO_80211BGA))
|
||||
handle->params.drv_mode &= ~DRV_MODE_WLAN;
|
||||
if (!handle->params.drv_mode ||
|
||||
MLAN_STATUS_SUCCESS !=
|
||||
woal_update_drv_tbl(handle,
|
||||
handle->params.drv_mode)) {
|
||||
PRINTM(MERROR,
|
||||
"Get_hw_spec_complete: Fail to update drv_tbl\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
memset(ptbl, 0, sizeof(mlan_bss_tbl));
|
||||
for (i = 0; i < handle->drv_mode.intf_num; i++) {
|
||||
ptbl->bss_attr[i].bss_type =
|
||||
handle->drv_mode.bss_attr[i].bss_type;
|
||||
ptbl->bss_attr[i].frame_type =
|
||||
handle->drv_mode.bss_attr[i].frame_type;
|
||||
ptbl->bss_attr[i].active =
|
||||
handle->drv_mode.bss_attr[i].active;
|
||||
ptbl->bss_attr[i].bss_priority =
|
||||
handle->drv_mode.bss_attr[i].bss_priority;
|
||||
ptbl->bss_attr[i].bss_num =
|
||||
handle->drv_mode.bss_attr[i].bss_num;
|
||||
ptbl->bss_attr[i].bss_virtual =
|
||||
handle->drv_mode.bss_attr[i].bss_virtual;
|
||||
}
|
||||
PRINTM(MCMND, "org_drv_mode=0x%x drv_mode=0x%x\n", drv_mode,
|
||||
handle->params.drv_mode);
|
||||
}
|
||||
LEAVE();
|
||||
return MLAN_STATUS_SUCCESS;
|
||||
|
@ -1325,6 +1357,268 @@ mlan_status moal_read_reg(t_void *pmoal, t_u32 reg, t_u32 *data)
|
|||
|
||||
#endif /* SDIO || PCIE */
|
||||
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
/**
|
||||
* @brief This function uploads the packet to the network stack monitor
|
||||
* interface
|
||||
*
|
||||
* @param handle Pointer to the MOAL context
|
||||
* @param pmbuf Pointer to mlan_buffer
|
||||
*
|
||||
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING/MLAN_STATUS_FAILURE
|
||||
*/
|
||||
static mlan_status moal_recv_packet_to_mon_if(moal_handle *handle,
|
||||
pmlan_buffer pmbuf)
|
||||
{
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
struct sk_buff *skb = NULL;
|
||||
struct radiotap_header *rth = NULL;
|
||||
radiotap_info rt_info = {};
|
||||
t_u8 format = 0;
|
||||
t_u8 bw = 0;
|
||||
t_u8 gi = 0;
|
||||
t_u8 ldpc = 0;
|
||||
t_u8 chan_num;
|
||||
t_u8 band = 0;
|
||||
struct ieee80211_hdr *dot11_hdr = NULL;
|
||||
t_u8 *payload = NULL;
|
||||
t_u32 vht_sig1 = 0;
|
||||
t_u32 vht_sig2 = 0;
|
||||
ENTER();
|
||||
if (!pmbuf->pdesc) {
|
||||
LEAVE();
|
||||
return status;
|
||||
}
|
||||
|
||||
skb = (struct sk_buff *)pmbuf->pdesc;
|
||||
|
||||
if ((handle->mon_if) && netif_running(handle->mon_if->mon_ndev)) {
|
||||
if (handle->mon_if->radiotap_enabled) {
|
||||
if (skb_headroom(skb) < sizeof(*rth)) {
|
||||
PRINTM(MERROR,
|
||||
"%s No space to add Radio TAP header\n",
|
||||
__func__);
|
||||
status = MLAN_STATUS_FAILURE;
|
||||
handle->mon_if->stats.rx_dropped++;
|
||||
goto done;
|
||||
}
|
||||
dot11_hdr =
|
||||
(struct ieee80211_hdr *)(pmbuf->pbuf +
|
||||
pmbuf->data_offset);
|
||||
moal_memcpy_ext(handle, &rt_info,
|
||||
pmbuf->pbuf + pmbuf->data_offset -
|
||||
sizeof(rt_info),
|
||||
sizeof(rt_info), sizeof(rt_info));
|
||||
ldpc = (rt_info.rate_info.rate_info & 0x20) >> 5;
|
||||
format = (rt_info.rate_info.rate_info & 0x18) >> 3;
|
||||
bw = (rt_info.rate_info.rate_info & 0x06) >> 1;
|
||||
gi = rt_info.rate_info.rate_info & 0x01;
|
||||
skb_push(skb, sizeof(*rth));
|
||||
rth = (struct radiotap_header *)skb->data;
|
||||
memset(skb->data, 0, sizeof(*rth));
|
||||
rth->hdr.it_version = PKTHDR_RADIOTAP_VERSION;
|
||||
rth->hdr.it_pad = 0;
|
||||
rth->hdr.it_len = cpu_to_le16(sizeof(*rth));
|
||||
rth->hdr.it_present = cpu_to_le32(
|
||||
(1 << IEEE80211_RADIOTAP_TSFT) |
|
||||
(1 << IEEE80211_RADIOTAP_FLAGS) |
|
||||
(1 << IEEE80211_RADIOTAP_CHANNEL) |
|
||||
(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |
|
||||
(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |
|
||||
(1 << IEEE80211_RADIOTAP_ANTENNA));
|
||||
/** Timstamp */
|
||||
rth->body.timestamp = woal_cpu_to_le64(jiffies);
|
||||
/** Flags */
|
||||
rth->body.flags = (rt_info.extra_info.flags &
|
||||
~(RADIOTAP_FLAGS_USE_SGI_HT |
|
||||
RADIOTAP_FLAGS_WITH_FRAGMENT |
|
||||
RADIOTAP_FLAGS_WEP_ENCRYPTION |
|
||||
RADIOTAP_FLAGS_FAILED_FCS_CHECK));
|
||||
/** reverse fail fcs, 1 means pass FCS in FW, but means
|
||||
* fail FCS in radiotap */
|
||||
rth->body.flags |= (~rt_info.extra_info.flags) &
|
||||
RADIOTAP_FLAGS_FAILED_FCS_CHECK;
|
||||
if ((format == MLAN_RATE_FORMAT_HT) && (gi == 1))
|
||||
rth->body.flags |= RADIOTAP_FLAGS_USE_SGI_HT;
|
||||
if (ieee80211_is_mgmt(dot11_hdr->frame_control) ||
|
||||
ieee80211_is_data(dot11_hdr->frame_control)) {
|
||||
if ((ieee80211_has_morefrags(
|
||||
dot11_hdr->frame_control)) ||
|
||||
(!ieee80211_is_first_frag(
|
||||
dot11_hdr->seq_ctrl))) {
|
||||
rth->body.flags |=
|
||||
RADIOTAP_FLAGS_WITH_FRAGMENT;
|
||||
}
|
||||
}
|
||||
if (ieee80211_is_data(dot11_hdr->frame_control) &&
|
||||
ieee80211_has_protected(dot11_hdr->frame_control)) {
|
||||
payload = (t_u8 *)dot11_hdr +
|
||||
ieee80211_hdrlen(
|
||||
dot11_hdr->frame_control);
|
||||
if (!(*(payload + 3) & 0x20)) /** ExtIV bit
|
||||
shall be 0 for
|
||||
WEP frame */
|
||||
rth->body.flags |=
|
||||
RADIOTAP_FLAGS_WEP_ENCRYPTION;
|
||||
}
|
||||
/** Rate, t_u8 only apply for LG mode */
|
||||
if (format == MLAN_RATE_FORMAT_LG) {
|
||||
rth->hdr.it_present |= cpu_to_le32(
|
||||
1 << IEEE80211_RADIOTAP_RATE);
|
||||
rth->body.rate = rt_info.rate_info.bitrate;
|
||||
}
|
||||
/** Channel */
|
||||
rth->body.channel.flags = 0;
|
||||
if (rt_info.chan_num)
|
||||
chan_num = rt_info.chan_num;
|
||||
else
|
||||
chan_num =
|
||||
handle->mon_if->band_chan_cfg.channel;
|
||||
band = (chan_num <= 14) ? IEEE80211_BAND_2GHZ :
|
||||
IEEE80211_BAND_5GHZ;
|
||||
rth->body.channel.frequency = woal_cpu_to_le16(
|
||||
ieee80211_channel_to_frequency(chan_num, band));
|
||||
rth->body.channel.flags |=
|
||||
woal_cpu_to_le16((band == IEEE80211_BAND_2GHZ) ?
|
||||
CHANNEL_FLAGS_2GHZ :
|
||||
CHANNEL_FLAGS_5GHZ);
|
||||
if (rth->body.channel.flags &
|
||||
woal_cpu_to_le16(CHANNEL_FLAGS_2GHZ))
|
||||
rth->body.channel.flags |= woal_cpu_to_le16(
|
||||
CHANNEL_FLAGS_DYNAMIC_CCK_OFDM);
|
||||
else
|
||||
rth->body.channel.flags |=
|
||||
woal_cpu_to_le16(CHANNEL_FLAGS_OFDM);
|
||||
if (handle->mon_if->chandef.chan &&
|
||||
(handle->mon_if->chandef.chan->flags &
|
||||
(IEEE80211_CHAN_PASSIVE_SCAN |
|
||||
IEEE80211_CHAN_RADAR)))
|
||||
rth->body.channel.flags |= woal_cpu_to_le16(
|
||||
CHANNEL_FLAGS_ONLY_PASSIVSCAN_ALLOW);
|
||||
/** Antenna */
|
||||
rth->body.antenna_signal = -(rt_info.nf - rt_info.snr);
|
||||
rth->body.antenna_noise = -rt_info.nf;
|
||||
rth->body.antenna = rt_info.antenna;
|
||||
/** MCS */
|
||||
if (format == MLAN_RATE_FORMAT_HT) {
|
||||
rth->hdr.it_present |= cpu_to_le32(
|
||||
1 << IEEE80211_RADIOTAP_MCS);
|
||||
rth->body.u.mcs.known =
|
||||
rt_info.extra_info.mcs_known;
|
||||
rth->body.u.mcs.flags =
|
||||
rt_info.extra_info.mcs_flags;
|
||||
/** MCS mcs */
|
||||
rth->body.u.mcs.known |=
|
||||
MCS_KNOWN_MCS_INDEX_KNOWN;
|
||||
rth->body.u.mcs.mcs =
|
||||
rt_info.rate_info.mcs_index;
|
||||
/** MCS bw */
|
||||
rth->body.u.mcs.known |= MCS_KNOWN_BANDWIDTH;
|
||||
rth->body.u.mcs.flags &= ~(0x03); /** Clear,
|
||||
20MHz as
|
||||
default */
|
||||
if (bw == 1)
|
||||
rth->body.u.mcs.flags |= RX_BW_40;
|
||||
/** MCS gi */
|
||||
rth->body.u.mcs.known |=
|
||||
MCS_KNOWN_GUARD_INTERVAL;
|
||||
rth->body.u.mcs.flags &= ~(1 << 2);
|
||||
if (gi)
|
||||
rth->body.u.mcs.flags |= gi << 2;
|
||||
/** MCS FEC */
|
||||
rth->body.u.mcs.known |= MCS_KNOWN_FEC_TYPE;
|
||||
rth->body.u.mcs.flags &= ~(1 << 4);
|
||||
if (ldpc)
|
||||
rth->body.u.mcs.flags |= ldpc << 4;
|
||||
}
|
||||
/** VHT */
|
||||
if (format == MLAN_RATE_FORMAT_VHT) {
|
||||
vht_sig1 = rt_info.extra_info.vht_sig1;
|
||||
vht_sig2 = rt_info.extra_info.vht_sig2;
|
||||
/** Present Flag */
|
||||
rth->hdr.it_present |= cpu_to_le32(
|
||||
1 << IEEE80211_RADIOTAP_VHT);
|
||||
/** STBC */
|
||||
rth->body.u.vht.known |=
|
||||
woal_cpu_to_le16(VHT_KNOWN_STBC);
|
||||
if (vht_sig1 & MBIT(3))
|
||||
rth->body.u.vht.flags |= VHT_FLAG_STBC;
|
||||
/** TXOP_PS_NA */
|
||||
/** TODO: Not support now */
|
||||
/** GI */
|
||||
rth->body.u.vht.known |=
|
||||
woal_cpu_to_le16(VHT_KNOWN_GI);
|
||||
if (vht_sig2 & MBIT(0))
|
||||
rth->body.u.vht.flags |= VHT_FLAG_SGI;
|
||||
/** SGI NSYM DIS */
|
||||
rth->body.u.vht.known |= woal_cpu_to_le16(
|
||||
VHT_KNOWN_SGI_NSYM_DIS);
|
||||
if (vht_sig2 & MBIT(1))
|
||||
rth->body.u.vht.flags |=
|
||||
VHT_FLAG_SGI_NSYM_M10_9;
|
||||
/** LDPC_EXTRA_OFDM_SYM */
|
||||
/** TODO: Not support now */
|
||||
/** BEAMFORMED */
|
||||
rth->body.u.vht.known |=
|
||||
woal_cpu_to_le16(VHT_KNOWN_BEAMFORMED);
|
||||
if (vht_sig2 & MBIT(8))
|
||||
rth->body.u.vht.flags |=
|
||||
VHT_FLAG_BEAMFORMED;
|
||||
/** BANDWIDTH */
|
||||
rth->body.u.vht.known |=
|
||||
woal_cpu_to_le16(VHT_KNOWN_BANDWIDTH);
|
||||
if (bw == 1)
|
||||
rth->body.u.vht.bandwidth = RX_BW_40;
|
||||
else if (bw == 2)
|
||||
rth->body.u.vht.bandwidth = RX_BW_80;
|
||||
/** GROUP_ID */
|
||||
rth->body.u.vht.known |=
|
||||
woal_cpu_to_le16(VHT_KNOWN_GROUP_ID);
|
||||
rth->body.u.vht.group_id =
|
||||
(vht_sig1 & (0x3F0)) >> 4;
|
||||
/** PARTIAL_AID */
|
||||
/** TODO: Not support now */
|
||||
/** mcs_nss */
|
||||
rth->body.u.vht.mcs_nss[0] =
|
||||
(vht_sig2 & (0xF0)) >> 4;
|
||||
rth->body.u.vht.mcs_nss[0] |=
|
||||
(vht_sig1 & (0x1C00)) >> (10 - 4);
|
||||
/** coding */
|
||||
if (vht_sig2 & MBIT(2))
|
||||
rth->body.u.vht.coding |=
|
||||
VHT_CODING_LDPC_USER0;
|
||||
}
|
||||
}
|
||||
skb_set_mac_header(skb, 0);
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
skb->pkt_type = PACKET_OTHERHOST;
|
||||
skb->protocol = htons(ETH_P_802_2);
|
||||
memset(skb->cb, 0, sizeof(skb->cb));
|
||||
skb->dev = handle->mon_if->mon_ndev;
|
||||
|
||||
handle->mon_if->stats.rx_bytes += skb->len;
|
||||
handle->mon_if->stats.rx_packets++;
|
||||
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
|
||||
netif_rx(skb);
|
||||
#else
|
||||
if (in_interrupt())
|
||||
netif_rx(skb);
|
||||
else
|
||||
netif_rx_ni(skb);
|
||||
#endif
|
||||
status = MLAN_STATUS_PENDING;
|
||||
}
|
||||
|
||||
done:
|
||||
|
||||
LEAVE();
|
||||
return status;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function uploads amsdu packet to the network stack
|
||||
*
|
||||
|
@ -1552,6 +1846,18 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
|
|||
goto done;
|
||||
}
|
||||
skb_put(skb, pmbuf->data_len);
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (pmbuf->flags & MLAN_BUF_FLAG_NET_MONITOR) {
|
||||
status = moal_recv_packet_to_mon_if(
|
||||
pmoal, pmbuf);
|
||||
if (status == MLAN_STATUS_PENDING)
|
||||
atomic_dec(
|
||||
&handle->mbufalloc_count);
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
pmbuf->pdesc = NULL;
|
||||
pmbuf->pbuf = NULL;
|
||||
pmbuf->data_offset = pmbuf->data_len = 0;
|
||||
|
@ -1562,6 +1868,20 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
|
|||
} else {
|
||||
PRINTM(MERROR, "%s without skb attach!!!\n",
|
||||
__func__);
|
||||
#if defined(STA_CFG80211) && defined(UAP_CFG80211)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
/** drop the packet without skb in
|
||||
* monitor mode */
|
||||
if (pmbuf->flags & MLAN_BUF_FLAG_NET_MONITOR) {
|
||||
PRINTM(MINFO,
|
||||
"%s Drop packet without skb\n",
|
||||
__func__);
|
||||
status = MLAN_STATUS_FAILURE;
|
||||
priv->stats.rx_dropped++;
|
||||
goto done;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
skb = dev_alloc_skb(pmbuf->data_len +
|
||||
MLAN_NET_IP_ALIGN);
|
||||
if (!skb) {
|
||||
|
@ -1666,6 +1986,7 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
|
|||
skb->data, skb->len);
|
||||
#endif
|
||||
#endif
|
||||
#ifdef ANDROID_KERNEL
|
||||
if (handle->params.wakelock_timeout) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
__pm_wakeup_event(
|
||||
|
@ -1679,6 +2000,7 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
|
|||
.wakelock_timeout));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
if (priv->rx_protocols.protocol_num) {
|
||||
for (j = 0; j < priv->rx_protocols.protocol_num;
|
||||
j++) {
|
||||
|
@ -1834,7 +2156,7 @@ int woal_check_media_connected(t_void *pmoal)
|
|||
* @param pmoal Pointer to the MOAL context
|
||||
*
|
||||
*/
|
||||
static void moal_connection_status_check_pmqos(t_void *pmoal)
|
||||
void moal_connection_status_check_pmqos(t_void *pmoal)
|
||||
{
|
||||
moal_handle *pmhandle = (moal_handle *)pmoal;
|
||||
if ((woal_check_media_connected(pmoal) == MTRUE)) {
|
||||
|
@ -1919,11 +2241,27 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
moal_handle *handle = (moal_handle *)pmoal;
|
||||
moal_handle *ref_handle = NULL;
|
||||
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
t_u8 enable = 1;
|
||||
#endif
|
||||
t_u8 *req_ie = NULL;
|
||||
t_u16 ie_len = 0;
|
||||
apinfo *pinfo = NULL, *req_tlv = NULL;
|
||||
MrvlIEtypesHeader_t *tlv = NULL;
|
||||
t_u16 tlv_type = 0, tlv_len = 0, tlv_buf_left = 0;
|
||||
#endif
|
||||
#ifdef STA_CFG80211
|
||||
t_u8 hw_test;
|
||||
#endif
|
||||
int cfg80211_wext;
|
||||
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
struct cfg80211_roam_info *roam_info = NULL;
|
||||
#endif
|
||||
#endif
|
||||
t_u16 csi_len;
|
||||
#ifdef STA_CFG80211
|
||||
t_u8 channel_status;
|
||||
moal_private *remain_priv = NULL;
|
||||
|
@ -1932,6 +2270,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
chan_band_info *pchan_info = NULL;
|
||||
#endif
|
||||
t_u8 radar_detected;
|
||||
t_u8 event_buf[64];
|
||||
t_u8 radar_chan;
|
||||
#ifdef UAP_CFG80211
|
||||
moal_private *cfg_priv = NULL;
|
||||
#endif
|
||||
|
||||
t_u8 auto_fw_dump = MFALSE;
|
||||
ENTER();
|
||||
|
@ -2541,6 +2884,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
#endif
|
||||
) {
|
||||
priv->roaming_required = MTRUE;
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
__pm_wakeup_event(&priv->phandle->ws,
|
||||
ROAMING_WAKE_LOCK_TIMEOUT);
|
||||
|
@ -2550,6 +2894,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
msecs_to_jiffies(
|
||||
ROAMING_WAKE_LOCK_TIMEOUT));
|
||||
#endif
|
||||
#endif
|
||||
#ifdef REASSOCIATION
|
||||
wake_up_interruptible(
|
||||
&priv->phandle->reassoc_thread.wait_q);
|
||||
|
@ -2603,11 +2948,48 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
|
||||
case MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY:
|
||||
radar_detected = pmevent->event_buf[0];
|
||||
#ifdef UAP_SUPPORT
|
||||
if (priv->chan_rpt_req.chanNum && priv->chan_rpt_pending) {
|
||||
radar_chan = pmevent->event_buf[1];
|
||||
if (radar_detected) {
|
||||
snprintf(event_buf, sizeof(event_buf) - 1,
|
||||
"%s %d", CUS_EVT_RADAR_DETECTED,
|
||||
radar_chan);
|
||||
woal_broadcast_event(priv, event_buf,
|
||||
strlen(event_buf));
|
||||
} else {
|
||||
snprintf(event_buf, sizeof(event_buf) - 1,
|
||||
"%s %d", CUS_EVT_CAC_FINISHED,
|
||||
priv->chan_rpt_req.chanNum);
|
||||
woal_broadcast_event(priv, event_buf,
|
||||
strlen(event_buf));
|
||||
}
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS)
|
||||
woal_chan_event(priv, WOAL_EVENT_CHAN_RPT,
|
||||
priv->chan_rpt_req.chanNum,
|
||||
radar_detected);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
if (!IS_STA_OR_UAP_CFG80211(cfg80211_wext))
|
||||
break;
|
||||
if (priv->chan_rpt_req.chanNum && priv->chan_rpt_pending) {
|
||||
priv->chan_rpt_pending = MFALSE;
|
||||
cfg_priv = woal_get_priv_with_wdev(priv->phandle);
|
||||
if (cfg_priv) {
|
||||
if (radar_detected)
|
||||
woal_update_channel_dfs_state(
|
||||
priv->chan_rpt_req.chanNum,
|
||||
DFS_UNAVAILABLE);
|
||||
else
|
||||
woal_update_channel_dfs_state(
|
||||
priv->chan_rpt_req.chanNum,
|
||||
DFS_AVAILABLE);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (priv->phandle->is_cac_timer_set) {
|
||||
PRINTM(MEVENT, "%s radar found when CAC \n",
|
||||
|
@ -2650,11 +3032,36 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
#endif /* UAP_CFG80211 */
|
||||
break;
|
||||
case MLAN_EVENT_ID_FW_RADAR_DETECTED:
|
||||
radar_chan = pmevent->event_buf[0];
|
||||
snprintf(event_buf, sizeof(event_buf) - 1, "%s %d",
|
||||
CUS_EVT_RADAR_DETECTED, radar_chan);
|
||||
woal_broadcast_event(priv, event_buf, strlen(event_buf));
|
||||
PRINTM(MEVENT, "Radar detected on channel %d\n", radar_chan);
|
||||
if ((priv->target_chan && priv->bss_started &&
|
||||
(priv->target_chan != radar_chan)) ||
|
||||
priv->backup_chan) {
|
||||
PRINTM(MEVENT, "Move to target or backup chan %d %d\n",
|
||||
priv->target_chan, priv->backup_chan);
|
||||
woal_move_to_next_channel(priv);
|
||||
priv->target_chan = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
|
||||
if (!IS_STA_OR_UAP_CFG80211(cfg80211_wext))
|
||||
break;
|
||||
cfg_priv = woal_get_priv_with_wdev(priv->phandle);
|
||||
if (cfg_priv) {
|
||||
woal_update_channel_dfs_state(radar_chan,
|
||||
DFS_UNAVAILABLE);
|
||||
if (priv->bss_type == MLAN_BSS_TYPE_DFS) {
|
||||
woal_chan_event(priv, WOAL_EVENT_RADAR,
|
||||
priv->chan_rpt_req.chanNum,
|
||||
MTRUE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (priv->phandle->is_cac_timer_set) {
|
||||
if (priv->bss_index == priv->phandle->cac_bss_index) {
|
||||
PRINTM(MEVENT, "radar detected during CAC \n");
|
||||
|
@ -2910,7 +3317,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
pchan_info->bandcfg.chanBand,
|
||||
pchan_info->bandcfg.chanWidth,
|
||||
pchan_info->bandcfg.chan2Offset);
|
||||
if (priv->uap_host_based)
|
||||
if (priv->uap_host_based &&
|
||||
(priv->channel != pchan_info->channel))
|
||||
woal_channel_switch_event(priv, pchan_info);
|
||||
}
|
||||
#endif
|
||||
|
@ -3494,6 +3902,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
#endif
|
||||
} break;
|
||||
case MLAN_EVENT_ID_DRV_FT_RESPONSE:
|
||||
if (priv->phandle->fw_roam_enable)
|
||||
break;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)
|
||||
#ifdef STA_CFG80211
|
||||
if (IS_STA_CFG80211(cfg80211_wext)) {
|
||||
|
@ -3532,6 +3942,108 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
|
|||
#endif
|
||||
#endif
|
||||
break;
|
||||
case MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT:
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
woal_cfg80211_vendor_event(priv, event_set_key_mgmt_offload,
|
||||
&enable, sizeof(enable));
|
||||
#endif
|
||||
moal_memcpy_ext(priv->phandle, priv->cfg_bssid,
|
||||
pmevent->event_buf, ETH_ALEN, ETH_ALEN);
|
||||
tlv = (MrvlIEtypesHeader_t *)((t_u8 *)pmevent->event_buf +
|
||||
MLAN_MAC_ADDR_LENGTH);
|
||||
tlv_buf_left = pmevent->event_len - MLAN_MAC_ADDR_LENGTH;
|
||||
while (tlv_buf_left >= sizeof(MrvlIEtypesHeader_t)) {
|
||||
tlv_type = woal_le16_to_cpu(tlv->type);
|
||||
tlv_len = woal_le16_to_cpu(tlv->len);
|
||||
|
||||
if (tlv_buf_left <
|
||||
(tlv_len + sizeof(MrvlIEtypesHeader_t))) {
|
||||
PRINTM(MERROR,
|
||||
"Error processing firmware roam success TLVs, bytes left < TLV length\n");
|
||||
break;
|
||||
}
|
||||
|
||||
switch (tlv_type) {
|
||||
case TLV_TYPE_APINFO:
|
||||
pinfo = (apinfo *)tlv;
|
||||
break;
|
||||
case TLV_TYPE_ASSOC_REQ_IE:
|
||||
req_tlv = (apinfo *)tlv;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
tlv_buf_left -= tlv_len + sizeof(MrvlIEtypesHeader_t);
|
||||
tlv = (MrvlIEtypesHeader_t
|
||||
*)((t_u8 *)tlv + tlv_len +
|
||||
sizeof(MrvlIEtypesHeader_t));
|
||||
}
|
||||
if (!pinfo) {
|
||||
PRINTM(MERROR,
|
||||
"ERROR:AP info in roaming event buffer is NULL\n");
|
||||
goto done;
|
||||
}
|
||||
if (req_tlv) {
|
||||
req_ie = req_tlv->rsp_ie;
|
||||
ie_len = req_tlv->header.len;
|
||||
}
|
||||
woal_inform_bss_from_scan_result(priv, NULL, MOAL_NO_WAIT);
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
roam_info =
|
||||
kzalloc(sizeof(struct cfg80211_roam_info), GFP_ATOMIC);
|
||||
if (roam_info) {
|
||||
roam_info->bssid = priv->cfg_bssid;
|
||||
roam_info->req_ie = req_ie;
|
||||
roam_info->req_ie_len = ie_len;
|
||||
roam_info->resp_ie = pinfo->rsp_ie;
|
||||
roam_info->resp_ie_len = pinfo->header.len;
|
||||
cfg80211_roamed(priv->netdev, roam_info, GFP_KERNEL);
|
||||
kfree(roam_info);
|
||||
}
|
||||
#else
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
|
||||
cfg80211_roamed(priv->netdev, NULL, priv->cfg_bssid, req_ie,
|
||||
ie_len, pinfo->rsp_ie, pinfo->header.len,
|
||||
GFP_KERNEL);
|
||||
#else
|
||||
cfg80211_roamed(priv->netdev, priv->cfg_bssid, req_ie, ie_len,
|
||||
pinfo->rsp_ie, pinfo->header.len, GFP_KERNEL);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
woal_roam_ap_info(priv, pmevent->event_buf, pmevent->event_len);
|
||||
#endif
|
||||
#endif
|
||||
PRINTM(MMSG, "FW Roamed to bssid " MACSTR " successfully\n",
|
||||
MAC2STR(pmevent->event_buf));
|
||||
break;
|
||||
case MLAN_EVENT_ID_CSI:
|
||||
DBG_HEXDUMP(MEVT_D, "CSI dump", pmevent->event_buf,
|
||||
pmevent->event_len);
|
||||
#ifdef STA_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (priv->csi_enable)
|
||||
woal_cfg80211_event_csi_dump(priv, pmevent->event_buf,
|
||||
pmevent->event_len);
|
||||
#endif
|
||||
#endif
|
||||
/* Send Netlink event */
|
||||
custom_len = strlen(CUS_EVT_CSI) + sizeof(priv->csi_seq);
|
||||
csi_len = pmevent->event_len;
|
||||
memmove(pmevent->event_buf + custom_len, pmevent->event_buf,
|
||||
csi_len);
|
||||
moal_memcpy_ext(priv->phandle, pmevent->event_buf, CUS_EVT_CSI,
|
||||
strlen(CUS_EVT_CSI), strlen(CUS_EVT_CSI));
|
||||
moal_memcpy_ext(priv->phandle,
|
||||
pmevent->event_buf + strlen(CUS_EVT_CSI),
|
||||
(t_u8 *)(&(priv->csi_seq)),
|
||||
sizeof(priv->csi_seq), sizeof(priv->csi_seq));
|
||||
woal_broadcast_event(priv, pmevent->event_buf,
|
||||
custom_len + csi_len);
|
||||
priv->csi_seq++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* functions defined in moal module
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -122,6 +122,7 @@ void moal_tp_accounting_rx_param(t_void *pmoal, unsigned int type,
|
|||
void moal_amsdu_tp_accounting(t_void *pmoal, t_s32 amsdu_process_delay,
|
||||
t_s32 amsdu_copy_delay);
|
||||
|
||||
void moal_connection_status_check_pmqos(t_void *pmoal);
|
||||
#if defined(PCIE) || defined(SDIO)
|
||||
/* pmqos busfreq add request handler*/
|
||||
void woal_request_busfreq_pmqos_add(t_void *pmhandle);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for STA CFG80211.
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2021 NXP
|
||||
* Copyright 2011-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -53,6 +53,12 @@ static const u32 cfg80211_cipher_suites[] = {
|
|||
#endif
|
||||
};
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
static int woal_cfg80211_set_monitor_channel(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef);
|
||||
#endif
|
||||
#endif
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
static void
|
||||
#else
|
||||
|
@ -395,6 +401,11 @@ static struct cfg80211_ops woal_cfg80211_ops = {
|
|||
.cancel_remain_on_channel = woal_cfg80211_cancel_remain_on_channel,
|
||||
#endif
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
.set_monitor_channel = woal_cfg80211_set_monitor_channel,
|
||||
#endif
|
||||
#endif
|
||||
#ifdef CONFIG_NL80211_TESTMODE
|
||||
.testmode_cmd = woal_testmode_cmd,
|
||||
#endif
|
||||
|
@ -493,7 +504,7 @@ static const struct ieee80211_iface_limit cfg80211_ap_sta_limits[] = {
|
|||
{.max = 4,
|
||||
.types = MBIT(NL80211_IFTYPE_STATION)
|
||||
#ifdef UAP_CFG80211
|
||||
| MBIT(NL80211_IFTYPE_AP)
|
||||
| MBIT(NL80211_IFTYPE_AP) | MBIT(NL80211_IFTYPE_MONITOR)
|
||||
#endif
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION
|
||||
|
@ -557,6 +568,99 @@ static const struct wiphy_coalesce_support coalesce_support = {
|
|||
/********************************************************
|
||||
Local Functions
|
||||
********************************************************/
|
||||
#ifdef UAP_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
static int woal_cfg80211_set_monitor_channel(struct wiphy *wiphy,
|
||||
struct cfg80211_chan_def *chandef)
|
||||
{
|
||||
moal_handle *handle = (moal_handle *)woal_get_wiphy_priv(wiphy);
|
||||
moal_private *priv =
|
||||
(moal_private *)woal_get_priv(handle, MLAN_BSS_ROLE_STA);
|
||||
netmon_band_chan_cfg band_chan_cfg;
|
||||
t_u32 bandwidth = 0;
|
||||
int ret = -EFAULT;
|
||||
|
||||
ENTER();
|
||||
|
||||
if (!priv) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
if (handle->mon_if) {
|
||||
if (cfg80211_chandef_identical(&handle->mon_if->chandef,
|
||||
chandef)) {
|
||||
ret = 0;
|
||||
goto done;
|
||||
}
|
||||
|
||||
memset(&band_chan_cfg, 0x00, sizeof(band_chan_cfg));
|
||||
/* Set channel */
|
||||
band_chan_cfg.channel = ieee80211_frequency_to_channel(
|
||||
chandef->chan->center_freq);
|
||||
/* Set band */
|
||||
if (chandef->chan->band == IEEE80211_BAND_2GHZ)
|
||||
band_chan_cfg.band |= (BAND_B | BAND_G);
|
||||
if (chandef->chan->band == IEEE80211_BAND_5GHZ)
|
||||
band_chan_cfg.band |= BAND_A;
|
||||
if (chandef->chan->band == IEEE80211_BAND_2GHZ)
|
||||
band_chan_cfg.band |= BAND_GN;
|
||||
if (chandef->chan->band == IEEE80211_BAND_5GHZ)
|
||||
band_chan_cfg.band |= BAND_AN;
|
||||
if (chandef->chan->band == IEEE80211_BAND_2GHZ)
|
||||
band_chan_cfg.band |= BAND_GAC;
|
||||
if (chandef->chan->band == IEEE80211_BAND_5GHZ)
|
||||
band_chan_cfg.band |= BAND_AAC;
|
||||
/* Set bandwidth */
|
||||
if (chandef->width == NL80211_CHAN_WIDTH_20)
|
||||
bandwidth = CHANNEL_BW_20MHZ;
|
||||
else if (chandef->width == NL80211_CHAN_WIDTH_40)
|
||||
bandwidth = chandef->center_freq1 >
|
||||
chandef->chan->center_freq ?
|
||||
CHANNEL_BW_40MHZ_ABOVE :
|
||||
CHANNEL_BW_40MHZ_BELOW;
|
||||
else if (chandef->width == NL80211_CHAN_WIDTH_80)
|
||||
bandwidth = CHANNEL_BW_80MHZ;
|
||||
band_chan_cfg.chan_bandwidth = bandwidth;
|
||||
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_set_net_monitor(priv, MOAL_IOCTL_WAIT,
|
||||
CHANNEL_SPEC_SNIFFER_MODE, 0x7,
|
||||
&band_chan_cfg)) {
|
||||
PRINTM(MERROR, "%s: woal_set_net_monitor fail\n",
|
||||
__func__);
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
moal_memcpy_ext(priv->phandle, &handle->mon_if->band_chan_cfg,
|
||||
&band_chan_cfg,
|
||||
sizeof(handle->mon_if->band_chan_cfg),
|
||||
sizeof(handle->mon_if->band_chan_cfg));
|
||||
handle->mon_if->chandef = *chandef;
|
||||
|
||||
if (handle->mon_if->chandef.chan)
|
||||
PRINTM(MINFO,
|
||||
"set_monitor_channel+++ chan[band=%d center_freq=%d hw_value=%d] width=%d center_freq1=%d center_freq2=%d\n",
|
||||
handle->mon_if->chandef.chan->band,
|
||||
handle->mon_if->chandef.chan->center_freq,
|
||||
handle->mon_if->chandef.chan->hw_value,
|
||||
handle->mon_if->chandef.width,
|
||||
handle->mon_if->chandef.center_freq1,
|
||||
handle->mon_if->chandef.center_freq2);
|
||||
PRINTM(MINFO,
|
||||
"set_monitor_channel+++ band=%x channel=%d bandwidth=%d\n",
|
||||
handle->mon_if->band_chan_cfg.band,
|
||||
handle->mon_if->band_chan_cfg.channel,
|
||||
handle->mon_if->band_chan_cfg.chan_bandwidth);
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
done:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function check cfg80211 special region code.
|
||||
|
@ -1069,9 +1173,9 @@ static mlan_status woal_send_domain_info_cmd_fw(moal_private *priv,
|
|||
goto done;
|
||||
}
|
||||
|
||||
PRINTM(MCMD_D, "Send domain info: country=%c%c band=%d\n",
|
||||
PRINTM(MCMD_D, "Send domain info: country=%c%c band=%d dfs_region=%d\n",
|
||||
priv->phandle->country_code[0], priv->phandle->country_code[1],
|
||||
band);
|
||||
band, priv->phandle->dfs_region);
|
||||
/* Allocate an IOCTL request buffer */
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11d_cfg));
|
||||
if (req == NULL) {
|
||||
|
@ -1082,7 +1186,7 @@ static mlan_status woal_send_domain_info_cmd_fw(moal_private *priv,
|
|||
cfg_11d->sub_command = MLAN_OID_11D_DOMAIN_INFO_EXT;
|
||||
req->req_id = MLAN_IOCTL_11D_CFG;
|
||||
req->action = MLAN_ACT_SET;
|
||||
|
||||
cfg_11d->param.domain_info.dfs_region = priv->phandle->dfs_region;
|
||||
if (is_cfg80211_special_region_code(priv->phandle->country_code)) {
|
||||
/* Set country code */
|
||||
cfg_11d->param.domain_info.country_code[0] = 'W';
|
||||
|
@ -1627,6 +1731,7 @@ static int woal_process_country_ie(moal_private *priv, struct cfg80211_bss *bss)
|
|||
req->req_id = MLAN_IOCTL_11D_CFG;
|
||||
req->action = MLAN_ACT_SET;
|
||||
|
||||
cfg_11d->param.domain_info.dfs_region = NXP_DFS_UNKNOWN;
|
||||
/* Set country code */
|
||||
cfg_11d->param.domain_info.country_code[0] =
|
||||
priv->phandle->country_code[0];
|
||||
|
@ -1683,7 +1788,7 @@ woal_cfg80211_connect_scan(moal_private *priv,
|
|||
{
|
||||
moal_handle *handle = priv->phandle;
|
||||
int ret = 0;
|
||||
wlan_user_scan_cfg scan_req;
|
||||
wlan_user_scan_cfg *scan_req;
|
||||
enum ieee80211_band band;
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *ch;
|
||||
|
@ -1702,25 +1807,34 @@ woal_cfg80211_connect_scan(moal_private *priv,
|
|||
return -EBUSY;
|
||||
}
|
||||
#endif /* REASSOCIATION */
|
||||
scan_req = (wlan_user_scan_cfg *)kmalloc(sizeof(wlan_user_scan_cfg),
|
||||
GFP_KERNEL);
|
||||
if (!scan_req) {
|
||||
PRINTM(MERROR, "Malloc buffer failed\n");
|
||||
LEAVE();
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
priv->report_scan_result = MTRUE;
|
||||
memset(&scan_req, 0x00, sizeof(scan_req));
|
||||
moal_memcpy_ext(priv->phandle, scan_req.ssid_list[0].ssid,
|
||||
memset(scan_req, 0x00, sizeof(wlan_user_scan_cfg));
|
||||
moal_memcpy_ext(priv->phandle, scan_req->ssid_list[0].ssid,
|
||||
conn_param->ssid, conn_param->ssid_len,
|
||||
sizeof(scan_req.ssid_list[0].ssid));
|
||||
scan_req.ssid_list[0].max_len = 0;
|
||||
sizeof(scan_req->ssid_list[0].ssid));
|
||||
scan_req->ssid_list[0].max_len = 0;
|
||||
if (conn_param->channel) {
|
||||
scan_req.chan_list[0].chan_number =
|
||||
scan_req->chan_list[0].chan_number =
|
||||
conn_param->channel->hw_value;
|
||||
scan_req.chan_list[0].radio_type = conn_param->channel->band;
|
||||
scan_req->chan_list[0].radio_type = conn_param->channel->band;
|
||||
if (conn_param->channel->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req.chan_list[0].scan_type =
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
else if (conn_param->channel->flags & IEEE80211_CHAN_RADAR)
|
||||
scan_req.chan_list[0].scan_type =
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE_TO_ACTIVE;
|
||||
else
|
||||
scan_req.chan_list[0].scan_type = MLAN_SCAN_TYPE_ACTIVE;
|
||||
scan_req.chan_list[0].scan_time = 0;
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_ACTIVE;
|
||||
scan_req->chan_list[0].scan_time = 0;
|
||||
} else {
|
||||
for (band = 0; (band < IEEE80211_NUM_BANDS); band++) {
|
||||
if (!priv->wdev->wiphy->bands[band])
|
||||
|
@ -1730,25 +1844,26 @@ woal_cfg80211_connect_scan(moal_private *priv,
|
|||
ch = &sband->channels[i];
|
||||
if (ch->flags & IEEE80211_CHAN_DISABLED)
|
||||
continue;
|
||||
scan_req.chan_list[chan_idx].radio_type = band;
|
||||
scan_req->chan_list[chan_idx].radio_type = band;
|
||||
if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req.chan_list[chan_idx].scan_type =
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
else if (ch->flags & IEEE80211_CHAN_RADAR)
|
||||
scan_req.chan_list[chan_idx].scan_type =
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE_TO_ACTIVE;
|
||||
else
|
||||
scan_req.chan_list[chan_idx].scan_type =
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_ACTIVE;
|
||||
scan_req.chan_list[chan_idx].chan_number =
|
||||
scan_req->chan_list[chan_idx].chan_number =
|
||||
(u32)ch->hw_value;
|
||||
chan_idx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
moal_memcpy_ext(priv->phandle, scan_req.random_mac, priv->random_mac,
|
||||
ETH_ALEN, sizeof(scan_req.random_mac));
|
||||
ret = woal_request_userscan(priv, wait_option, &scan_req);
|
||||
moal_memcpy_ext(priv->phandle, scan_req->random_mac, priv->random_mac,
|
||||
ETH_ALEN, sizeof(scan_req->random_mac));
|
||||
ret = woal_request_userscan(priv, wait_option, scan_req);
|
||||
kfree(scan_req);
|
||||
#ifdef REASSOCIATION
|
||||
MOAL_REL_SEMAPHORE(&handle->reassoc_sem);
|
||||
#endif
|
||||
|
@ -1855,7 +1970,7 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
|
|||
{
|
||||
moal_handle *handle = priv->phandle;
|
||||
int ret = 0;
|
||||
wlan_user_scan_cfg scan_req;
|
||||
wlan_user_scan_cfg *scan_req;
|
||||
enum ieee80211_band band;
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *ch;
|
||||
|
@ -1875,31 +1990,41 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
|
|||
return -EBUSY;
|
||||
}
|
||||
#endif /* REASSOCIATION */
|
||||
scan_req = (wlan_user_scan_cfg *)kmalloc(sizeof(wlan_user_scan_cfg),
|
||||
GFP_KERNEL);
|
||||
if (!scan_req) {
|
||||
PRINTM(MERROR, "Malloc buffer failed\n");
|
||||
LEAVE();
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
priv->report_scan_result = MTRUE;
|
||||
memset(&scan_req, 0x00, sizeof(scan_req));
|
||||
memset(scan_req, 0x00, sizeof(wlan_user_scan_cfg));
|
||||
rcu_read_lock();
|
||||
ssid = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
|
||||
if (ssid) {
|
||||
moal_memcpy_ext(priv->phandle, scan_req.ssid_list[0].ssid,
|
||||
moal_memcpy_ext(priv->phandle, scan_req->ssid_list[0].ssid,
|
||||
ssid + 2, ssid[1],
|
||||
sizeof(scan_req.ssid_list[0].ssid));
|
||||
scan_req.ssid_list[0].max_len = 0;
|
||||
sizeof(scan_req->ssid_list[0].ssid));
|
||||
scan_req->ssid_list[0].max_len = 0;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
moal_memcpy_ext(priv->phandle, scan_req.specific_bssid, req->bss->bssid,
|
||||
ETH_ALEN, ETH_ALEN);
|
||||
moal_memcpy_ext(priv->phandle, scan_req->specific_bssid,
|
||||
req->bss->bssid, ETH_ALEN, ETH_ALEN);
|
||||
if (req->bss->channel) {
|
||||
scan_req.chan_list[0].chan_number = req->bss->channel->hw_value;
|
||||
scan_req.chan_list[0].radio_type = req->bss->channel->band;
|
||||
scan_req->chan_list[0].chan_number =
|
||||
req->bss->channel->hw_value;
|
||||
scan_req->chan_list[0].radio_type = req->bss->channel->band;
|
||||
if (req->bss->channel->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req.chan_list[0].scan_type =
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
else if (req->bss->channel->flags & IEEE80211_CHAN_RADAR)
|
||||
scan_req.chan_list[0].scan_type =
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE_TO_ACTIVE;
|
||||
else
|
||||
scan_req.chan_list[0].scan_type = MLAN_SCAN_TYPE_ACTIVE;
|
||||
scan_req.chan_list[0].scan_time = 0;
|
||||
scan_req->chan_list[0].scan_type =
|
||||
MLAN_SCAN_TYPE_ACTIVE;
|
||||
scan_req->chan_list[0].scan_time = 0;
|
||||
} else {
|
||||
for (band = 0; (band < IEEE80211_NUM_BANDS); band++) {
|
||||
if (!priv->wdev->wiphy->bands[band])
|
||||
|
@ -1909,25 +2034,26 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
|
|||
ch = &sband->channels[i];
|
||||
if (ch->flags & IEEE80211_CHAN_DISABLED)
|
||||
continue;
|
||||
scan_req.chan_list[chan_idx].radio_type = band;
|
||||
scan_req->chan_list[chan_idx].radio_type = band;
|
||||
if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
|
||||
scan_req.chan_list[chan_idx].scan_type =
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE;
|
||||
else if (ch->flags & IEEE80211_CHAN_RADAR)
|
||||
scan_req.chan_list[chan_idx].scan_type =
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_PASSIVE_TO_ACTIVE;
|
||||
else
|
||||
scan_req.chan_list[chan_idx].scan_type =
|
||||
scan_req->chan_list[chan_idx].scan_type =
|
||||
MLAN_SCAN_TYPE_ACTIVE;
|
||||
scan_req.chan_list[chan_idx].chan_number =
|
||||
scan_req->chan_list[chan_idx].chan_number =
|
||||
(u32)ch->hw_value;
|
||||
chan_idx++;
|
||||
}
|
||||
}
|
||||
}
|
||||
moal_memcpy_ext(priv->phandle, scan_req.random_mac, priv->random_mac,
|
||||
ETH_ALEN, sizeof(scan_req.random_mac));
|
||||
ret = woal_request_userscan(priv, wait_option, &scan_req);
|
||||
moal_memcpy_ext(priv->phandle, scan_req->random_mac, priv->random_mac,
|
||||
ETH_ALEN, sizeof(scan_req->random_mac));
|
||||
ret = woal_request_userscan(priv, wait_option, scan_req);
|
||||
kfree(scan_req);
|
||||
#ifdef REASSOCIATION
|
||||
MOAL_REL_SEMAPHORE(&handle->reassoc_sem);
|
||||
#endif
|
||||
|
@ -1972,6 +2098,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
priv->cfg_disconnect = MFALSE;
|
||||
#ifdef UAP_CFG80211
|
||||
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
|
||||
PRINTM(MERROR, "ERR: Role is AP\n");
|
||||
LEAVE();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
@ -2092,6 +2219,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
KEY_INDEX_CLEAR_ALL, NULL, 1,
|
||||
MOAL_IOCTL_WAIT)) {
|
||||
/* Disable keys and clear all previous security settings */
|
||||
PRINTM(MERROR, "Fail to clear previous keys\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
@ -2121,6 +2249,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
goto done;
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_set_auth_mode(priv, MOAL_IOCTL_WAIT, auth_alg)) {
|
||||
PRINTM(MERROR, "Fail to set auth mode\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
@ -2133,6 +2262,8 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_cfg80211_set_wep_keys(priv, req->key, req->key_len,
|
||||
req->key_idx, MOAL_IOCTL_WAIT)) {
|
||||
PRINTM(MERROR, "Fail to set wep key idx %d\n",
|
||||
req->key_idx);
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
@ -2140,6 +2271,8 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_cfg80211_set_wep_keys(priv, NULL, 0, req->key_idx,
|
||||
MOAL_IOCTL_WAIT)) {
|
||||
PRINTM(MERROR, "Fail to enable wep key idx %d\n",
|
||||
req->key_idx);
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
@ -2253,7 +2386,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
priv->auth_flag = HOST_MLME_AUTH_PENDING;
|
||||
priv->auth_alg = woal_cpu_to_le16(auth_alg);
|
||||
|
||||
PRINTM(MCMND, "wlan: HostMlme %s send auth to bssid " MACSTR "\n",
|
||||
PRINTM(MMSG, "wlan: HostMlme %s send auth to bssid " MACSTR "\n",
|
||||
dev->name, MAC2STR(req->bss->bssid));
|
||||
DBG_HEXDUMP(MDAT_D, "Auth:", pmbuf->pbuf + pmbuf->data_offset,
|
||||
pmbuf->data_len);
|
||||
|
@ -2276,6 +2409,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
|
|||
priv->auth_flag = 0;
|
||||
priv->auth_alg = 0xFFFF;
|
||||
ret = -EFAULT;
|
||||
PRINTM(MERROR, "Fail to send packet status=%d\n", status);
|
||||
break;
|
||||
}
|
||||
done:
|
||||
|
@ -3522,12 +3656,14 @@ woal_reg_apply_beaconing_flags(struct wiphy *wiphy,
|
|||
/**
|
||||
* @brief This function create the custom regdomain
|
||||
*
|
||||
* @param priv pointer to moal_private
|
||||
* @param custom_reg pointer to mlan_ds_custom_reg_domain
|
||||
*
|
||||
* @return pointer to ieee80211_regdomain
|
||||
*/
|
||||
static struct ieee80211_regdomain *
|
||||
create_custom_regdomain(mlan_ds_custom_reg_domain *custom_reg)
|
||||
create_custom_regdomain(moal_private *priv,
|
||||
mlan_ds_custom_reg_domain *custom_reg)
|
||||
{
|
||||
struct ieee80211_reg_rule *rule;
|
||||
bool new_rule;
|
||||
|
@ -3642,7 +3778,7 @@ create_custom_regdomain(mlan_ds_custom_reg_domain *custom_reg)
|
|||
regd->dfs_region = NL80211_DFS_UNSET;
|
||||
break;
|
||||
}
|
||||
|
||||
priv->phandle->dfs_region = regd->dfs_region;
|
||||
PRINTM(MCMND, "create_custom_regdomain: %c%c rules=%d dfs_region=%d\n",
|
||||
regd->alpha2[0], regd->alpha2[1], valid_rules, regd->dfs_region);
|
||||
for (idx = 0; idx < (int)regd->n_reg_rules; idx++) {
|
||||
|
@ -3726,7 +3862,7 @@ static int woal_update_custom_regdomain(moal_private *priv, struct wiphy *wiphy)
|
|||
misc->param.custom_reg_domain.region.country_code[1],
|
||||
country_code[0], country_code[1]);
|
||||
}
|
||||
regd = create_custom_regdomain(&misc->param.custom_reg_domain);
|
||||
regd = create_custom_regdomain(priv, &misc->param.custom_reg_domain);
|
||||
if (regd) {
|
||||
PRINTM(MMSG, "call regulatory_set_wiphy_regd %c%c",
|
||||
misc->param.custom_reg_domain.region.country_code[0],
|
||||
|
@ -3773,8 +3909,10 @@ void woal_regulatory_work_queue(struct work_struct *work)
|
|||
band = priv->phandle->band;
|
||||
priv->phandle->band = IEEE80211_BAND_2GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
if (priv->phandle->fw_bands & BAND_A) {
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
}
|
||||
priv->phandle->band = band;
|
||||
}
|
||||
}
|
||||
|
@ -3824,8 +3962,14 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
|
|||
|
||||
PRINTM(MCMND,
|
||||
"cfg80211 regulatory domain callback "
|
||||
"%c%c initiator=%d\n",
|
||||
request->alpha2[0], request->alpha2[1], request->initiator);
|
||||
"%c%c initiator=%d dfs_region=%d\n",
|
||||
request->alpha2[0], request->alpha2[1], request->initiator,
|
||||
request->dfs_region);
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
if (!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED))
|
||||
#endif
|
||||
handle->dfs_region = request->dfs_region;
|
||||
|
||||
memset(&fw_info, 0, sizeof(mlan_fw_info));
|
||||
woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info);
|
||||
if (fw_info.force_reg) {
|
||||
|
@ -3875,15 +4019,15 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
|
|||
load_power_table = MTRUE;
|
||||
}
|
||||
}
|
||||
if (MTRUE != is_cfg80211_special_region_code(region)) {
|
||||
if (!handle->params.cntry_txpwr) {
|
||||
handle->country_code[0] = request->alpha2[0];
|
||||
handle->country_code[1] = request->alpha2[1];
|
||||
handle->country_code[2] = ' ';
|
||||
if (!handle->params.cntry_txpwr) {
|
||||
handle->country_code[0] = request->alpha2[0];
|
||||
handle->country_code[1] = request->alpha2[1];
|
||||
handle->country_code[2] = ' ';
|
||||
if (MTRUE != is_cfg80211_special_region_code(region)) {
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_set_region_code(priv, handle->country_code))
|
||||
PRINTM(MERROR, "Set country code failed!\n");
|
||||
}
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_set_region_code(priv, handle->country_code))
|
||||
PRINTM(MERROR, "Set country code failed!\n");
|
||||
}
|
||||
switch (request->initiator) {
|
||||
case NL80211_REGDOM_SET_BY_DRIVER:
|
||||
|
@ -3920,12 +4064,17 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
|
|||
break;
|
||||
}
|
||||
if (priv->wdev && priv->wdev->wiphy &&
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
!(wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) &&
|
||||
#endif
|
||||
(request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE)) {
|
||||
band = priv->phandle->band;
|
||||
priv->phandle->band = IEEE80211_BAND_2GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
if (priv->phandle->fw_bands & BAND_A) {
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
}
|
||||
priv->phandle->band = band;
|
||||
}
|
||||
|
||||
|
@ -4372,10 +4521,8 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev,
|
|||
if (scan_req->scan_chan_gap && priv->phandle->pref_mac)
|
||||
scan_req->scan_chan_gap |= GAP_FLAG_OPTIONAL;
|
||||
|
||||
if (priv->phandle->scan_request->n_channels <= 38) {
|
||||
if (scan_cfg.ext_scan == 3)
|
||||
scan_req->ext_scan_type = EXT_SCAN_ENHANCE;
|
||||
}
|
||||
if (scan_cfg.ext_scan == 3)
|
||||
scan_req->ext_scan_type = EXT_SCAN_ENHANCE;
|
||||
|
||||
for (i = 0; i < priv->phandle->scan_request->n_ssids; i++) {
|
||||
moal_memcpy_ext(priv->phandle, scan_req->ssid_list[i].ssid,
|
||||
|
@ -5544,9 +5691,23 @@ static int woal_cfg80211_get_channel(struct wiphy *wiphy,
|
|||
{
|
||||
moal_private *priv = (moal_private *)woal_get_netdev_priv(wdev->netdev);
|
||||
chan_band_info channel;
|
||||
#ifdef UAP_SUPPORT
|
||||
moal_handle *handle = (moal_handle *)woal_get_wiphy_priv(wiphy);
|
||||
#endif
|
||||
|
||||
memset(&channel, 0x00, sizeof(channel));
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
if (wdev->iftype == NL80211_IFTYPE_MONITOR) {
|
||||
if ((handle->mon_if) &&
|
||||
(handle->mon_if->mon_ndev == wdev->netdev)) {
|
||||
*chandef = handle->mon_if->chandef;
|
||||
return 0;
|
||||
}
|
||||
return -EFAULT;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef UAP_SUPPORT
|
||||
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
|
||||
if (priv->bss_started == MTRUE) {
|
||||
|
@ -6391,6 +6552,7 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
|
|||
handle->priv[i]->roaming_enabled) {
|
||||
handle->priv[i]->roaming_required =
|
||||
MTRUE;
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
|
||||
__pm_wakeup_event(
|
||||
&handle->ws,
|
||||
|
@ -6401,6 +6563,7 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
|
|||
msecs_to_jiffies(
|
||||
ROAMING_WAKE_LOCK_TIMEOUT));
|
||||
#endif
|
||||
#endif
|
||||
#ifdef REASSOCIATION
|
||||
wake_up_interruptible(
|
||||
&handle->reassoc_thread.wait_q);
|
||||
|
@ -7171,12 +7334,17 @@ static int woal_construct_tdls_data_frame(moal_private *priv, t_u8 *peer,
|
|||
IEEEtypes_VHTCap_t *VHTcap;
|
||||
IEEEtypes_VHTOprat_t *vht_oprat;
|
||||
IEEEtypes_AID_t *AidInfo;
|
||||
IEEEtypes_Header_t *ieee_hdr;
|
||||
t_u8 *skb_data;
|
||||
t_u8 len = 0;
|
||||
IEEEtypes_Generic_t *pSupp_chan = NULL, *pRegulatory_class = NULL;
|
||||
mlan_ds_misc_tdls_ies *tdls_ies = NULL;
|
||||
int ret = 0;
|
||||
mlan_bss_info bss_info;
|
||||
enum ieee80211_band band;
|
||||
mlan_fw_info fw_info;
|
||||
t_u16 setup_flag = 0;
|
||||
t_u16 confirm_flag = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
|
@ -7207,22 +7375,27 @@ static int woal_construct_tdls_data_frame(moal_private *priv, t_u8 *peer,
|
|||
tdata->payload_type = WLAN_TDLS_SNAP_RFTYPE;
|
||||
woal_request_get_fw_info(priv, MOAL_IOCTL_WAIT, &fw_info);
|
||||
|
||||
setup_flag = TDLS_IE_FLAGS_EXTCAP | TDLS_IE_FLAGS_HTCAP |
|
||||
TDLS_IE_FLAGS_SUPP_CS_IE;
|
||||
confirm_flag = TDLS_IE_FLAGS_EXTCAP | TDLS_IE_FLAGS_HTINFO |
|
||||
TDLS_IE_FLAGS_QOS_INFO;
|
||||
if (fw_info.fw_bands & BAND_AAC) {
|
||||
setup_flag |= (TDLS_IE_FLAGS_VHTCAP | TDLS_IE_FLAGS_AID);
|
||||
confirm_flag |= TDLS_IE_FLAGS_VHTOPRAT;
|
||||
}
|
||||
if (fw_info.fw_bands & BAND_AAX) {
|
||||
setup_flag |= (TDLS_IE_FLAGS_VHTCAP | TDLS_IE_FLAGS_AID |
|
||||
TDLS_IE_FLAGS_HECAP);
|
||||
confirm_flag |= (TDLS_IE_FLAGS_VHTOPRAT | TDLS_IE_FLAGS_HEOP);
|
||||
}
|
||||
if (fw_info.fw_bands & BAND_GAX) {
|
||||
setup_flag |= TDLS_IE_FLAGS_HECAP;
|
||||
confirm_flag |= TDLS_IE_FLAGS_HEOP;
|
||||
}
|
||||
switch (action_code) {
|
||||
case WLAN_TDLS_SETUP_REQUEST:
|
||||
if (fw_info.fw_bands & BAND_AAC)
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies,
|
||||
TDLS_IE_FLAGS_SETUP |
|
||||
TDLS_IE_FLAGS_EXTCAP |
|
||||
TDLS_IE_FLAGS_HTCAP |
|
||||
TDLS_IE_FLAGS_VHTCAP |
|
||||
TDLS_IE_FLAGS_AID |
|
||||
TDLS_IE_FLAGS_SUPP_CS_IE);
|
||||
else
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies,
|
||||
TDLS_IE_FLAGS_SETUP |
|
||||
TDLS_IE_FLAGS_EXTCAP |
|
||||
TDLS_IE_FLAGS_HTCAP |
|
||||
TDLS_IE_FLAGS_SUPP_CS_IE);
|
||||
setup_flag |= TDLS_IE_FLAGS_SETUP;
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies, setup_flag);
|
||||
|
||||
tdata->category = WLAN_CATEGORY_TDLS;
|
||||
tdata->action_code = WLAN_TDLS_SETUP_REQUEST;
|
||||
|
@ -7233,18 +7406,7 @@ static int woal_construct_tdls_data_frame(moal_private *priv, t_u8 *peer,
|
|||
woal_add_ext_supported_rates_ie(priv, skb, band);
|
||||
break;
|
||||
case WLAN_TDLS_SETUP_RESPONSE:
|
||||
if (fw_info.fw_bands & BAND_AAC)
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies,
|
||||
TDLS_IE_FLAGS_EXTCAP |
|
||||
TDLS_IE_FLAGS_HTCAP |
|
||||
TDLS_IE_FLAGS_VHTCAP |
|
||||
TDLS_IE_FLAGS_AID |
|
||||
TDLS_IE_FLAGS_SUPP_CS_IE);
|
||||
else
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies,
|
||||
TDLS_IE_FLAGS_EXTCAP |
|
||||
TDLS_IE_FLAGS_HTCAP |
|
||||
TDLS_IE_FLAGS_SUPP_CS_IE);
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies, setup_flag);
|
||||
|
||||
tdata->category = WLAN_CATEGORY_TDLS;
|
||||
tdata->action_code = WLAN_TDLS_SETUP_RESPONSE;
|
||||
|
@ -7258,17 +7420,7 @@ static int woal_construct_tdls_data_frame(moal_private *priv, t_u8 *peer,
|
|||
woal_add_ext_supported_rates_ie(priv, skb, band);
|
||||
break;
|
||||
case WLAN_TDLS_SETUP_CONFIRM:
|
||||
if (fw_info.fw_bands & BAND_AAC)
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies,
|
||||
TDLS_IE_FLAGS_EXTCAP |
|
||||
TDLS_IE_FLAGS_HTINFO |
|
||||
TDLS_IE_FLAGS_VHTOPRAT |
|
||||
TDLS_IE_FLAGS_QOS_INFO);
|
||||
else
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies,
|
||||
TDLS_IE_FLAGS_EXTCAP |
|
||||
TDLS_IE_FLAGS_HTINFO |
|
||||
TDLS_IE_FLAGS_QOS_INFO);
|
||||
woal_tdls_get_ies(priv, peer, tdls_ies, confirm_flag);
|
||||
|
||||
tdata->category = WLAN_CATEGORY_TDLS;
|
||||
tdata->action_code = WLAN_TDLS_SETUP_CONFIRM;
|
||||
|
@ -7378,6 +7530,17 @@ static int woal_construct_tdls_data_frame(moal_private *priv, t_u8 *peer,
|
|||
} else {
|
||||
PRINTM(MIOCTL, "No TDLS AID info\n");
|
||||
}
|
||||
/* HE capability */
|
||||
if (tdls_ies->he_cap[2] == HE_CAPABILITY) {
|
||||
ieee_hdr = (IEEEtypes_Header_t *)tdls_ies->he_cap;
|
||||
len = sizeof(IEEEtypes_Header_t) + ieee_hdr->len;
|
||||
skb_data = (void *)skb_put(skb, len);
|
||||
memset(skb_data, 0, len);
|
||||
moal_memcpy_ext(priv->phandle, skb_data,
|
||||
tdls_ies->he_cap, len, len);
|
||||
} else {
|
||||
PRINTM(MIOCTL, "NO TDLS HE Capability IE\n");
|
||||
}
|
||||
break;
|
||||
case WLAN_TDLS_SETUP_CONFIRM:
|
||||
/*HT information*/
|
||||
|
@ -7402,6 +7565,16 @@ static int woal_construct_tdls_data_frame(moal_private *priv, t_u8 *peer,
|
|||
sizeof(IEEEtypes_VHTOprat_t));
|
||||
} else
|
||||
PRINTM(MIOCTL, "NO TDLS VHT Operation IE\n");
|
||||
/** HE operation */
|
||||
if (tdls_ies->he_op[2] == HE_OPERATION) {
|
||||
ieee_hdr = (IEEEtypes_Header_t *)tdls_ies->he_op;
|
||||
len = sizeof(IEEEtypes_Header_t) + ieee_hdr->len;
|
||||
skb_data = (void *)skb_put(skb, len);
|
||||
memset(skb_data, 0, len);
|
||||
moal_memcpy_ext(priv->phandle, skb_data,
|
||||
tdls_ies->he_op, len, len);
|
||||
} else
|
||||
PRINTM(MIOCTL, "NO TDLS HE Operation IE\n");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -7735,6 +7908,7 @@ static int woal_send_tdls_data_frame(struct wiphy *wiphy,
|
|||
sizeof(IEEEtypes_HTCap_t) + sizeof(IEEEtypes_2040BSSCo_t) +
|
||||
sizeof(IEEEtypes_HTInfo_t) + sizeof(IEEEtypes_VHTCap_t) +
|
||||
sizeof(IEEEtypes_VHTOprat_t) + sizeof(IEEEtypes_AID_t) +
|
||||
sizeof(IEEEtypes_HECap_t) + sizeof(IEEEtypes_HeOp_t) +
|
||||
extra_ies_len + sizeof(IEEEtypes_tdls_linkie));
|
||||
if (!skb)
|
||||
return -ENOMEM;
|
||||
|
@ -8923,7 +9097,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
ENTER();
|
||||
|
||||
req_len = sizeof(mlan_ds_bss);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
if (params->ext_capab_len)
|
||||
req_len += sizeof(MrvlIEtypesHeader_t) + params->ext_capab_len;
|
||||
#endif
|
||||
|
@ -8938,7 +9112,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
if (params->vht_capa)
|
||||
req_len += sizeof(MrvlIEtypesHeader_t) +
|
||||
sizeof(struct ieee80211_vht_cap);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (params->opmode_notif_used)
|
||||
req_len += sizeof(MrvlIEtypesHeader_t) + sizeof(u8);
|
||||
#endif
|
||||
|
@ -8980,7 +9154,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
params->sta_flags_set, params->listen_interval, params->aid);
|
||||
#endif
|
||||
pos = &bss->param.sta_info.tlv[0];
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
if (params->ext_capab_len) {
|
||||
tlv = (MrvlIEtypes_Data_t *)pos;
|
||||
tlv->header.type = EXT_CAPABILITY;
|
||||
|
@ -9039,7 +9213,7 @@ int woal_cfg80211_uap_add_station(struct wiphy *wiphy, struct net_device *dev,
|
|||
sizeof(MrvlIEtypesHeader_t) + tlv->header.len;
|
||||
tlv = (MrvlIEtypes_Data_t *)pos;
|
||||
}
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (params->opmode_notif_used) {
|
||||
tlv = (MrvlIEtypes_Data_t *)pos;
|
||||
tlv->header.type = OPER_MODE_NTF;
|
||||
|
@ -9151,7 +9325,7 @@ void woal_host_mlme_disconnect(moal_private *priv, u16 reason_code, u8 *sa)
|
|||
}
|
||||
|
||||
if (GET_BSS_ROLE(priv) != MLAN_BSS_ROLE_UAP) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
|
||||
mutex_lock(&priv->wdev->mtx);
|
||||
cfg80211_rx_mlme_mgmt(priv->netdev, frame_buf, 26);
|
||||
mutex_unlock(&priv->wdev->mtx);
|
||||
|
@ -9257,8 +9431,10 @@ mlan_status woal_register_sta_cfg80211(struct net_device *dev, t_u8 bss_type)
|
|||
band = priv->phandle->band;
|
||||
priv->phandle->band = IEEE80211_BAND_2GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
if (priv->phandle->fw_bands & BAND_A) {
|
||||
priv->phandle->band = IEEE80211_BAND_5GHZ;
|
||||
woal_send_domain_info_cmd_fw(priv, MOAL_IOCTL_WAIT);
|
||||
}
|
||||
priv->phandle->band = band;
|
||||
}
|
||||
LEAVE();
|
||||
|
@ -9548,6 +9724,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
wiphy->interface_modes = 0;
|
||||
wiphy->interface_modes =
|
||||
MBIT(NL80211_IFTYPE_STATION) | MBIT(NL80211_IFTYPE_AP);
|
||||
wiphy->interface_modes |= MBIT(NL80211_IFTYPE_MONITOR);
|
||||
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION
|
||||
|
@ -9565,12 +9742,8 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
if (!fw_info.fw_bands)
|
||||
fw_info.fw_bands = BAND_B | BAND_G;
|
||||
if (fw_info.fw_bands & BAND_A) {
|
||||
if (priv->phandle->second_mac)
|
||||
wiphy->bands[IEEE80211_BAND_5GHZ] =
|
||||
&mac1_cfg80211_band_5ghz;
|
||||
else
|
||||
|
||||
wiphy->bands[IEEE80211_BAND_5GHZ] = &cfg80211_band_5ghz;
|
||||
wiphy->bands[IEEE80211_BAND_5GHZ] =
|
||||
woal_setup_wiphy_bands(IEEE80211_BAND_5GHZ);
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 9, 0)
|
||||
woal_update_channel_flag(wiphy, &fw_info);
|
||||
#endif
|
||||
|
@ -9578,11 +9751,8 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
}
|
||||
/* Supported bands */
|
||||
if (fw_info.fw_bands & (BAND_B | BAND_G | BAND_GN | BAND_GAC)) {
|
||||
if (priv->phandle->second_mac)
|
||||
wiphy->bands[IEEE80211_BAND_2GHZ] =
|
||||
&mac1_cfg80211_band_2ghz;
|
||||
else
|
||||
wiphy->bands[IEEE80211_BAND_2GHZ] = &cfg80211_band_2ghz;
|
||||
wiphy->bands[IEEE80211_BAND_2GHZ] =
|
||||
woal_setup_wiphy_bands(IEEE80211_BAND_2GHZ);
|
||||
/* If 2.4G enable, it will overwrite default to 2.4G*/
|
||||
priv->phandle->band = IEEE80211_BAND_2GHZ;
|
||||
}
|
||||
|
@ -9649,10 +9819,12 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
#endif
|
||||
wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME;
|
||||
#endif
|
||||
#ifdef ANDROID_KERNEL
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (!moal_extflg_isset(priv->phandle, EXT_HOST_MLME))
|
||||
#endif
|
||||
wiphy->flags |= WIPHY_FLAG_HAVE_AP_SME;
|
||||
#endif
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)
|
||||
if (priv->phandle->params.sched_scan) {
|
||||
|
@ -9766,6 +9938,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
|
||||
memset(&priv->phandle->country_code, 0,
|
||||
sizeof(priv->phandle->country_code));
|
||||
priv->phandle->dfs_region = NXP_DFS_UNKNOWN;
|
||||
|
||||
if (reg_alpha2 && !strncmp(reg_alpha2, "99", strlen("99"))) {
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
|
@ -9798,6 +9971,8 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
goto err_wiphy;
|
||||
}
|
||||
|
||||
wiphy->interface_modes &= ~(MBIT(NL80211_IFTYPE_MONITOR));
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 0, 0)
|
||||
if (fw_info.force_reg ||
|
||||
(priv->phandle->params.txpwrlimit_cfg &&
|
||||
|
@ -9846,8 +10021,10 @@ mlan_status woal_register_cfg80211(moal_private *priv)
|
|||
priv->phandle->wiphy = wiphy;
|
||||
return ret;
|
||||
err_wiphy:
|
||||
if (wiphy)
|
||||
if (wiphy) {
|
||||
woal_cfg80211_free_bands(wiphy);
|
||||
wiphy_free(wiphy);
|
||||
}
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* driver.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2021 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -738,6 +738,40 @@ done:
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief enable/disable 11h
|
||||
*
|
||||
* @param enable MTRUE/MFALSE
|
||||
* @return 0 --success, otherwise fail
|
||||
*/
|
||||
int woal_uap_11h_ctrl(moal_private *priv, t_u32 enable)
|
||||
{
|
||||
mlan_ioctl_req *ioctl_req = NULL;
|
||||
mlan_ds_snmp_mib *snmp = NULL;
|
||||
int ret = 0;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
ENTER();
|
||||
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_snmp_mib));
|
||||
if (ioctl_req == NULL) {
|
||||
LEAVE();
|
||||
return -ENOMEM;
|
||||
}
|
||||
snmp = (mlan_ds_snmp_mib *)ioctl_req->pbuf;
|
||||
ioctl_req->req_id = MLAN_IOCTL_SNMP_MIB;
|
||||
snmp->sub_command = MLAN_OID_SNMP_MIB_DOT11H;
|
||||
snmp->param.oid_value = enable;
|
||||
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(ioctl_req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief configure snmp mib
|
||||
*
|
||||
|
@ -2053,7 +2087,75 @@ done:
|
|||
}
|
||||
|
||||
/**
|
||||
* @brief Set/Get skip CAC mode
|
||||
* @brief Issue MLAN_OID_11H_CHAN_REPORT_REQUEST ioctl to cancel dozer
|
||||
*
|
||||
* @param priv Pointer to the moal_private driver data struct
|
||||
* @param action MLAN_ACT_SET/MLAN_ACT_GET
|
||||
* @param
|
||||
*
|
||||
* @return 0 --success, otherwise fail
|
||||
*/
|
||||
int woal_11h_chan_dfs_state(moal_private *priv, t_u8 action,
|
||||
mlan_ds_11h_chan_dfs_state *ch_dfs_state)
|
||||
{
|
||||
int ret = 0;
|
||||
mlan_ioctl_req *req = NULL;
|
||||
mlan_ds_11h_cfg *ds_11hcfg = NULL;
|
||||
mlan_status status = MLAN_STATUS_SUCCESS;
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
int cfg80211_wext = priv->phandle->params.cfg80211_wext;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
ENTER();
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (action == MLAN_ACT_GET) {
|
||||
if (IS_UAP_CFG80211(cfg80211_wext)) {
|
||||
ret = woal_get_wiphy_chan_dfs_state(priv->wdev->wiphy,
|
||||
ch_dfs_state);
|
||||
if (!ret) {
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11h_cfg));
|
||||
if (req == NULL) {
|
||||
ret = -ENOMEM;
|
||||
goto done;
|
||||
}
|
||||
ds_11hcfg = (mlan_ds_11h_cfg *)req->pbuf;
|
||||
|
||||
ds_11hcfg->sub_command = MLAN_OID_11H_CHAN_DFS_STATE;
|
||||
req->req_id = MLAN_IOCTL_11H_CFG;
|
||||
req->action = action;
|
||||
moal_memcpy_ext(priv->phandle, &ds_11hcfg->param.ch_dfs_state,
|
||||
ch_dfs_state, sizeof(mlan_ds_11h_chan_dfs_state),
|
||||
sizeof(ds_11hcfg->param.ch_dfs_state));
|
||||
/* Send Channel Check command and wait until the report is ready */
|
||||
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
|
||||
if (status != MLAN_STATUS_SUCCESS) {
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
moal_memcpy_ext(priv->phandle, ch_dfs_state,
|
||||
&ds_11hcfg->param.ch_dfs_state,
|
||||
sizeof(mlan_ds_11h_chan_dfs_state),
|
||||
sizeof(mlan_ds_11h_chan_dfs_state));
|
||||
done:
|
||||
if (status != MLAN_STATUS_PENDING)
|
||||
kfree(req);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief skip cac on specific channel
|
||||
* @and Wext
|
||||
*
|
||||
* @param dev A pointer to net_device structure
|
||||
* @param req A pointer to ifreq structure
|
||||
|
@ -2062,41 +2164,61 @@ done:
|
|||
*/
|
||||
static int woal_uap_skip_cac(struct net_device *dev, struct ifreq *req)
|
||||
{
|
||||
moal_private *priv = (moal_private *)netdev_priv(dev);
|
||||
int ret = 0;
|
||||
skip_cac_para param;
|
||||
|
||||
moal_private *priv = (moal_private *)netdev_priv(dev);
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
int cfg80211_wext = priv->phandle->params.cfg80211_wext;
|
||||
#endif
|
||||
#endif
|
||||
dfs_state_t dfs_state;
|
||||
mlan_ds_11h_chan_dfs_state ch_dfs_state;
|
||||
ENTER();
|
||||
|
||||
/* Sanity check */
|
||||
if (req->ifr_data == NULL) {
|
||||
PRINTM(MERROR, "skip_cac() corrupt data\n");
|
||||
PRINTM(MERROR, "skip_dfs_cac() corrupt data\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
memset(¶m, 0, sizeof(skip_cac_para));
|
||||
|
||||
/* Get user data */
|
||||
if (copy_from_user(¶m, req->ifr_data, sizeof(skip_cac_para))) {
|
||||
PRINTM(MERROR, "Copy from user failed\n");
|
||||
ret = -EFAULT;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* Currently default action is get */
|
||||
if (param.action == 0) {
|
||||
param.skip_cac = (t_u16)priv->skip_cac;
|
||||
} else {
|
||||
priv->skip_cac = param.skip_cac;
|
||||
}
|
||||
|
||||
if (copy_to_user(req->ifr_data, ¶m, sizeof(skip_cac_para))) {
|
||||
PRINTM(MERROR, "Copy to user failed\n");
|
||||
ret = -EFAULT;
|
||||
if (param.skip_cac)
|
||||
dfs_state = DFS_AVAILABLE;
|
||||
else
|
||||
dfs_state = DFS_USABLE;
|
||||
memset(&ch_dfs_state, 0, sizeof(ch_dfs_state));
|
||||
ch_dfs_state.channel = param.channel;
|
||||
woal_11h_chan_dfs_state(priv, MLAN_ACT_GET, &ch_dfs_state);
|
||||
if (ch_dfs_state.dfs_state == dfs_state)
|
||||
goto done;
|
||||
if (param.skip_cac && ch_dfs_state.dfs_state == DFS_USABLE)
|
||||
PRINTM(MMSG,
|
||||
"ZeroDFS: Requst skip cac on the channel %d which hasn't do CAC before!\n",
|
||||
param.channel);
|
||||
ch_dfs_state.dfs_state = dfs_state;
|
||||
woal_11h_chan_dfs_state(priv, MLAN_ACT_SET, &ch_dfs_state);
|
||||
PRINTM(MCMND, "ZeroDFS: Skip CAC on chan %d %d\n", param.channel,
|
||||
param.skip_cac);
|
||||
#ifdef UAP_CFG80211
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
|
||||
if (IS_UAP_CFG80211(cfg80211_wext)) {
|
||||
if (param.skip_cac)
|
||||
woal_update_channel_dfs_state(param.channel,
|
||||
DFS_AVAILABLE);
|
||||
else
|
||||
woal_update_channel_dfs_state(param.channel,
|
||||
DFS_USABLE);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
done:
|
||||
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains uap driver specific defines etc.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -201,10 +201,12 @@ typedef struct _cac_timer_status {
|
|||
typedef struct _skip_cac_para {
|
||||
/** subcmd */
|
||||
t_u32 subcmd;
|
||||
/** Set/Get */
|
||||
/** Set */
|
||||
t_u32 action;
|
||||
/** enable/disable deepsleep*/
|
||||
/** enable/disable skip cac*/
|
||||
t_u16 skip_cac;
|
||||
/** channel */
|
||||
t_u8 channel;
|
||||
} skip_cac_para;
|
||||
|
||||
/** radio control command */
|
||||
|
@ -481,6 +483,8 @@ typedef struct _snmp_mib_para {
|
|||
/** Oid for 802.11H enable/disable */
|
||||
#define OID_80211H_ENABLE 0x000a
|
||||
|
||||
int woal_uap_11h_ctrl(moal_private *priv, t_u32 enable);
|
||||
|
||||
/** dfs_testing parameters */
|
||||
typedef struct _dfs_testing_param {
|
||||
/** subcmd */
|
||||
|
@ -528,6 +532,10 @@ typedef struct _domain_info_param {
|
|||
#define MAX_DOMAIN_TLV_LEN \
|
||||
(TLV_HEADER_LEN + COUNTRY_CODE_LEN + (SUB_BAND_LEN * MAX_SUB_BANDS))
|
||||
|
||||
/** Get/Set channel DFS state */
|
||||
int woal_11h_chan_dfs_state(moal_private *priv, t_u8 action,
|
||||
mlan_ds_11h_chan_dfs_state *ch_dfs_state);
|
||||
|
||||
int woal_set_get_uap_power_mode(moal_private *priv, t_u32 action,
|
||||
mlan_ds_ps_mgmt *ps_mgmt);
|
||||
void woal_uap_set_multicast_list(struct net_device *dev);
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the functions for uAP CFG80211.
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2021 NXP
|
||||
* Copyright 2011-2022 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
@ -1402,6 +1402,134 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
|
||||
/**
|
||||
* @brief Request the driver to add a monitor interface
|
||||
*
|
||||
* @param wiphy A pointer to wiphy structure
|
||||
* @param name Virtual interface name
|
||||
* @param name_assign_type Interface name assignment type
|
||||
* @param flags Flags for the virtual interface
|
||||
* @param params A pointer to vif_params structure
|
||||
* @param new_dev Netdevice to be passed out
|
||||
*
|
||||
* @return 0 -- success, otherwise fail
|
||||
*/
|
||||
static int woal_cfg80211_add_mon_if(struct wiphy *wiphy, const char *name,
|
||||
unsigned char name_assign_type, u32 *flags,
|
||||
struct vif_params *params,
|
||||
struct net_device **new_dev)
|
||||
#else
|
||||
/**
|
||||
* @brief Request the driver to add a monitor interface
|
||||
*
|
||||
* @param wiphy A pointer to wiphy structure
|
||||
* @param name Virtual interface name
|
||||
* @param flags Flags for the virtual interface
|
||||
* @param params A pointer to vif_params structure
|
||||
* @param new_dev Netdevice to be passed out
|
||||
*
|
||||
* @return 0 -- success, otherwise fail
|
||||
*/
|
||||
static int woal_cfg80211_add_mon_if(struct wiphy *wiphy,
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 7, 0)
|
||||
const
|
||||
#endif
|
||||
char *name,
|
||||
u32 *flags, struct vif_params *params,
|
||||
struct net_device **new_dev)
|
||||
#endif
|
||||
{
|
||||
int ret = 0;
|
||||
moal_handle *handle = (moal_handle *)woal_get_wiphy_priv(wiphy);
|
||||
moal_private *priv =
|
||||
(moal_private *)woal_get_priv(handle, MLAN_BSS_ROLE_STA);
|
||||
monitor_iface *mon_if = NULL;
|
||||
struct net_device *ndev = NULL;
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
chan_band_info chan_info;
|
||||
#endif
|
||||
unsigned char name_assign_type_tmp = 0;
|
||||
|
||||
ENTER();
|
||||
|
||||
ASSERT_RTNL();
|
||||
|
||||
if (handle->mon_if) {
|
||||
PRINTM(MERROR, "%s: monitor interface exist: %s basedev %s\n",
|
||||
__func__, handle->mon_if->mon_ndev->name,
|
||||
handle->mon_if->base_ndev->name);
|
||||
ret = -EFAULT;
|
||||
goto fail;
|
||||
}
|
||||
if (!priv) {
|
||||
PRINTM(MERROR, "add_mon_if: priv is NULL\n");
|
||||
ret = -EFAULT;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
|
||||
name_assign_type_tmp = name_assign_type;
|
||||
#endif
|
||||
mon_if = woal_prepare_mon_if(priv, name, name_assign_type_tmp,
|
||||
CHANNEL_SPEC_SNIFFER_MODE);
|
||||
if (!mon_if) {
|
||||
PRINTM(MFATAL, "Prepare mon_if fail.\n");
|
||||
goto fail;
|
||||
}
|
||||
ndev = mon_if->mon_ndev;
|
||||
dev_net_set(ndev, wiphy_net(wiphy));
|
||||
|
||||
moal_memcpy_ext(priv->phandle, ndev->perm_addr, wiphy->perm_addr,
|
||||
ETH_ALEN, sizeof(ndev->perm_addr));
|
||||
moal_memcpy_ext(priv->phandle, ndev->dev_addr, ndev->perm_addr,
|
||||
ETH_ALEN, MAX_ADDR_LEN);
|
||||
SET_NETDEV_DEV(ndev, wiphy_dev(wiphy));
|
||||
ndev->ieee80211_ptr = &mon_if->wdev;
|
||||
mon_if->wdev.iftype = NL80211_IFTYPE_MONITOR;
|
||||
mon_if->wdev.wiphy = wiphy;
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
/* Set default band channel config */
|
||||
mon_if->band_chan_cfg.band = BAND_B | BAND_G;
|
||||
mon_if->band_chan_cfg.band |= BAND_GN;
|
||||
mon_if->band_chan_cfg.channel = 1;
|
||||
mon_if->band_chan_cfg.chan_bandwidth = CHANNEL_BW_20MHZ;
|
||||
memset(&chan_info, 0x00, sizeof(chan_info));
|
||||
chan_info.channel = 1;
|
||||
chan_info.is_11n_enabled = MTRUE;
|
||||
if (MLAN_STATUS_FAILURE ==
|
||||
woal_chandef_create(priv, &mon_if->chandef, &chan_info)) {
|
||||
ret = -EFAULT;
|
||||
goto fail;
|
||||
}
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_set_net_monitor(priv, MOAL_IOCTL_WAIT,
|
||||
CHANNEL_SPEC_SNIFFER_MODE, 0x7,
|
||||
&mon_if->band_chan_cfg)) {
|
||||
PRINTM(MERROR, "%s: woal_set_net_monitor fail\n", __func__);
|
||||
ret = -EFAULT;
|
||||
goto fail;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = register_netdevice(ndev);
|
||||
if (ret) {
|
||||
PRINTM(MFATAL, "register net_device failed, ret=%d\n", ret);
|
||||
free_netdev(ndev);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
handle->mon_if = mon_if;
|
||||
|
||||
if (new_dev)
|
||||
*new_dev = ndev;
|
||||
|
||||
fail:
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION
|
||||
/**
|
||||
|
@ -1509,6 +1637,8 @@ moal_private *woal_alloc_virt_interface(moal_handle *handle, t_u8 bss_index,
|
|||
|
||||
INIT_LIST_HEAD(&priv->tx_stat_queue);
|
||||
spin_lock_init(&priv->tx_stat_lock);
|
||||
INIT_LIST_HEAD(&priv->mcast_list);
|
||||
spin_lock_init(&priv->mcast_lock);
|
||||
|
||||
spin_lock_init(&priv->connect_lock);
|
||||
|
||||
|
@ -1668,7 +1798,7 @@ int woal_cfg80211_add_virt_if(struct wiphy *wiphy,
|
|||
woal_cfg80211_init_p2p_client(new_priv);
|
||||
else if (type == NL80211_IFTYPE_P2P_GO)
|
||||
woal_cfg80211_init_p2p_go(new_priv);
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
ret = cfg80211_register_netdevice(ndev);
|
||||
#else
|
||||
ret = register_netdevice(ndev);
|
||||
|
@ -1677,7 +1807,7 @@ int woal_cfg80211_add_virt_if(struct wiphy *wiphy,
|
|||
handle->priv[new_priv->bss_index] = NULL;
|
||||
handle->priv_num--;
|
||||
if (ndev->reg_state == NETREG_REGISTERED) {
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
cfg80211_unregister_netdevice(ndev);
|
||||
#else
|
||||
unregister_netdevice(ndev);
|
||||
|
@ -1804,6 +1934,7 @@ int woal_cfg80211_del_virt_if(struct wiphy *wiphy, struct net_device *dev)
|
|||
woal_cancel_scan(vir_priv, MOAL_IOCTL_WAIT);
|
||||
|
||||
woal_flush_tx_stat_queue(vir_priv);
|
||||
woal_flush_mcast_list(vir_priv);
|
||||
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
|
||||
/* cancel previous remain on channel to avoid firmware hang */
|
||||
|
@ -1862,7 +1993,7 @@ int woal_cfg80211_del_virt_if(struct wiphy *wiphy, struct net_device *dev)
|
|||
vir_priv->phandle->priv[vir_priv->bss_index] = NULL;
|
||||
priv->phandle->priv_num--;
|
||||
if (dev->reg_state == NETREG_REGISTERED)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
cfg80211_unregister_netdevice(dev);
|
||||
#else
|
||||
unregister_netdevice(dev);
|
||||
|
@ -1873,7 +2004,6 @@ int woal_cfg80211_del_virt_if(struct wiphy *wiphy, struct net_device *dev)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(WIFI_DIRECT_SUPPORT)
|
||||
/**
|
||||
* @brief This function removes an virtual interface.
|
||||
*
|
||||
|
@ -1905,7 +2035,7 @@ void woal_remove_virtual_interface(moal_handle *handle)
|
|||
netif_device_detach(priv->netdev);
|
||||
if (priv->netdev->reg_state ==
|
||||
NETREG_REGISTERED)
|
||||
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
|
||||
cfg80211_unregister_netdevice(
|
||||
priv->netdev);
|
||||
#else
|
||||
|
@ -1917,13 +2047,18 @@ void woal_remove_virtual_interface(moal_handle *handle)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
if (handle->mon_if) {
|
||||
netif_device_detach(handle->mon_if->mon_ndev);
|
||||
if (handle->mon_if->mon_ndev->reg_state == NETREG_REGISTERED)
|
||||
unregister_netdevice(handle->mon_if->mon_ndev);
|
||||
handle->mon_if = NULL;
|
||||
}
|
||||
rtnl_unlock();
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
handle->priv_num -= vir_intf;
|
||||
#endif
|
||||
LEAVE();
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief This function check if uap interface is ready
|
||||
|
@ -2036,15 +2171,22 @@ woal_cfg80211_add_virtual_intf(struct wiphy *wiphy, const char *name,
|
|||
{
|
||||
struct net_device *ndev = NULL;
|
||||
int ret = 0;
|
||||
#if defined(WIFI_DIRECT_SUPPORT)
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 12, 0)
|
||||
u32 *flags = ¶ms->flags;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
ENTER();
|
||||
PRINTM(MIOCTL, "add virtual intf: %d name: %s\n", type, name);
|
||||
switch (type) {
|
||||
case NL80211_IFTYPE_MONITOR:
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 1, 0)
|
||||
ret = woal_cfg80211_add_mon_if(wiphy, name, name_assign_type,
|
||||
flags, params, &ndev);
|
||||
#else
|
||||
ret = woal_cfg80211_add_mon_if(wiphy, name, flags, params,
|
||||
&ndev);
|
||||
#endif
|
||||
break;
|
||||
#ifdef WIFI_DIRECT_SUPPORT
|
||||
#if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION
|
||||
case NL80211_IFTYPE_P2P_CLIENT:
|
||||
|
@ -2127,6 +2269,25 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy,
|
|||
|
||||
PRINTM(MIOCTL, "del virtual intf %s\n", dev->name);
|
||||
ASSERT_RTNL();
|
||||
if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_MONITOR) {
|
||||
if ((handle->mon_if) && (handle->mon_if->mon_ndev == dev)) {
|
||||
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
|
||||
if (MLAN_STATUS_SUCCESS !=
|
||||
woal_set_net_monitor(handle->mon_if->priv,
|
||||
MOAL_IOCTL_WAIT, MFALSE, 0,
|
||||
NULL)) {
|
||||
PRINTM(MERROR,
|
||||
"%s: woal_set_net_monitor fail\n",
|
||||
__func__);
|
||||
ret = -EFAULT;
|
||||
}
|
||||
#endif
|
||||
handle->mon_if = NULL;
|
||||
}
|
||||
unregister_netdevice(dev);
|
||||
LEAVE();
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP) {
|
||||
for (i = 0; i < handle->priv_num; i++) {
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains the uAP CFG80211 specific defines.
|
||||
*
|
||||
*
|
||||
* Copyright 2011-2020 NXP
|
||||
* Copyright 2011-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains definition for extended private IOCTL call.
|
||||
*
|
||||
*
|
||||
* Copyright 2010-2020 NXP
|
||||
* Copyright 2010-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -57,7 +57,7 @@ static const chan_to_freq_t chan_to_freq[] = {
|
|||
{116, 5580, 1}, {120, 5600, 1}, {124, 5620, 1}, {128, 5640, 1},
|
||||
{132, 5660, 1}, {136, 5680, 1}, {140, 5700, 1}, {144, 5720, 1},
|
||||
{149, 5745, 1}, {153, 5765, 1}, {157, 5785, 1}, {161, 5805, 1},
|
||||
{165, 5825, 1},
|
||||
{165, 5825, 1}, {169, 5845, 1}, {173, 5865, 1}, {177, 5885, 1},
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -34,7 +34,8 @@ extern struct semaphore AddRemoveCardSem;
|
|||
Local Variables
|
||||
********************************************************/
|
||||
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || defined(USB8978)
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || \
|
||||
defined(USB8978) || defined(USBNW62X)
|
||||
/** Card-type detection frame response */
|
||||
typedef struct {
|
||||
/** 32-bit ACK+WINNER field */
|
||||
|
@ -93,6 +94,12 @@ static struct usb_device_id woal_usb_table[] = {
|
|||
#ifdef USB9097
|
||||
{NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_1, "NXP WLAN USB Adapter")},
|
||||
{NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_2, "NXP WLAN USB Adapter")},
|
||||
#endif
|
||||
#ifdef USBNW62X
|
||||
{NXP_USB_DEVICE(USBNW62X_VID_1, USBNW62X_PID_1,
|
||||
"NXP WLAN USB Adapter")},
|
||||
{NXP_USB_DEVICE(USBNW62X_VID_1, USBNW62X_PID_2,
|
||||
"NXP WLAN USB Adapter")},
|
||||
#endif
|
||||
/* Terminating entry */
|
||||
{},
|
||||
|
@ -120,6 +127,10 @@ static struct usb_device_id woal_usb_table_skip_fwdnld[] = {
|
|||
#endif
|
||||
#ifdef USB9097
|
||||
{NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_2, "NXP WLAN USB Adapter")},
|
||||
#endif
|
||||
#ifdef USBNW62X
|
||||
{NXP_USB_DEVICE(USBNW62X_VID_1, USBNW62X_PID_2,
|
||||
"NXP WLAN USB Adapter")},
|
||||
#endif
|
||||
/* Terminating entry */
|
||||
{},
|
||||
|
@ -483,7 +494,8 @@ rx_ret:
|
|||
Global Functions
|
||||
********************************************************/
|
||||
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || defined(USB8978)
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || \
|
||||
defined(USB8978) || defined(USBNW62X)
|
||||
/**
|
||||
* @brief Check chip revision
|
||||
*
|
||||
|
@ -775,8 +787,24 @@ static t_u16 woal_update_card_type(t_void *card)
|
|||
woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) ==
|
||||
(__force __le16)USB9097_PID_2) {
|
||||
card_type = CARD_TYPE_USB9097;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_USBIW620,
|
||||
strlen(CARD_USBIW620), strlen(driver_version));
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_USB9097,
|
||||
strlen(CARD_USB9097), strlen(driver_version));
|
||||
moal_memcpy_ext(NULL,
|
||||
driver_version + strlen(INTF_CARDTYPE) +
|
||||
strlen(KERN_VERSION),
|
||||
V17, strlen(V17),
|
||||
strlen(driver_version) - strlen(INTF_CARDTYPE) -
|
||||
strlen(KERN_VERSION));
|
||||
}
|
||||
#endif
|
||||
#ifdef USBNW62X
|
||||
if (woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) ==
|
||||
(__force __le16)USBNW62X_PID_1 ||
|
||||
woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) ==
|
||||
(__force __le16)USBNW62X_PID_2) {
|
||||
card_type = CARD_TYPE_USBNW62X;
|
||||
moal_memcpy_ext(NULL, driver_version, CARD_USBNW62X,
|
||||
strlen(CARD_USBNW62X), strlen(driver_version));
|
||||
moal_memcpy_ext(NULL,
|
||||
driver_version + strlen(INTF_CARDTYPE) +
|
||||
strlen(KERN_VERSION),
|
||||
|
@ -852,6 +880,10 @@ static int woal_usb_probe(struct usb_interface *intf,
|
|||
#ifdef USB9097
|
||||
case (__force __le16)USB9097_PID_1:
|
||||
#endif /* USB9097 */
|
||||
#ifdef USBNW62X
|
||||
case (__force __le16)USBNW62X_PID_1:
|
||||
#endif /* USBNW62X */
|
||||
|
||||
/* If skip FW is set, we must return error so
|
||||
* the next driver can download the FW */
|
||||
if (skip_fwdnld)
|
||||
|
@ -878,6 +910,10 @@ static int woal_usb_probe(struct usb_interface *intf,
|
|||
#ifdef USB9097
|
||||
case (__force __le16)USB9097_PID_2:
|
||||
#endif /* USB9097 */
|
||||
#ifdef USBNW62X
|
||||
case (__force __le16)USBNW62X_PID_2:
|
||||
#endif /* USBNW62X */
|
||||
|
||||
usb_cardp->boot_state = USB_FW_READY;
|
||||
break;
|
||||
}
|
||||
|
@ -1930,7 +1966,8 @@ done:
|
|||
static mlan_status woal_usb_get_fw_name(moal_handle *handle)
|
||||
{
|
||||
mlan_status ret = MLAN_STATUS_SUCCESS;
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || defined(USB8978)
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || \
|
||||
defined(USB8978) || defined(USBNW62X)
|
||||
t_u32 revision_id = 0;
|
||||
t_u32 strap = 0;
|
||||
#endif
|
||||
|
@ -1949,7 +1986,8 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle)
|
|||
goto done;
|
||||
#endif
|
||||
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || defined(USB8978)
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || \
|
||||
defined(USB8978) || defined(USBNW62X)
|
||||
ret = woal_check_chip_revision(handle, &revision_id, &strap);
|
||||
if (ret != MLAN_STATUS_SUCCESS) {
|
||||
PRINTM(MFATAL, "Chip revision check failure!\n");
|
||||
|
@ -2042,6 +2080,17 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
#ifdef USBNW62X
|
||||
if (IS_USBNW62X(handle->card_type)) {
|
||||
if (strap == CARD_TYPE_USB_UART)
|
||||
strcpy(handle->card_info->fw_name,
|
||||
USBUARTNW62X_COMBO_FW_NAME);
|
||||
else
|
||||
strcpy(handle->card_info->fw_name,
|
||||
USBUSBNW62X_COMBO_FW_NAME);
|
||||
}
|
||||
#endif
|
||||
|
||||
done:
|
||||
PRINTM(MCMND, "combo fw:%s wlan fw:%s \n", handle->card_info->fw_name,
|
||||
handle->card_info->fw_name_wlan);
|
||||
|
|
|
@ -89,6 +89,15 @@ Change Log:
|
|||
#define USB9097_PID_2 0x2061
|
||||
#endif /* USB9097 */
|
||||
|
||||
#ifdef USBNW62X
|
||||
/** USB VID 1 */
|
||||
#define USBNW62X_VID_1 0x0471
|
||||
/** USB PID 1 */
|
||||
#define USBNW62X_PID_1 0x020E
|
||||
/** USB PID 2 */
|
||||
#define USBNW62X_PID_2 0x020F
|
||||
#endif /* USBNW62X */
|
||||
|
||||
/** Boot state: FW download */
|
||||
#define USB_FW_DNLD 1
|
||||
/** Boot state: FW ready */
|
||||
|
@ -101,7 +110,7 @@ Change Log:
|
|||
#define MVUSB_RX_DATA_URB 6
|
||||
|
||||
#if defined(USB8997) || defined(USB9098) || defined(USB9097) || \
|
||||
defined(USB8978) || defined(USB8801)
|
||||
defined(USB8978) || defined(USB8801) || defined(USBNW62X)
|
||||
/* Transmit buffer size for chip revision check */
|
||||
#define CHIP_REV_TX_BUF_SIZE 16
|
||||
/* Receive buffer size for chip revision check */
|
||||
|
@ -162,6 +171,13 @@ Change Log:
|
|||
#define USBUSB9097_COMBO_V1_FW_NAME "nxp/usbusbiw620_combo_v1.bin"
|
||||
#endif /* USB9097 */
|
||||
|
||||
#ifdef USBNW62X
|
||||
#define USBNW62X_DEFAULT_COMBO_FW_NAME "nxp/usbusbnw62x_combo.bin"
|
||||
#define USBUARTNW62X_COMBO_FW_NAME "nxp/usbuartnw62x_combo.bin"
|
||||
#define USBUSBNW62X_COMBO_FW_NAME "nxp/usbusbnw62x_combo.bin"
|
||||
#define USBNW62X_DEFAULT_WLAN_FW_NAME "nxp/usbnw62x_wlan.bin"
|
||||
#endif /* USBNW62X */
|
||||
|
||||
/** urb context */
|
||||
typedef struct _urb_context {
|
||||
/** Pointer to moal_handle structure */
|
||||
|
|
|
@ -153,6 +153,8 @@ static const struct iw_priv_args woal_private_args[] = {
|
|||
#endif
|
||||
{WOAL_SLEEP_PARAMS, IW_PRIV_TYPE_INT | 16, IW_PRIV_TYPE_INT | 16,
|
||||
"sleepparams"},
|
||||
{WOAL_NET_MONITOR, IW_PRIV_TYPE_INT | 16, IW_PRIV_TYPE_INT | 16,
|
||||
"netmon"},
|
||||
{WOAL_DFS_TESTING, IW_PRIV_TYPE_INT | 16, IW_PRIV_TYPE_INT | 16,
|
||||
"dfstesting"},
|
||||
{WOAL_MGMT_FRAME_CTRL, IW_PRIV_TYPE_INT | 16, IW_PRIV_TYPE_INT | 16,
|
||||
|
@ -2465,31 +2467,42 @@ done:
|
|||
static mlan_status woal_wext_request_scan(moal_private *priv, t_u8 wait_option,
|
||||
mlan_802_11_ssid *req_ssid)
|
||||
{
|
||||
wlan_user_scan_cfg scan_req;
|
||||
wlan_user_scan_cfg *scan_req;
|
||||
mlan_scan_cfg scan_cfg;
|
||||
mlan_status status;
|
||||
ENTER();
|
||||
if (!woal_is_any_interface_active(priv->phandle)) {
|
||||
LEAVE();
|
||||
return woal_request_scan(priv, wait_option, req_ssid);
|
||||
}
|
||||
scan_req = (wlan_user_scan_cfg *)kmalloc(sizeof(wlan_user_scan_cfg),
|
||||
GFP_KERNEL);
|
||||
if (!scan_req) {
|
||||
PRINTM(MERROR, "Malloc buffer failed\n");
|
||||
LEAVE();
|
||||
return MLAN_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
memset(&scan_cfg, 0, sizeof(scan_cfg));
|
||||
memset(&scan_req, 0, sizeof(scan_req));
|
||||
memset(scan_req, 0, sizeof(wlan_user_scan_cfg));
|
||||
if (req_ssid && req_ssid->ssid_len != 0) {
|
||||
moal_memcpy_ext(priv->phandle, scan_req.ssid_list[0].ssid,
|
||||
moal_memcpy_ext(priv->phandle, scan_req->ssid_list[0].ssid,
|
||||
req_ssid->ssid, req_ssid->ssid_len,
|
||||
MLAN_MAX_SSID_LENGTH);
|
||||
scan_req.ssid_list[0].max_len = 0;
|
||||
scan_req->ssid_list[0].max_len = 0;
|
||||
}
|
||||
woal_get_scan_config(priv, &scan_cfg);
|
||||
if (scan_cfg.scan_chan_gap)
|
||||
scan_req.scan_chan_gap = scan_cfg.scan_chan_gap;
|
||||
scan_req->scan_chan_gap = scan_cfg.scan_chan_gap;
|
||||
else
|
||||
scan_req.scan_chan_gap = priv->phandle->scan_chan_gap;
|
||||
scan_req->scan_chan_gap = priv->phandle->scan_chan_gap;
|
||||
/** indicate FW, gap is optional */
|
||||
if (scan_req.scan_chan_gap && priv->phandle->pref_mac)
|
||||
scan_req.scan_chan_gap |= GAP_FLAG_OPTIONAL;
|
||||
if (scan_req->scan_chan_gap && priv->phandle->pref_mac)
|
||||
scan_req->scan_chan_gap |= GAP_FLAG_OPTIONAL;
|
||||
status = woal_request_userscan(priv, wait_option, scan_req);
|
||||
kfree(scan_req);
|
||||
LEAVE();
|
||||
return woal_request_userscan(priv, wait_option, &scan_req);
|
||||
return status;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* @brief This file contains definition for wireless extension IOCTL call.
|
||||
*
|
||||
*
|
||||
* Copyright 2008-2020 NXP
|
||||
* Copyright 2008-2021 NXP
|
||||
*
|
||||
* This software file (the File) is distributed by NXP
|
||||
* under the terms of the GNU General Public License Version 2, June 1991
|
||||
|
|
|
@ -1,30 +0,0 @@
|
|||
#!/bin/bash
|
||||
# iwpriv mlan0 drvdbg 0x20037
|
||||
# change the mac address
|
||||
./wifidirect/update_mac.sh
|
||||
echo "wfd0 Mac address updated in config/wifidirect.conf"
|
||||
|
||||
|
||||
./wifidirectutl wfd0 wifidirect_config config/wifidirect.conf
|
||||
#ifdef STREAM_2X2
|
||||
iwpriv wfd0 bssrole 1
|
||||
#else
|
||||
# iwpriv wfd0 bssrole 1
|
||||
#endif
|
||||
./uaputl.exe -i wfd0 sys_config config/uaputl_wifidirect.conf
|
||||
#ifdef STREAM_2X2
|
||||
iwpriv wfd0 bssrole 0
|
||||
#else
|
||||
# iwpriv wfd0 bssrole 0
|
||||
#endif
|
||||
# iwpriv wfd0 bssrole 1
|
||||
# change the group owner parameters
|
||||
# either in uaputl_wifidirect.conf or using CLI below
|
||||
#./uaputl.exe -i wfd0 sys_cfg_wpa_passphrase 1234567890
|
||||
#./uaputl.exe -i wfd0 sys_cfg_eapol_gwk_hsk 2000 3
|
||||
#./uaputl.exe -i wfd0 sys_cfg_eapol_pwk_hsk 2000 3
|
||||
# iwpriv wfd0 bssrole 0
|
||||
./wifidirectutl wfd0 wifidirect_mode 1
|
||||
iwpriv wfd0 bssrole 1
|
||||
./wifidirectutl wfd0 wifidirect_mode 2
|
||||
./uaputl.exe -i wfd0 bss_start
|
|
@ -1,25 +0,0 @@
|
|||
#!/bin/bash
|
||||
# iwpriv wfd0 drvdbg 0x20037
|
||||
#change the mac address
|
||||
./wifidirect/update_mac.sh
|
||||
echo "wfd0 Mac address updated in config/wifidirect.conf"
|
||||
|
||||
#ifdef STREAM_2X2
|
||||
iwpriv wfd0 bssrole 1
|
||||
#else
|
||||
# iwpriv wfd0 bssrole 1
|
||||
#endif
|
||||
./uaputl.exe -i wfd0 sys_config config/uaputl_wifidirect.conf
|
||||
#ifdef STREAM_2X2
|
||||
iwpriv wfd0 bssrole 0
|
||||
#else
|
||||
# iwpriv wfd0 bssrole 0
|
||||
#endif
|
||||
./wifidirectutl wfd0 wifidirect_config config/wifidirect.conf
|
||||
# change the passphrase
|
||||
# either in uaputl_wifidirect.conf or using CLI below
|
||||
#./uaputl.exe -i wfd0 sys_cfg_wpa_passphrase 1234567890
|
||||
./wifidirectutl wfd0 wifidirect_mode 1
|
||||
./wifidirectutl wfd0 wifidirect_params_config config/wifidirect.conf
|
||||
./mlanutl wfd0 hostcmd config/bg_scan_wifidirect.conf bgscfg
|
||||
./wifidirectutl wfd0 wifidirect_mode 4
|
|
@ -1,18 +0,0 @@
|
|||
#!/bin/bash
|
||||
iwpriv wfd0 drvdbg 0x20037
|
||||
# change the mac address
|
||||
ifconfig mlan0 hw ether 00:50:43:21:0e:08
|
||||
ifconfig wfd0 hw ether 00:50:43:21:0e:08
|
||||
ifconfig uap0 hw ether 00:50:43:21:0e:08
|
||||
|
||||
iwpriv wfd0 deepsleep 0
|
||||
iwconfig wfd0 power off
|
||||
|
||||
iwpriv wfd0 bssrole 1
|
||||
./uaputl.exe -i wfd0 sys_config config/uaputl_wifidirect.conf
|
||||
iwpriv wfd0 bssrole 0
|
||||
./wifidirectutl wfd0 wifidirect_config config/wifidirect.conf
|
||||
./uaputl.exe -i wfd0 sys_cfg_protocol 32
|
||||
./uaputl.exe -i wfd0 sys_cfg_cipher 8 8
|
||||
./uaputl.exe -i wfd0 sys_cfg_wpa_passphrase 1234567890
|
||||
./wifidirectutl wfd0 wifidirect_mode 1
|
|
@ -1,8 +0,0 @@
|
|||
#!/bin/bash
|
||||
./uaputl.exe -i wfd0 bss_stop
|
||||
sleep 1
|
||||
iwpriv wfd0 bssrole 0
|
||||
./wifidirectutl wfd0 wifidirect_mode 0
|
||||
# IE clear assume index 0, 1
|
||||
./uaputl.exe -i wfd0 sys_cfg_custom_ie 0 0
|
||||
./uaputl.exe -i wfd0 sys_cfg_custom_ie 1 0
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/bash
|
||||
# deauth the GO first
|
||||
./wifidirectutl wfd0 wifidirect_mode 0
|
||||
# IE clear assume index 0, 1
|
||||
./uaputl.exe -i wfd0 sys_cfg_custom_ie 0 0
|
||||
./uaputl.exe -i wfd0 sys_cfg_custom_ie 1 0
|
|
@ -1,16 +0,0 @@
|
|||
#!/bin/bash
|
||||
MAC=`ifconfig wfd0 | grep wfd0 | tr -s ' ' | cut -d ' ' -f5`
|
||||
MAC26=`echo $MAC | cut -d ':' -f2-6`
|
||||
LAA=`echo $MAC | cut -d ':' -f1`
|
||||
LAA=$((0x$LAA+2))
|
||||
if [ $LAA -lt 16 ] ; then
|
||||
LAA=`printf "%X\n" $LAA`
|
||||
MACLAA=0$LAA:$MAC26
|
||||
else
|
||||
LAA=`printf "%X\n" $LAA`
|
||||
MACLAA=$LAA:$MAC26
|
||||
fi
|
||||
sed "s/00:50:43:00:00:00/$MAC/" config/wifidirect.conf > tmp$$
|
||||
mv tmp$$ config/wifidirect.conf
|
||||
sed "s/02:50:43:00:00:00/$MACLAA/" config/wifidirect.conf > tmp$$
|
||||
mv tmp$$ config/wifidirect.conf
|
Loading…
Reference in New Issue