MA-22417 [All platform] Android-14.0 Q2 WCS release patch integrate

Reason:integrate WCS Q2 release patch WiFi driver part to
Android-14.0_6.6.y
Tested:on i.MX 8MQ

mxm_wifiex: update to mxm6x17437.p18 release

Corresponding firmware version:
SDIO-UART W8987 Firmware version 16.92.21.p119.3
PCIE-UART W8997 Firmware version 16.92.21.p119.3
SDIO-UART W8997 Firmware version 16.92.21.p119.3
SDIO-UART IW416 Firmware version 16.92.21.p119.9
SDIO_UART IW612 Firmware version 18.99.3.p5.1
SDIO-UART W8801 Firmware version 14.92.36.p192
SDIO-UART W9098 Firmware version 17.92.1.p149.40
PCIE-UART W9098 Firmware version 17.92.1.p149.40

Change-Id: Ie3c6e93ea626d2b1743bfd778cb4a3789c651e0f
Signed-off-by: Luke Wang <ziniu.wang_1@nxp.com>
This commit is contained in:
Luke Wang 2024-05-08 13:47:24 +08:00 committed by yunjie
parent 5f7a9ac065
commit 4b3672dac5
54 changed files with 2584 additions and 591 deletions

View file

@ -106,7 +106,8 @@ CONFIG_MULTI_CHAN_SUPPORT=y
CONFIG_DUMP_TO_PROC=y CONFIG_DUMP_TO_PROC=y
CONFIG_TASKLET_SUPPORT=y CONFIG_TASKLET_SUPPORT=n
#32bit app over 64bit kernel support #32bit app over 64bit kernel support
@ -154,7 +155,7 @@ APPDIR= $(shell if test -d "mapp"; then echo mapp; fi)
############################################################################# #############################################################################
ccflags-y += -I$(KERNELDIR)/include ccflags-y += -I$(KERNELDIR)/include
ccflags-y += -DMLAN_RELEASE_VERSION='"437.p8"' ccflags-y += -DMLAN_RELEASE_VERSION='"437.p18"'
ccflags-y += -DFPNUM='"92"' ccflags-y += -DFPNUM='"92"'
@ -275,6 +276,10 @@ ifeq ($(CONFIG_SDIW624),y)
CONFIG_SDIO=y CONFIG_SDIO=y
ccflags-y += -DSDIW624 ccflags-y += -DSDIW624
endif endif
ifeq ($(CONFIG_SDAW693),y)
CONFIG_SDIO=y
ccflags-y += -DSDAW693
endif
ifeq ($(CONFIG_SD9177),y) ifeq ($(CONFIG_SD9177),y)
CONFIG_SDIO=y CONFIG_SDIO=y
ccflags-y += -DSD9177 ccflags-y += -DSD9177
@ -335,6 +340,10 @@ ifeq ($(CONFIG_PCIEIW624),y)
CONFIG_PCIE=y CONFIG_PCIE=y
ccflags-y += -DPCIEIW624 ccflags-y += -DPCIEIW624
endif endif
ifeq ($(CONFIG_PCIEAW693),y)
CONFIG_PCIE=y
ccflags-y += -DPCIEAW693
endif
ifeq ($(CONFIG_SDIO),y) ifeq ($(CONFIG_SDIO),y)
ccflags-y += -DSDIO ccflags-y += -DSDIO
ccflags-y += -DSDIO_MMC ccflags-y += -DSDIO_MMC

View file

@ -9,7 +9,7 @@
Goto source code directory wlan_src/. Goto source code directory wlan_src/.
make [clean] build make [clean] build
The driver and utility binaries can be found in ../bin_xxxx directory. The driver and utility binaries can be found in ../bin_xxxx directory.
The driver code supports Linux kernel from 2.6.32 to 6.6.2. The driver code supports Linux kernel from 2.6.32 to 6.7.0.
2) FOR DRIVER INSTALL 2) FOR DRIVER INSTALL
@ -1033,6 +1033,7 @@
Beamforming (0:disable, 1:enable) Beamforming (0:disable, 1:enable)
GreenField Mode (0:disable, 1:enable) GreenField Mode (0:disable, 1:enable)
STBC (0:disable, 1:enable) STBC (0:disable, 1:enable)
Signal Bw (0: 20Mhz, 1: 40Mhz, 4:80Mhz, -1: Set to default)
NumPkt (Set to default value -1) NumPkt (Set to default value -1)
MaxPktExt (Set to default value -1) MaxPktExt (Set to default value -1)
BeamChange (Set to default value -1) BeamChange (Set to default value -1)
@ -1045,7 +1046,7 @@
Example: To start Tx frame with duty cycle, first stop any ongoing Tx Example: To start Tx frame with duty cycle, first stop any ongoing Tx
and then start Tx frame: and then start Tx frame:
echo "tx_frame=0" > /proc/mwlan/adapterX/config echo "tx_frame=0" > /proc/mwlan/adapterX/config
echo "tx_frame=1 7 0xAAA 0x100 1 20 0 0 0 0 0 0 0 05:43:3f:c4:51" > /proc/mwlan/adapterX/config echo "tx_frame=1 7 0xAAA 0x100 1 20 0 0 0 0 0 0 0 0 -1 -1 -1 -1 -1 -1 -1 05:43:3f:c4:51" > /proc/mwlan/adapterX/config
Configure Trigger Frame Configure Trigger Frame
Example: To configure Trigger frame: Example: To configure Trigger frame:

View file

@ -216,7 +216,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
t_u8 nss = 0; t_u8 nss = 0;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0; t_u16 rx_nss = 0;
t_u16 tx_nss = 0; t_u16 tx_nss = 0;
#endif #endif
@ -300,7 +301,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
if (cfg->param.vht_cfg.txrx & MLAN_RADIO_RX) { if (cfg->param.vht_cfg.txrx & MLAN_RADIO_RX) {
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||
@ -335,7 +337,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
nss); nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss)) if ((rx_nss != 0) && (nss > rx_nss))
cfg_value = NO_NSS_SUPPORT; cfg_value = NO_NSS_SUPPORT;
#endif #endif
@ -363,7 +366,8 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
nss); nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss)) if ((tx_nss != 0) && (nss > tx_nss))
cfg_value = NO_NSS_SUPPORT; cfg_value = NO_NSS_SUPPORT;
#endif #endif
@ -789,7 +793,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
t_u16 nss; t_u16 nss;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
#endif #endif
ENTER(); ENTER();
@ -811,7 +816,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
wlan_le16_to_cpu(pvht_cap->vht_cap.mcs_sets.rx_mcs_map); wlan_le16_to_cpu(pvht_cap->vht_cap.mcs_sets.rx_mcs_map);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(priv->adapter->card_type) || if (IS_CARD9098(priv->adapter->card_type) ||
IS_CARDIW624(priv->adapter->card_type) || IS_CARDIW624(priv->adapter->card_type) ||
IS_CARD9097(priv->adapter->card_type) || IS_CARD9097(priv->adapter->card_type) ||
@ -838,7 +844,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss); mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss)) if ((rx_nss != 0) && (nss > rx_nss))
mcs_user = NO_NSS_SUPPORT; mcs_user = NO_NSS_SUPPORT;
#endif #endif
@ -871,7 +878,8 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss); mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss)) if ((tx_nss != 0) && (nss > tx_nss))
mcs_user = NO_NSS_SUPPORT; mcs_user = NO_NSS_SUPPORT;
#endif #endif
@ -1088,7 +1096,8 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc)
t_u8 ret = MFALSE; t_u8 ret = MFALSE;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
IEEEtypes_VHTCap_t *pvht_cap = pbss_desc->pvht_cap; IEEEtypes_VHTCap_t *pvht_cap = pbss_desc->pvht_cap;
MrvlIEtypes_He_cap_t *phecap = MNULL; MrvlIEtypes_He_cap_t *phecap = MNULL;
@ -1099,7 +1108,8 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc)
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (!IS_CARD9098(pmpriv->adapter->card_type) && if (!IS_CARD9098(pmpriv->adapter->card_type) &&
!IS_CARDIW624(pmpriv->adapter->card_type) && !IS_CARDIW624(pmpriv->adapter->card_type) &&
!IS_CARD9097(pmpriv->adapter->card_type) && !IS_CARD9097(pmpriv->adapter->card_type) &&
@ -1155,7 +1165,8 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
t_u8 bw_80p80 = MFALSE; t_u8 bw_80p80 = MFALSE;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0; t_u16 rx_nss = 0;
#endif #endif
@ -1227,7 +1238,8 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
SET_OPER_MODE_80M(pmrvl_oper_mode->oper_mode); SET_OPER_MODE_80M(pmrvl_oper_mode->oper_mode);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||
@ -1246,7 +1258,8 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||

View file

@ -297,7 +297,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
t_u16 len = 0; t_u16 len = 0;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
#endif #endif
MrvlIEtypes_He_cap_t *phecap = MNULL; MrvlIEtypes_He_cap_t *phecap = MNULL;
@ -327,7 +328,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
phe_cap->len = wlan_cpu_to_le16(phe_cap->len); phe_cap->len = wlan_cpu_to_le16(phe_cap->len);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmpriv->adapter->card_type) || if (IS_CARD9098(pmpriv->adapter->card_type) ||
IS_CARD9097(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type) ||
IS_CARDAW693(pmpriv->adapter->card_type)) { IS_CARDAW693(pmpriv->adapter->card_type)) {
@ -350,7 +352,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss)) if ((rx_nss != 0) && (nss > rx_nss))
cfg_value = NO_NSS_SUPPORT; cfg_value = NO_NSS_SUPPORT;
#endif #endif
@ -366,7 +369,8 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss)) if ((tx_nss != 0) && (nss > tx_nss))
cfg_value = NO_NSS_SUPPORT; cfg_value = NO_NSS_SUPPORT;
#endif #endif
@ -403,7 +407,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
t_u8 bw_80p80 = MFALSE; t_u8 bw_80p80 = MFALSE;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
#endif #endif
t_u8 nss = 0; t_u8 nss = 0;
@ -448,7 +453,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
phecap->len = wlan_cpu_to_le16(phecap->len); phecap->len = wlan_cpu_to_le16(phecap->len);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmpriv->adapter->card_type) || if (IS_CARD9098(pmpriv->adapter->card_type) ||
IS_CARDIW624(pmpriv->adapter->card_type) || IS_CARDIW624(pmpriv->adapter->card_type) ||
IS_CARD9097(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type) ||
@ -474,7 +480,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss)) if ((rx_nss != 0) && (nss > rx_nss))
cfg_value = NO_NSS_SUPPORT; cfg_value = NO_NSS_SUPPORT;
#endif #endif
@ -490,7 +497,8 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss); hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss)) if ((tx_nss != 0) && (nss > tx_nss))
cfg_value = NO_NSS_SUPPORT; cfg_value = NO_NSS_SUPPORT;
#endif #endif
@ -1091,6 +1099,7 @@ mlan_status wlan_cmd_twt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
hostcmd_twt_setup *twt_setup_params = MNULL; hostcmd_twt_setup *twt_setup_params = MNULL;
hostcmd_twt_teardown *twt_teardown_params = MNULL; hostcmd_twt_teardown *twt_teardown_params = MNULL;
hostcmd_twt_report *twt_report_params = MNULL; hostcmd_twt_report *twt_report_params = MNULL;
hostcmd_twt_information *twt_information_params = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS; mlan_status ret = MLAN_STATUS_SUCCESS;
ENTER(); ENTER();
@ -1150,6 +1159,17 @@ mlan_status wlan_cmd_twt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
twt_report_params->type = ds_twtcfg->param.twt_report.type; twt_report_params->type = ds_twtcfg->param.twt_report.type;
cmd->size += sizeof(hostcmd_twtcfg->param.twt_report); cmd->size += sizeof(hostcmd_twtcfg->param.twt_report);
break; break;
case MLAN_11AX_TWT_INFORMATION_SUBID:
twt_information_params = &hostcmd_twtcfg->param.twt_information;
// coverity[bad_memset: SUPPRESS]
memset(pmadapter, twt_information_params, 0x00,
sizeof(hostcmd_twtcfg->param.twt_information));
twt_information_params->flow_identifier =
ds_twtcfg->param.twt_information.flow_identifier;
twt_information_params->suspend_duration = wlan_cpu_to_le32(
ds_twtcfg->param.twt_information.suspend_duration);
cmd->size += sizeof(hostcmd_twtcfg->param.twt_information);
break;
default: default:
PRINTM(MERROR, "Unknown subcmd %x\n", ds_twtcfg->sub_id); PRINTM(MERROR, "Unknown subcmd %x\n", ds_twtcfg->sub_id);
ret = MLAN_STATUS_FAILURE; ret = MLAN_STATUS_FAILURE;

View file

@ -638,16 +638,24 @@ wlan_11d_sort_parsed_region_chan(parsed_region_chan_11d_t *parsed_region_chan)
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/ */
static mlan_status wlan_11d_send_domain_info(mlan_private *pmpriv, static mlan_status wlan_11d_send_domain_info(mlan_private *pmpriv,
t_void *pioctl_buf) t_void *pioctl_buf,
t_bool is_op_special_set)
{ {
mlan_status ret = MLAN_STATUS_SUCCESS; mlan_status ret = MLAN_STATUS_SUCCESS;
ENTER(); ENTER();
/* Send cmd to FW to set domain info */ /* Send cmd to FW to set domain info */
if (is_op_special_set) {
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11D_DOMAIN_INFO, ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11D_DOMAIN_INFO,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_buf, HostCmd_ACT_SPC_SET, 0,
MNULL); (t_void *)pioctl_buf, MNULL);
} else {
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11D_DOMAIN_INFO,
HostCmd_ACT_GEN_SET, 0,
(t_void *)pioctl_buf, MNULL);
}
if (ret) if (ret)
PRINTM(MERROR, "11D: Failed to download domain Info\n"); PRINTM(MERROR, "11D: Failed to download domain Info\n");
@ -973,6 +981,8 @@ mlan_status wlan_ret_802_11d_domain_info(mlan_private *pmpriv,
break; break;
case HostCmd_ACT_GEN_GET: case HostCmd_ACT_GEN_GET:
break; break;
case HostCmd_ACT_SPC_SET:
break;
default: default:
PRINTM(MERROR, "11D: Invalid Action:%d\n", domain_info->action); PRINTM(MERROR, "11D: Invalid Action:%d\n", domain_info->action);
ret = MLAN_STATUS_FAILURE; ret = MLAN_STATUS_FAILURE;
@ -1324,7 +1334,7 @@ mlan_status wlan_11d_create_dnld_countryinfo(mlan_private *pmpriv, t_u16 band)
wlan_11d_generate_domain_info(pmadapter, &parsed_region_chan); wlan_11d_generate_domain_info(pmadapter, &parsed_region_chan);
/* Set domain info */ /* Set domain info */
ret = wlan_11d_send_domain_info(pmpriv, MNULL); ret = wlan_11d_send_domain_info(pmpriv, MNULL, MTRUE);
if (ret) { if (ret) {
PRINTM(MERROR, PRINTM(MERROR,
"11D: Error sending domain info to FW\n"); "11D: Error sending domain info to FW\n");
@ -1419,7 +1429,7 @@ mlan_status wlan_11d_parse_dnld_countryinfo(mlan_private *pmpriv,
wlan_11d_generate_domain_info(pmadapter, &region_chan); wlan_11d_generate_domain_info(pmadapter, &region_chan);
/* Set domain info */ /* Set domain info */
ret = wlan_11d_send_domain_info(pmpriv, MNULL); ret = wlan_11d_send_domain_info(pmpriv, MNULL, MTRUE);
if (ret) { if (ret) {
PRINTM(MERROR, PRINTM(MERROR,
"11D: Error sending domain info to FW\n"); "11D: Error sending domain info to FW\n");
@ -1547,7 +1557,7 @@ mlan_status wlan_11d_cfg_domain_info(pmlan_adapter pmadapter,
domain_info->no_of_sub_band, domain_info->no_of_sub_band,
(IEEEtypes_SubbandSet_t *)domain_info->sub_band, (IEEEtypes_SubbandSet_t *)domain_info->sub_band,
domain_info->dfs_region); domain_info->dfs_region);
ret = wlan_11d_send_domain_info(pmpriv, pioctl_req); ret = wlan_11d_send_domain_info(pmpriv, pioctl_req, MFALSE);
if (ret == MLAN_STATUS_SUCCESS) if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING; ret = MLAN_STATUS_PENDING;
@ -1651,7 +1661,7 @@ mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band,
num_sub_band, pdomain_tlv->sub_band, num_sub_band, pdomain_tlv->sub_band,
NXP_DFS_UNKNOWN); NXP_DFS_UNKNOWN);
ret = wlan_11d_send_domain_info(pmpriv, pioctl_buf); ret = wlan_11d_send_domain_info(pmpriv, pioctl_buf, MFALSE);
done: done:
LEAVE(); LEAVE();

View file

@ -3,7 +3,7 @@
* @brief This file contains functions for 802.11H. * @brief This file contains functions for 802.11H.
* *
* *
* Copyright 2008-2021 NXP * Copyright 2008-2021, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -231,8 +231,8 @@ static t_u8 woal_get_bonded_channels(t_u8 pri_chan, t_u8 bw, t_u8 *chan_list)
* *
* @return N/A * @return N/A
*/ */
t_void wlan_11h_set_chan_dfs_state(mlan_private *priv, t_u8 chan, t_u8 bw, static t_void wlan_11h_set_chan_dfs_state(mlan_private *priv, t_u8 chan,
dfs_state_t dfs_state) t_u8 bw, dfs_state_t dfs_state)
{ {
t_u8 n_chan; t_u8 n_chan;
t_u8 chan_list[4] = {0}; t_u8 chan_list[4] = {0};
@ -885,7 +885,7 @@ static t_bool wlan_11h_is_slave_active_on_dfs_chan(mlan_private *priv)
* - MTRUE if radar detection is required * - MTRUE if radar detection is required
* - MFALSE otherwise * - MFALSE otherwise
*/ */
t_bool wlan_11h_is_radar_channel(mlan_private *priv, t_u8 channel) static t_bool wlan_11h_is_radar_channel(mlan_private *priv, t_u8 channel)
{ {
t_bool required = MFALSE; t_bool required = MFALSE;

View file

@ -1469,7 +1469,8 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap,
rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support); rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||
@ -1547,7 +1548,8 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap,
rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support); rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||

View file

@ -127,6 +127,12 @@ static void wlan_11n_form_amsdu_txpd(mlan_private *priv, mlan_buffer *mbuf)
ptx_pd->tx_pkt_type = PKT_TYPE_AMSDU; ptx_pd->tx_pkt_type = PKT_TYPE_AMSDU;
if (mbuf->flags & MLAN_BUF_FLAG_TDLS) if (mbuf->flags & MLAN_BUF_FLAG_TDLS)
ptx_pd->flags = MRVDRV_TxPD_FLAGS_TDLS_PACKET; ptx_pd->flags = MRVDRV_TxPD_FLAGS_TDLS_PACKET;
if (mbuf->flags & MLAN_BUF_FLAG_EASYMESH) {
ptx_pd->flags |= MRVDRV_TxPD_FLAGS_EASYMESH;
memcpy_ext(priv->adapter, ptx_pd->ra_mac, mbuf->mac,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
}
if (ptx_pd->tx_control == 0) if (ptx_pd->tx_control == 0)
/* TxCtrl set by user or default */ /* TxCtrl set by user or default */
ptx_pd->tx_control = priv->pkt_tx_ctrl; ptx_pd->tx_control = priv->pkt_tx_ctrl;
@ -136,6 +142,150 @@ static void wlan_11n_form_amsdu_txpd(mlan_private *priv, mlan_buffer *mbuf)
LEAVE(); LEAVE();
} }
/**
* @brief free pkts in amsdu_txq
*
* @param pmadapter A pointer to mlan_adapter structure
*
* @return N/A
*/
static INLINE void wlan_free_amsdu_txq(pmlan_adapter pmadapter)
{
pmlan_buffer pmbuf;
ENTER();
while ((pmbuf = (pmlan_buffer)util_peek_list(pmadapter->pmoal_handle,
&pmadapter->amsdu_txq,
MNULL, MNULL))) {
util_unlink_list(pmadapter->pmoal_handle, &pmadapter->amsdu_txq,
(pmlan_linked_list)pmbuf, MNULL, MNULL);
wlan_write_data_complete(pmadapter, pmbuf, MLAN_STATUS_FAILURE);
}
LEAVE();
}
#ifdef PCIEAW693
/**
* @brief Add TxPD to AMSDU header
*
* @param priv A pointer to mlan_private structure
* @param pmbuf A pointer to buffer where the TxPD will be formed
* @param amsdu_pkt_len amsdu packet length
*
* @return increased length (TxPD + intf_hr_len + padding for DMA
* alignment)
*/
static t_u16 wlan_form_amsdu_txpd(mlan_private *priv, mlan_buffer *pmbuf,
t_u16 amsdu_pkt_len)
{
mlan_adapter *pmadapter = priv->adapter;
TxPD *ptx_pd;
t_u8 *head_ptr = MNULL;
t_u16 data_len = pmbuf->data_len;
ENTER();
head_ptr = pmbuf->pbuf + pmbuf->data_offset - sizeof(TxPD) -
priv->intf_hr_len;
ptx_pd = (TxPD *)(head_ptr + priv->intf_hr_len);
memset(pmadapter, ptx_pd, 0, sizeof(TxPD));
/* Set the BSS number to TxPD */
ptx_pd->bss_num = GET_BSS_NUM(priv);
ptx_pd->bss_type = priv->bss_type;
ptx_pd->priority = (t_u8)pmbuf->priority;
ptx_pd->tx_pkt_type = PKT_TYPE_AMSDU;
ptx_pd->tx_pkt_length = amsdu_pkt_len;
ptx_pd->tx_pkt_offset = (t_u16)((t_ptr)pmbuf->pbuf +
pmbuf->data_offset - (t_ptr)ptx_pd);
if (pmbuf->flags & MLAN_BUF_FLAG_TDLS)
ptx_pd->flags = MRVDRV_TxPD_FLAGS_TDLS_PACKET;
if (ptx_pd->tx_control == 0)
/* TxCtrl set by user or default */
ptx_pd->tx_control = priv->pkt_tx_ctrl;
if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) {
ptx_pd->flags |= MRVDRV_TxPD_FLAGS_EASYMESH;
memcpy_ext(priv->adapter, ptx_pd->ra_mac, pmbuf->mac,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
}
endian_convert_TxPD(ptx_pd);
/* Adjust the data offset and length to include TxPD in pmbuf */
pmbuf->data_len += pmbuf->data_offset;
pmbuf->data_offset = (t_u32)(head_ptr - pmbuf->pbuf);
pmbuf->data_len -= pmbuf->data_offset;
PRINTM(MDATA, "amsdu_pkt_len=%d, extra_len=%d\n", amsdu_pkt_len,
pmbuf->data_len - data_len);
DBG_HEXDUMP(MDAT_D, "AMSDU TxPD", ptx_pd, sizeof(TxPD));
LEAVE();
return (pmbuf->data_len - data_len);
}
/**
* @brief Form amsdu subframe
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pmbuf A pointer to mlan_buffer
* @param pad Pad
*
* @return Final packet size
*/
static int wlan_form_amsdu_subframe(pmlan_adapter pmadapter, mlan_buffer *pmbuf,
int *pad)
{
int dt_offset, amsdu_buf_offset;
Rfc1042Hdr_t snap = {
0xaa, /* LLC DSAP */
0xaa, /* LLC SSAP */
0x03, /* LLC CTRL */
{0x00, 0x00, 0x00}, /* SNAP OUI */
0x0000 /* SNAP type */
/*
* This field will be overwritten
* later with ethertype
*/
};
t_u8 *amsdu_buf = MNULL;
t_u8 *data = pmbuf->pbuf + pmbuf->data_offset;
int pkt_len = pmbuf->data_len;
ENTER();
pmbuf->data_offset -= sizeof(Rfc1042Hdr_t);
pmbuf->data_len += sizeof(Rfc1042Hdr_t);
amsdu_buf = pmbuf->pbuf + pmbuf->data_offset;
memcpy_ext(pmadapter, amsdu_buf, data, (MLAN_MAC_ADDR_LENGTH)*2,
(MLAN_MAC_ADDR_LENGTH)*2);
dt_offset = amsdu_buf_offset = (MLAN_MAC_ADDR_LENGTH)*2;
snap.snap_type = *(t_u16 *)(data + dt_offset);
dt_offset += sizeof(t_u16);
*(t_u16 *)(amsdu_buf + amsdu_buf_offset) =
mlan_htons(pkt_len + LLC_SNAP_LEN -
((2 * MLAN_MAC_ADDR_LENGTH) + sizeof(t_u16)));
amsdu_buf_offset += sizeof(t_u16);
memcpy_ext(pmadapter, amsdu_buf + amsdu_buf_offset, &snap, LLC_SNAP_LEN,
LLC_SNAP_LEN);
amsdu_buf_offset += LLC_SNAP_LEN;
*pad = (((pkt_len + LLC_SNAP_LEN) & 3)) ?
(4 - (((pkt_len + LLC_SNAP_LEN)) & 3)) :
0;
pmbuf->data_len += *pad;
DBG_HEXDUMP(MDAT_D, "AMSDU subframe", pmbuf->pbuf + pmbuf->data_offset,
MIN(pmbuf->data_len, MAX_DATA_DUMP_LEN));
PRINTM(MDATA, "AMSDU subframe len=%d\n", pkt_len + LLC_SNAP_LEN + *pad);
LEAVE();
return pkt_len + LLC_SNAP_LEN + *pad;
}
#endif
/** /**
* @brief Update the TxPktLength field in TxPD after the complete AMSDU * @brief Update the TxPktLength field in TxPD after the complete AMSDU
* packet is formed * packet is formed
@ -376,6 +526,7 @@ mlan_status wlan_11n_deaggregate_pkt(mlan_private *priv, pmlan_buffer pmbuf)
daggr_mbuf->data_len = pkt_len; daggr_mbuf->data_len = pkt_len;
daggr_mbuf->in_ts_sec = pmbuf->in_ts_sec; daggr_mbuf->in_ts_sec = pmbuf->in_ts_sec;
daggr_mbuf->in_ts_usec = pmbuf->in_ts_usec; daggr_mbuf->in_ts_usec = pmbuf->in_ts_usec;
daggr_mbuf->flags = pmbuf->flags;
daggr_mbuf->extra_ts_sec = pmbuf->extra_ts_sec; daggr_mbuf->extra_ts_sec = pmbuf->extra_ts_sec;
daggr_mbuf->extra_ts_usec = pmbuf->extra_ts_usec; daggr_mbuf->extra_ts_usec = pmbuf->extra_ts_usec;
daggr_mbuf->pparent = pmbuf; daggr_mbuf->pparent = pmbuf;
@ -399,6 +550,10 @@ mlan_status wlan_11n_deaggregate_pkt(mlan_private *priv, pmlan_buffer pmbuf)
} }
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) { if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) {
if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH)
memcpy_ext(priv->adapter, daggr_mbuf->mac,
pmbuf->mac, MLAN_MAC_ADDR_LENGTH,
MLAN_MAC_ADDR_LENGTH);
ret = wlan_uap_recv_packet(priv, daggr_mbuf); ret = wlan_uap_recv_packet(priv, daggr_mbuf);
} else { } else {
#endif /* UAP_SUPPORT */ #endif /* UAP_SUPPORT */
@ -475,6 +630,146 @@ done:
return ret; return ret;
} }
#ifdef PCIEAW693
/**
* @brief Send amsdu subframe list to interface
*
* @param priv A pointer to mlan_private structure
* @param pra_list Pointer to the RA List table containing the pointers
* to packets.
* @param headroom Any interface specific headroom that may be need. TxPD
* will be formed leaving this headroom.
* @param ptrindex Pointer index
*
* @return Final packet size or MLAN_STATUS_FAILURE
*/
int wlan_send_amsdu_subframe_list(mlan_private *priv, raListTbl *pra_list,
int headroom, int ptrindex)
{
int pkt_size = 0;
pmlan_adapter pmadapter = priv->adapter;
mlan_buffer *pmbuf_src;
mlan_buffer *pmbuf_last = MNULL;
mlan_buffer *pmbuf_first = MNULL;
int pad = 0;
mlan_status ret = MLAN_STATUS_SUCCESS;
#ifdef DEBUG_LEVEL1
t_u32 sec = 0, usec = 0;
#endif
t_u32 max_amsdu_size = MIN(pra_list->max_amsdu, pmadapter->tx_buf_size);
t_u32 max_msdu_count = 0;
t_u32 msdu_in_tx_amsdu_cnt = 0;
ENTER();
max_msdu_count = pmadapter->ops.get_max_msdu_cnt(pmadapter);
pmbuf_src = (pmlan_buffer)util_peek_list(
pmadapter->pmoal_handle, &pra_list->buf_head, MNULL, MNULL);
if (pmbuf_src) {
pmbuf_first = pmbuf_src;
} else {
pmadapter->callbacks.moal_spin_unlock(
pmadapter->pmoal_handle, priv->wmm.ra_list_spinlock);
goto exit;
}
while (pmbuf_src &&
((pkt_size + (pmbuf_src->data_len + LLC_SNAP_LEN) + headroom) <=
max_amsdu_size) &&
(msdu_in_tx_amsdu_cnt < max_msdu_count)) {
pmbuf_src =
(pmlan_buffer)util_dequeue_list(pmadapter->pmoal_handle,
&pra_list->buf_head,
MNULL, MNULL);
/* Collects TP statistics */
if (pmadapter->tp_state_on && (pkt_size > sizeof(TxPD)))
pmadapter->callbacks.moal_tp_accounting(
pmadapter->pmoal_handle, pmbuf_src, 3);
pra_list->total_pkts--;
/* decrement for every PDU taken from the list */
priv->wmm.pkts_queued[ptrindex]--;
util_scalar_decrement(pmadapter->pmoal_handle,
&priv->wmm.tx_pkts_queued, MNULL, MNULL);
pmadapter->callbacks.moal_spin_unlock(
pmadapter->pmoal_handle, priv->wmm.ra_list_spinlock);
if (pmbuf_src) {
pkt_size += wlan_form_amsdu_subframe(pmadapter,
pmbuf_src, &pad);
util_enqueue_list_tail(pmadapter->pmoal_handle,
&pmadapter->amsdu_txq,
(pmlan_linked_list)pmbuf_src,
MNULL, MNULL);
pmbuf_last = pmbuf_src;
priv->msdu_in_tx_amsdu_cnt++;
msdu_in_tx_amsdu_cnt++;
}
pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle,
priv->wmm.ra_list_spinlock);
if (!wlan_is_ralist_valid(priv, pra_list, ptrindex)) {
pmadapter->callbacks.moal_spin_unlock(
pmadapter->pmoal_handle,
priv->wmm.ra_list_spinlock);
LEAVE();
return MLAN_STATUS_FAILURE;
}
pmbuf_src =
(pmlan_buffer)util_peek_list(pmadapter->pmoal_handle,
&pra_list->buf_head, MNULL,
MNULL);
}
pmadapter->callbacks.moal_spin_unlock(pmadapter->pmoal_handle,
priv->wmm.ra_list_spinlock);
/* Last AMSDU packet does not need padding */
pkt_size -= pad;
pmbuf_last->data_len -= pad;
pkt_size += wlan_form_amsdu_txpd(priv, pmbuf_first, pkt_size);
/* Collects TP statistics */
if (pmadapter->tp_state_on) {
mlan_buffer mbuf;
mbuf.data_len = pkt_size;
pmadapter->callbacks.moal_tp_accounting(pmadapter->pmoal_handle,
&mbuf, 4);
pmadapter->callbacks.moal_tp_accounting_rx_param(
pmadapter->pmoal_handle, 5, msdu_in_tx_amsdu_cnt);
}
/* Drop Tx packets at drop point 4 */
if (pmadapter->tp_state_drop_point == 4) {
wlan_free_amsdu_txq(pmadapter);
goto exit;
}
ret = pmadapter->ops.send_data_list(pmadapter, MLAN_TYPE_DATA,
msdu_in_tx_amsdu_cnt, pkt_size);
if (ret != MLAN_STATUS_RESOURCE) {
pmadapter->callbacks.moal_spin_lock(pmadapter->pmoal_handle,
priv->wmm.ra_list_spinlock);
if (wlan_is_ralist_valid(priv, pra_list, ptrindex)) {
priv->wmm.packets_out[ptrindex]++;
priv->wmm.tid_tbl_ptr[ptrindex].ra_list_curr = pra_list;
}
pmadapter->bssprio_tbl[priv->bss_priority].bssprio_cur =
pmadapter->bssprio_tbl[priv->bss_priority]
.bssprio_cur->pnext;
pmadapter->callbacks.moal_spin_unlock(
pmadapter->pmoal_handle, priv->wmm.ra_list_spinlock);
}
PRINTM_GET_SYS_TIME(MDATA, &sec, &usec);
PRINTM_NETINTF(MDATA, priv);
PRINTM(MDATA, "%lu.%06lu : Data => FW\n", sec, usec);
priv->amsdu_tx_cnt++;
exit:
LEAVE();
return pkt_size;
}
#endif
/** /**
* @brief Aggregate multiple packets into one single AMSDU packet * @brief Aggregate multiple packets into one single AMSDU packet
* *
@ -509,6 +804,12 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list,
PRINTM(MDAT_D, "Handling Aggr packet\n"); PRINTM(MDAT_D, "Handling Aggr packet\n");
#ifdef PCIEAW693
if (IS_PCIEAW693(pmadapter->card_type)) {
return wlan_send_amsdu_subframe_list(priv, pra_list, headroom,
ptrindex);
}
#endif
pmbuf_src = (pmlan_buffer)util_peek_list( pmbuf_src = (pmlan_buffer)util_peek_list(
pmadapter->pmoal_handle, &pra_list->buf_head, MNULL, MNULL); pmadapter->pmoal_handle, &pra_list->buf_head, MNULL, MNULL);
if (pmbuf_src) { if (pmbuf_src) {
@ -540,6 +841,12 @@ int wlan_11n_aggregate_pkt(mlan_private *priv, raListTbl *pra_list,
if (pmbuf_src->flags & MLAN_BUF_FLAG_TCP_ACK) if (pmbuf_src->flags & MLAN_BUF_FLAG_TCP_ACK)
pmbuf_aggr->flags |= MLAN_BUF_FLAG_TCP_ACK; pmbuf_aggr->flags |= MLAN_BUF_FLAG_TCP_ACK;
if (pmbuf_src->flags & MLAN_BUF_FLAG_EASYMESH) {
pmbuf_aggr->flags |= MLAN_BUF_FLAG_EASYMESH;
memcpy_ext(priv->adapter, pmbuf_aggr->mac,
pmbuf_src->mac, MLAN_MAC_ADDR_LENGTH,
MLAN_MAC_ADDR_LENGTH);
}
/* Form AMSDU */ /* Form AMSDU */
wlan_11n_form_amsdu_txpd(priv, pmbuf_aggr); wlan_11n_form_amsdu_txpd(priv, pmbuf_aggr);
pkt_size = sizeof(TxPD); pkt_size = sizeof(TxPD);

View file

@ -5,7 +5,7 @@
* related code * related code
* *
* *
* Copyright 2009-2023 NXP * Copyright 2009-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -2181,7 +2181,7 @@ int wlan_get_rate_index(pmlan_adapter pmadapter, t_u16 *rate_bitmap, int size)
* *
* @return BAND_B|BAND_G|BAND_A * @return BAND_B|BAND_G|BAND_A
*/ */
t_u16 wlan_convert_config_bands(t_u16 config_bands) static t_u16 wlan_convert_config_bands(t_u16 config_bands)
{ {
t_u16 bands = 0; t_u16 bands = 0;
if (config_bands & BAND_B) if (config_bands & BAND_B)

View file

@ -4,7 +4,7 @@
* @brief This file contains the handling of CMD/EVENT in MLAN * @brief This file contains the handling of CMD/EVENT in MLAN
* *
* *
* Copyright 2009-2023 NXP * Copyright 2009-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -252,7 +252,7 @@ done:
* *
* @return N/A * @return N/A
*/ */
t_void wlan_flush_ext_cmd_pending_queue(pmlan_adapter pmadapter) static t_void wlan_flush_ext_cmd_pending_queue(pmlan_adapter pmadapter)
{ {
cmd_ctrl_node *pcmd_node = MNULL; cmd_ctrl_node *pcmd_node = MNULL;
HostCmd_DS_COMMAND *pcmd = MNULL; HostCmd_DS_COMMAND *pcmd = MNULL;
@ -1357,6 +1357,11 @@ static mlan_status wlan_dnld_cmd_to_fw(mlan_private *pmpriv,
if (pcmd->command == HostCmd_CMD_802_11_SCAN_EXT) if (pcmd->command == HostCmd_CMD_802_11_SCAN_EXT)
pmadapter->scan_state |= wlan_get_ext_scan_state(pcmd); pmadapter->scan_state |= wlan_get_ext_scan_state(pcmd);
if (pmpriv->bss_mode == MLAN_BSS_MODE_INFRA &&
pmpriv->media_connected &&
(pcmd->command == HostCmd_CMD_802_11_DEAUTHENTICATE ||
pcmd->command == HostCmd_CMD_802_11_DISASSOCIATE))
wlan_clean_txrx(pmpriv);
if (pmpriv->bss_mode == MLAN_BSS_MODE_INFRA && if (pmpriv->bss_mode == MLAN_BSS_MODE_INFRA &&
pmpriv->media_connected && pmpriv->media_connected &&
@ -2209,7 +2214,8 @@ done:
* *
* @return N/A * @return N/A
*/ */
void wlan_handle_cmd_error_in_pre_aleep(mlan_adapter *pmadapter, t_u16 cmd_no) static void wlan_handle_cmd_error_in_pre_aleep(mlan_adapter *pmadapter,
t_u16 cmd_no)
{ {
cmd_ctrl_node *pcmd_node = MNULL; cmd_ctrl_node *pcmd_node = MNULL;
ENTER(); ENTER();
@ -2442,7 +2448,8 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter)
if (IS_PCIE(pmadapter->card_type) && if (IS_PCIE(pmadapter->card_type) &&
cmdresp_no == HostCmd_CMD_FUNC_SHUTDOWN && cmdresp_no == HostCmd_CMD_FUNC_SHUTDOWN &&
pmadapter->pwarm_reset_ioctl_req) { pmadapter->pwarm_reset_ioctl_req) {
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->use_adma) if (pmadapter->pcard_pcie->reg->use_adma)
#endif #endif
wlan_pcie_init_fw(pmadapter); wlan_pcie_init_fw(pmadapter);
@ -2992,7 +2999,8 @@ t_void wlan_cancel_pending_ioctl(pmlan_adapter pmadapter,
* *
* @return N/A * @return N/A
*/ */
t_void wlan_fill_hal_wifi_rate(pmlan_private pmpriv, mlan_wifi_rate *pmlan_rate, static t_void wlan_fill_hal_wifi_rate(pmlan_private pmpriv,
mlan_wifi_rate *pmlan_rate,
wifi_rate *prate) wifi_rate *prate)
{ {
t_u8 index = 0; t_u8 index = 0;
@ -5157,7 +5165,7 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter)
(t_u8)(pmadapter->init_para.drcs_chantime_mode >> 8); (t_u8)(pmadapter->init_para.drcs_chantime_mode >> 8);
/* switchtime use default value in fw*/ /* switchtime use default value in fw*/
drcs_init_cfg[0].switchtime = 10; drcs_init_cfg[0].switchtime = 10;
drcs_init_cfg[0].undozetime = 5; drcs_init_cfg[0].rx_wait_time = 5;
drcs_init_cfg[0].mode = drcs_init_cfg[0].mode =
(t_u8)(pmadapter->init_para.drcs_chantime_mode); (t_u8)(pmadapter->init_para.drcs_chantime_mode);
drcs_init_cfg[1].chan_idx = 0x2; drcs_init_cfg[1].chan_idx = 0x2;
@ -5165,7 +5173,7 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter)
(t_u8)(pmadapter->init_para.drcs_chantime_mode >> 24); (t_u8)(pmadapter->init_para.drcs_chantime_mode >> 24);
/* switchtime use default value in fw*/ /* switchtime use default value in fw*/
drcs_init_cfg[1].switchtime = 10; drcs_init_cfg[1].switchtime = 10;
drcs_init_cfg[1].undozetime = 5; drcs_init_cfg[1].rx_wait_time = 5;
drcs_init_cfg[1].mode = drcs_init_cfg[1].mode =
(t_u8)(pmadapter->init_para.drcs_chantime_mode >> 16); (t_u8)(pmadapter->init_para.drcs_chantime_mode >> 16);
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_DRCS_CONFIG, ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_DRCS_CONFIG,
@ -5828,14 +5836,14 @@ mlan_status wlan_cmd_drcs_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
wlan_cpu_to_le16(drcs_cfg->chan_idx); wlan_cpu_to_le16(drcs_cfg->chan_idx);
channel_time_slicing->chantime = drcs_cfg->chantime; channel_time_slicing->chantime = drcs_cfg->chantime;
channel_time_slicing->switchtime = drcs_cfg->switchtime; channel_time_slicing->switchtime = drcs_cfg->switchtime;
channel_time_slicing->undozetime = drcs_cfg->undozetime; channel_time_slicing->rx_wait_time = drcs_cfg->rx_wait_time;
channel_time_slicing->mode = drcs_cfg->mode; channel_time_slicing->mode = drcs_cfg->mode;
PRINTM(MCMND, PRINTM(MCMND,
"Set multi-channel: chan_idx=%d chantime=%d switchtime=%d undozetime=%d mode=%d\n", "Set multi-channel: chan_idx=%d chantime=%d switchtime=%d rx_wait_time=%d mode=%d\n",
channel_time_slicing->chan_idx, channel_time_slicing->chan_idx,
channel_time_slicing->chantime, channel_time_slicing->chantime,
channel_time_slicing->switchtime, channel_time_slicing->switchtime,
channel_time_slicing->undozetime, channel_time_slicing->rx_wait_time,
channel_time_slicing->mode); channel_time_slicing->mode);
cmd->size = wlan_cpu_to_le16(S_DS_GEN + cmd->size = wlan_cpu_to_le16(S_DS_GEN +
sizeof(HostCmd_DS_DRCS_CFG)); sizeof(HostCmd_DS_DRCS_CFG));
@ -5852,14 +5860,16 @@ mlan_status wlan_cmd_drcs_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
wlan_cpu_to_le16(drcs_cfg->chan_idx); wlan_cpu_to_le16(drcs_cfg->chan_idx);
channel_time_slicing->chantime = drcs_cfg->chantime; channel_time_slicing->chantime = drcs_cfg->chantime;
channel_time_slicing->switchtime = drcs_cfg->switchtime; channel_time_slicing->switchtime = drcs_cfg->switchtime;
channel_time_slicing->undozetime = drcs_cfg->undozetime; // coverity[overflow_sink:SUPPRESS]
channel_time_slicing->rx_wait_time =
drcs_cfg->rx_wait_time;
channel_time_slicing->mode = drcs_cfg->mode; channel_time_slicing->mode = drcs_cfg->mode;
PRINTM(MCMND, PRINTM(MCMND,
"Set multi-channel: chan_idx=%d chantime=%d switchtime=%d undozetime=%d mode=%d\n", "Set multi-channel: chan_idx=%d chantime=%d switchtime=%d rx_wait_time=%d mode=%d\n",
channel_time_slicing->chan_idx, channel_time_slicing->chan_idx,
channel_time_slicing->chantime, channel_time_slicing->chantime,
channel_time_slicing->switchtime, channel_time_slicing->switchtime,
channel_time_slicing->undozetime, channel_time_slicing->rx_wait_time,
channel_time_slicing->mode); channel_time_slicing->mode);
cmd->size += wlan_cpu_to_le16( cmd->size += wlan_cpu_to_le16(
sizeof(MrvlTypes_DrcsTimeSlice_t)); sizeof(MrvlTypes_DrcsTimeSlice_t));
@ -5910,15 +5920,15 @@ mlan_status wlan_ret_drcs_cfg(pmlan_private pmpriv,
channel_time_slicing->chantime; channel_time_slicing->chantime;
pcfg->param.drcs_cfg[0].switchtime = pcfg->param.drcs_cfg[0].switchtime =
channel_time_slicing->switchtime; channel_time_slicing->switchtime;
pcfg->param.drcs_cfg[0].undozetime = pcfg->param.drcs_cfg[0].rx_wait_time =
channel_time_slicing->undozetime; channel_time_slicing->rx_wait_time;
pcfg->param.drcs_cfg[0].mode = channel_time_slicing->mode; pcfg->param.drcs_cfg[0].mode = channel_time_slicing->mode;
PRINTM(MCMND, PRINTM(MCMND,
"multi-channel: chan_idx=%d chantime=%d switchtime=%d undozetime=%d mode=%d\n", "multi-channel: chan_idx=%d chantime=%d switchtime=%d rx_wait_time=%d mode=%d\n",
pcfg->param.drcs_cfg[0].chan_idx, pcfg->param.drcs_cfg[0].chan_idx,
channel_time_slicing->chantime, channel_time_slicing->chantime,
channel_time_slicing->switchtime, channel_time_slicing->switchtime,
channel_time_slicing->undozetime, channel_time_slicing->rx_wait_time,
channel_time_slicing->mode); channel_time_slicing->mode);
pioctl_buf->buf_len = sizeof(mlan_ds_drcs_cfg); pioctl_buf->buf_len = sizeof(mlan_ds_drcs_cfg);
/*Channel for chan_idx 1 and 2 have different parameters*/ /*Channel for chan_idx 1 and 2 have different parameters*/
@ -5941,13 +5951,13 @@ mlan_status wlan_ret_drcs_cfg(pmlan_private pmpriv,
drcs_cfg1->chantime = channel_time_slicing1->chantime; drcs_cfg1->chantime = channel_time_slicing1->chantime;
drcs_cfg1->switchtime = drcs_cfg1->switchtime =
channel_time_slicing1->switchtime; channel_time_slicing1->switchtime;
drcs_cfg1->undozetime = drcs_cfg1->rx_wait_time =
channel_time_slicing1->undozetime; channel_time_slicing1->rx_wait_time;
drcs_cfg1->mode = channel_time_slicing1->mode; drcs_cfg1->mode = channel_time_slicing1->mode;
PRINTM(MCMND, PRINTM(MCMND,
"multi-channel: chan_idx=%d chantime=%d switchtime=%d undozetime=%d mode=%d\n", "multi-channel: chan_idx=%d chantime=%d switchtime=%d rx_wait_time=%d mode=%d\n",
drcs_cfg1->chan_idx, drcs_cfg1->chantime, drcs_cfg1->chan_idx, drcs_cfg1->chantime,
drcs_cfg1->switchtime, drcs_cfg1->undozetime, drcs_cfg1->switchtime, drcs_cfg1->rx_wait_time,
drcs_cfg1->mode); drcs_cfg1->mode);
pioctl_buf->buf_len += sizeof(mlan_ds_drcs_cfg); pioctl_buf->buf_len += sizeof(mlan_ds_drcs_cfg);
} }
@ -6307,7 +6317,8 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
wlan_show_devmcssupport(pmadapter, pmadapter->hw_dev_mcs_support); wlan_show_devmcssupport(pmadapter, pmadapter->hw_dev_mcs_support);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
pmadapter->user_htstream = pmadapter->hw_dev_mcs_support; pmadapter->user_htstream = pmadapter->hw_dev_mcs_support;
/** separate stream config for 2.4G and 5G, will be changed according to /** separate stream config for 2.4G and 5G, will be changed according to
* antenna cfg*/ * antenna cfg*/
@ -7484,7 +7495,8 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode); t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
mlan_adapter *pmadapter = pmpriv->adapter; mlan_adapter *pmadapter = pmpriv->adapter;
#endif #endif
typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 { typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 {
@ -7514,7 +7526,8 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
wlan_le16_to_cpu(pantenna->action_rx), rx_ant_mode); wlan_le16_to_cpu(pantenna->action_rx), rx_ant_mode);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
defined(SDIW624) || defined(PCIEIW624) || defined(USBIW624) defined(SDIW624) || defined(SDAW693) || defined(PCIEAW693) || \
defined(PCIEIW624) || defined(USBIW624)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) ||
@ -7589,7 +7602,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
mlan_ds_reg_rw *reg_rw; mlan_ds_reg_rw *reg_rw;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
MrvlIEtypes_Reg_type_t *tlv; MrvlIEtypes_Reg_type_t *tlv;
mlan_adapter *pmadapter = pmpriv->adapter; mlan_adapter *pmadapter = pmpriv->adapter;
#endif #endif
@ -7608,7 +7622,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
mac_reg->value = wlan_cpu_to_le32(reg_rw->value); mac_reg->value = wlan_cpu_to_le32(reg_rw->value);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_MAC2) && if ((reg_rw->type == MLAN_REG_MAC2) &&
(IS_CARD9098(pmadapter->card_type) || (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
@ -7650,7 +7665,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
bbp_reg->value = (t_u8)reg_rw->value; bbp_reg->value = (t_u8)reg_rw->value;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_BBP2) && if ((reg_rw->type == MLAN_REG_BBP2) &&
(IS_CARD9098(pmadapter->card_type) || (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
@ -7681,7 +7697,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
rf_reg->value = (t_u8)reg_rw->value; rf_reg->value = (t_u8)reg_rw->value;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_RF2) && if ((reg_rw->type == MLAN_REG_RF2) &&
(IS_CARD9098(pmadapter->card_type) || (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||
@ -7747,7 +7764,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
bca_reg->value = wlan_cpu_to_le32(reg_rw->value); bca_reg->value = wlan_cpu_to_le32(reg_rw->value);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_BCA2) && if ((reg_rw->type == MLAN_REG_BCA2) &&
(IS_CARD9098(pmadapter->card_type) || (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(pmadapter->card_type) || IS_CARDIW624(pmadapter->card_type) ||

View file

@ -396,7 +396,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
/** Black bird card type */ /** Black bird card type */
#define CARD_TYPE_AW693 0x0c #define CARD_TYPE_AW693 0x0c
/** IW615 card type */ /** IW615 card type */
#define CARD_TYPE_IW615 0x0c #define CARD_TYPE_IW615 0x0d
/** 9098 A0 reverion num */ /** 9098 A0 reverion num */
#define CHIP_9098_REV_A0 1 #define CHIP_9098_REV_A0 1
@ -667,6 +667,7 @@ typedef enum {
#define MEVT_D MBIT(18) #define MEVT_D MBIT(18)
#define MFW_D MBIT(19) #define MFW_D MBIT(19)
#define MIF_D MBIT(20) #define MIF_D MBIT(20)
#define MFWDP_D MBIT(21)
#define MENTRY MBIT(28) #define MENTRY MBIT(28)
#define MWARN MBIT(29) #define MWARN MBIT(29)

View file

@ -1352,9 +1352,10 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_He_Op_t {
#define IS_FW_SUPPORT_EMBEDDED_OWE(_adapter) \ #define IS_FW_SUPPORT_EMBEDDED_OWE(_adapter) \
(_adapter->fw_cap_info & FW_CAPINFO_EMBEDDED_OWE_SUPPORT) (_adapter->fw_cap_info & FW_CAPINFO_EMBEDDED_OWE_SUPPORT)
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SDAW693) || defined(SD9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(USB9098) || defined(PCIE9097) || defined(USB9097) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDIW624) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
/* TLV type: reg type */ /* TLV type: reg type */
#define TLV_TYPE_REG_ACCESS_CTRL (PROPRIETARY_TLV_BASE_ID + 0x13C) /* 0x023c*/ #define TLV_TYPE_REG_ACCESS_CTRL (PROPRIETARY_TLV_BASE_ID + 0x13C) /* 0x023c*/
/** MrvlIEtypes_Reg_type_t*/ /** MrvlIEtypes_Reg_type_t*/
@ -1445,6 +1446,8 @@ typedef enum _ENH_PS_MODES {
#define HostCmd_ACT_GEN_GET 0x0000 #define HostCmd_ACT_GEN_GET 0x0000
/** General purpose action : Set */ /** General purpose action : Set */
#define HostCmd_ACT_GEN_SET 0x0001 #define HostCmd_ACT_GEN_SET 0x0001
/** Special purpose action : Set */
#define HostCmd_ACT_SPC_SET 0x8001
/** General purpose action : Set Default */ /** General purpose action : Set Default */
#define HostCmd_ACT_GEN_SET_DEFAULT 0x0002 #define HostCmd_ACT_GEN_SET_DEFAULT 0x0002
/** General purpose action : Get_Current */ /** General purpose action : Get_Current */
@ -4754,6 +4757,22 @@ typedef MLAN_PACK_START struct _hostcmd_twt_report {
/** TWT report payload for FW response to fill */ /** TWT report payload for FW response to fill */
t_u8 data[36]; t_u8 data[36];
} MLAN_PACK_END hostcmd_twt_report, *phostcmd_twt_report; } MLAN_PACK_END hostcmd_twt_report, *phostcmd_twt_report;
/** Type definition of hostcmd_twt_teardown */
typedef struct MLAN_PACK_START _hostcmd_twt_information {
/** TWT Flow Identifier. Range: [0-7] */
t_u8 flow_identifier;
/** Suspend Duration. Range: [0-UINT32_MAX]
* 0:Suspend forever;
* Else:Suspend agreement for specific duration in milli seconds,
* after than resume the agreement and enter SP immediately
*/
t_u32 suspend_duration;
/** TWT Information State. Set to 0 by driver, filled by FW in response
*/
t_u8 twt_information_state;
} MLAN_PACK_END hostcmd_twt_information, *phostcmd_twt_information;
/** HostCmd_DS_TWT_CFG */ /** HostCmd_DS_TWT_CFG */
typedef MLAN_PACK_START struct _HostCmd_DS_TWT_CFG { typedef MLAN_PACK_START struct _HostCmd_DS_TWT_CFG {
/** Action */ /** Action */
@ -4769,6 +4788,10 @@ typedef MLAN_PACK_START struct _HostCmd_DS_TWT_CFG {
hostcmd_twt_teardown twt_teardown; hostcmd_twt_teardown twt_teardown;
/** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */ /** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */
hostcmd_twt_report twt_report; hostcmd_twt_report twt_report;
/** TWT Information config for Sub ID:
* MLAN_11AX_TWT_INFORMATION_SUBID
*/
hostcmd_twt_information twt_information;
} param; } param;
} MLAN_PACK_END HostCmd_DS_TWT_CFG; } MLAN_PACK_END HostCmd_DS_TWT_CFG;
@ -6441,7 +6464,7 @@ typedef MLAN_PACK_START struct _MrvlTypes_DrcsTimeSlice_t {
/** Channel swith time (in TU) for chan_idx*/ /** Channel swith time (in TU) for chan_idx*/
t_u8 switchtime; t_u8 switchtime;
/** Undoze time (in TU) for chan_idx*/ /** Undoze time (in TU) for chan_idx*/
t_u8 undozetime; t_u8 rx_wait_time;
/** Rx traffic control scheme when channel switch*/ /** Rx traffic control scheme when channel switch*/
/** only valid for GC/STA interface*/ /** only valid for GC/STA interface*/
t_u8 mode; t_u8 mode;

View file

@ -976,7 +976,8 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter)
EVT_RW_PTR_ROLLOVER_IND; EVT_RW_PTR_ROLLOVER_IND;
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->use_adma) { if (pmadapter->pcard_pcie->reg->use_adma) {
pmadapter->pcard_pcie->rxbd_wrptr = pmadapter->pcard_pcie->rxbd_wrptr =
pmadapter->pcard_pcie->txrx_bd_size; pmadapter->pcard_pcie->txrx_bd_size;
@ -1187,6 +1188,9 @@ mlan_status wlan_init_lock_list(pmlan_adapter pmadapter)
util_init_list_head((t_void *)pmadapter->pmoal_handle, util_init_list_head((t_void *)pmadapter->pmoal_handle,
&pmadapter->rx_data_queue, MTRUE, &pmadapter->rx_data_queue, MTRUE,
pmadapter->callbacks.moal_init_lock); pmadapter->callbacks.moal_init_lock);
util_init_list_head((t_void *)pmadapter->pmoal_handle,
&pmadapter->amsdu_txq, MTRUE,
pmadapter->callbacks.moal_init_lock);
util_scalar_init((t_void *)pmadapter->pmoal_handle, util_scalar_init((t_void *)pmadapter->pmoal_handle,
&pmadapter->bypass_pkt_count, 0, MNULL, &pmadapter->bypass_pkt_count, 0, MNULL,
pmadapter->callbacks.moal_init_lock); pmadapter->callbacks.moal_init_lock);
@ -1300,6 +1304,8 @@ t_void wlan_free_lock_list(pmlan_adapter pmadapter)
/* Free lists */ /* Free lists */
util_free_list_head((t_void *)pmadapter->pmoal_handle, util_free_list_head((t_void *)pmadapter->pmoal_handle,
&pmadapter->rx_data_queue, pcb->moal_free_lock); &pmadapter->rx_data_queue, pcb->moal_free_lock);
util_free_list_head((t_void *)pmadapter->pmoal_handle,
&pmadapter->amsdu_txq, pcb->moal_free_lock);
util_scalar_free((t_void *)pmadapter->pmoal_handle, util_scalar_free((t_void *)pmadapter->pmoal_handle,
&pmadapter->bypass_pkt_count, pcb->moal_free_lock); &pmadapter->bypass_pkt_count, pcb->moal_free_lock);

View file

@ -739,7 +739,7 @@ typedef struct _mlan_chan_list {
#define CHAN_FLAGS_MAX MBIT(31) #define CHAN_FLAGS_MAX MBIT(31)
/** Maximum response buffer length */ /** Maximum response buffer length */
#define ASSOC_RSP_BUF_SIZE 500 #define ASSOC_RSP_BUF_SIZE 2060
/** Type definition of mlan_ds_misc_assoc_rsp for MLAN_OID_MISC_ASSOC_RSP */ /** Type definition of mlan_ds_misc_assoc_rsp for MLAN_OID_MISC_ASSOC_RSP */
typedef struct _mlan_ds_misc_assoc_rsp { typedef struct _mlan_ds_misc_assoc_rsp {
@ -4025,6 +4025,7 @@ typedef struct _mlan_ds_11ax_cfg {
#define MLAN_11AX_TWT_SETUP_SUBID 0x114 #define MLAN_11AX_TWT_SETUP_SUBID 0x114
#define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115 #define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115
#define MLAN_11AX_TWT_REPORT_SUBID 0x116 #define MLAN_11AX_TWT_REPORT_SUBID 0x116
#define MLAN_11AX_TWT_INFORMATION_SUBID 0x119
#define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322) #define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322)
#define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323) #define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323)
@ -4202,6 +4203,18 @@ typedef MLAN_PACK_START struct _mlan_ds_twt_report {
t_u8 data[36]; t_u8 data[36];
} MLAN_PACK_END mlan_ds_twt_report, *pmlan_ds_twt_report; } MLAN_PACK_END mlan_ds_twt_report, *pmlan_ds_twt_report;
/** Type definition of mlan_ds_twt_information for MLAN_OID_11AX_TWT_CFG */
typedef struct MLAN_PACK_START _mlan_ds_twt_information {
/** TWT Flow Identifier. Range: [0-7] */
t_u8 flow_identifier;
/** Suspend Duration. Range: [0-UINT32_MAX]
* 0:Suspend forever;
* Else:Suspend agreement for specific duration in milli seconds,
* after than resume the agreement and enter SP immediately
*/
t_u32 suspend_duration;
} MLAN_PACK_END mlan_ds_twt_information, *pmlan_ds_twt_information;
/** Type definition of mlan_ds_twtcfg for MLAN_OID_11AX_TWT_CFG */ /** Type definition of mlan_ds_twtcfg for MLAN_OID_11AX_TWT_CFG */
typedef struct MLAN_PACK_START _mlan_ds_twtcfg { typedef struct MLAN_PACK_START _mlan_ds_twtcfg {
/** Sub-command */ /** Sub-command */
@ -4217,6 +4230,10 @@ typedef struct MLAN_PACK_START _mlan_ds_twtcfg {
mlan_ds_twt_teardown twt_teardown; mlan_ds_twt_teardown twt_teardown;
/** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */ /** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */
mlan_ds_twt_report twt_report; mlan_ds_twt_report twt_report;
/** TWT Information config for Sub ID:
* MLAN_11AX_TWT_INFORMATION_SUBID
*/
mlan_ds_twt_information twt_information;
} param; } param;
} MLAN_PACK_END mlan_ds_twtcfg, *pmlan_ds_twtcfg; } MLAN_PACK_END mlan_ds_twtcfg, *pmlan_ds_twtcfg;
@ -4296,14 +4313,16 @@ enum _mlan_reg_type {
MLAN_REG_BCA = 7, MLAN_REG_BCA = 7,
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \ defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(SD9177) || defined(SDIW615) || defined(USBIW615) defined(USBIW624) || defined(SD9097) || defined(SD9177) || \
defined(SDIW615) || defined(USBIW615)
MLAN_REG_CIU = 8, MLAN_REG_CIU = 8,
#endif #endif
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \ defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(SDIW615) || defined(USBIW615) defined(USBIW624) || defined(SD9097) || defined(SDIW615) || \
defined(USBIW615)
MLAN_REG_MAC2 = 0x81, MLAN_REG_MAC2 = 0x81,
MLAN_REG_BBP2 = 0x82, MLAN_REG_BBP2 = 0x82,
MLAN_REG_RF2 = 0x83, MLAN_REG_RF2 = 0x83,
@ -5083,7 +5102,7 @@ typedef MLAN_PACK_START struct _mlan_ds_drcs_cfg {
/** Channel swith time (in TU) for chan_idx */ /** Channel swith time (in TU) for chan_idx */
t_u8 switchtime; t_u8 switchtime;
/** Undoze time (in TU) for chan_idx */ /** Undoze time (in TU) for chan_idx */
t_u8 undozetime; t_u8 rx_wait_time;
/** Rx traffic control scheme when channel switch*/ /** Rx traffic control scheme when channel switch*/
/** only valid for GC/STA interface*/ /** only valid for GC/STA interface*/
t_u8 mode; t_u8 mode;
@ -5844,7 +5863,9 @@ struct MLAN_PACK_START mfg_cmd_tx_frame2 {
/** STBC */ /** STBC */
t_u32 stbc; t_u32 stbc;
/** power id */ /** power id */
t_u32 rsvd[2]; t_u32 rsvd[1];
/**signal bw*/
t_u32 signal_bw;
/** NumPkt */ /** NumPkt */
t_u32 NumPkt; t_u32 NumPkt;
/** MaxPE */ /** MaxPE */

View file

@ -33,9 +33,6 @@ Change log:
#ifndef _MLAN_JOIN_H_ #ifndef _MLAN_JOIN_H_
#define _MLAN_JOIN_H_ #define _MLAN_JOIN_H_
/** Size of buffer allocated to store the association response from firmware */
#define MRVDRV_ASSOC_RSP_BUF_SIZE 500
/** Size of buffer allocated to store IEs passed to firmware in the assoc req */ /** Size of buffer allocated to store IEs passed to firmware in the assoc req */
#define MRVDRV_GENIE_BUF_SIZE 256 #define MRVDRV_GENIE_BUF_SIZE 256

View file

@ -570,8 +570,8 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);
/** Maximum numbfer of registers to read for multiple port */ /** Maximum numbfer of registers to read for multiple port */
#if defined(SD8887) || defined(SD8997) || defined(SD8977) || \ #if defined(SD8887) || defined(SD8997) || defined(SD8977) || \
defined(SD8987) || defined(SD9098) || defined(SD9097) || \ defined(SD8987) || defined(SD9098) || defined(SD9097) || \
defined(SDIW624) || defined(SD8978) || defined(SD9177) || \ defined(SDAW693) || defined(SDIW624) || defined(SD8978) || \
defined(SDIW615) defined(SD9177) || defined(SDIW615)
#define MAX_MP_REGS 196 #define MAX_MP_REGS 196
#else #else
/* upto 0xB7 */ /* upto 0xB7 */
@ -1287,11 +1287,11 @@ typedef struct _mlan_private {
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
/** Buffer to store the association response for application retrieval /** Buffer to store the association response for application retrieval
*/ */
t_u8 assoc_rsp_buf[MRVDRV_ASSOC_RSP_BUF_SIZE]; t_u8 assoc_rsp_buf[ASSOC_RSP_BUF_SIZE];
/** Length of the data stored in assoc_rsp_buf */ /** Length of the data stored in assoc_rsp_buf */
t_u32 assoc_rsp_size; t_u32 assoc_rsp_size;
/** Buffer to store the association req IEs */ /** Buffer to store the association req IEs */
t_u8 assoc_req_buf[MRVDRV_ASSOC_RSP_BUF_SIZE]; t_u8 assoc_req_buf[ASSOC_RSP_BUF_SIZE];
/** Length of the data stored in assoc_rsp_buf */ /** Length of the data stored in assoc_rsp_buf */
t_u32 assoc_req_size; t_u32 assoc_req_size;
/** Generic IEEE IEs passed from the application to be inserted into the /** Generic IEEE IEs passed from the application to be inserted into the
@ -2341,6 +2341,13 @@ typedef struct _adapter_operations {
mlan_status (*enable_host_int)(mlan_adapter *pmadapter); mlan_status (*enable_host_int)(mlan_adapter *pmadapter);
/** select host interrupt */ /** select host interrupt */
mlan_status (*select_host_int)(mlan_adapter *pmadapter); mlan_status (*select_host_int)(mlan_adapter *pmadapter);
#ifdef PCIEAW693
/** get_max_msdu_pkt_num in AMSDU packet*/
t_u32 (*get_max_msdu_cnt)(mlan_adapter *pmadapter);
/** send_data_list */
mlan_status (*send_data_list)(mlan_adapter *pmadapter, t_u8 type,
t_u8 num_pkt, t_u16 pkt_size);
#endif
/**Interface header length*/ /**Interface header length*/
t_u32 intf_header_len; t_u32 intf_header_len;
} mlan_adapter_operations; } mlan_adapter_operations;
@ -2455,7 +2462,8 @@ struct _mlan_adapter {
t_u32 fw_cap_ext; t_u32 fw_cap_ext;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \ defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
defined(SDIW624) || defined(PCIEIW624) || defined(USBIW624) defined(SDAW693) || defined(SDIW624) || defined(PCIEAW693) || \
defined(PCIEIW624) || defined(USBIW624)
/** High byte for 5G, low byte for 2G, like 0x2211 0x22 for 5G, 0x11 for /** High byte for 5G, low byte for 2G, like 0x2211 0x22 for 5G, 0x11 for
* 2G */ * 2G */
t_u16 user_htstream; t_u16 user_htstream;
@ -2802,6 +2810,8 @@ struct _mlan_adapter {
t_u16 max_mgmt_ie_index; t_u16 max_mgmt_ie_index;
/** Head of Rx data queue */ /** Head of Rx data queue */
mlan_list_head rx_data_queue; mlan_list_head rx_data_queue;
/** Head of AMSDU Tx data queue */
mlan_list_head amsdu_txq;
#ifdef MFG_CMD_SUPPORT #ifdef MFG_CMD_SUPPORT
t_u32 mfg_mode; t_u32 mfg_mode;
#endif #endif
@ -3962,6 +3972,30 @@ static INLINE int wlan_is_tdls_link_setup(tdlsStatus_e status)
return ret; return ret;
} }
/**
* @brief This function checks if address is broadcast
*
* @param addr mac address
* @return 1 - broadcast, 0 - not broadcast
*/
static INLINE t_bool is_bcast_addr(t_u8 *addr)
{
return ((*(t_u16 *)addr == 0xffff) &&
(*(t_u16 *)((t_u8 *)addr + 2) == 0xffff) &&
(*(t_u16 *)((t_u8 *)addr + 4) == 0xffff));
}
/**
* @brief This function checks if address is multicast
*
* @param addr mac address
* @return 1 - multicast, 0 - not multicast
*/
static INLINE t_bool is_mcast_addr(t_u8 *addr)
{
return ((*(t_u8 *)addr & 0x01) == 0x01);
}
/** /**
* @brief This function checks tx_pause flag for peer * @brief This function checks tx_pause flag for peer
* *

View file

@ -4,7 +4,7 @@
* @brief This file include miscellaneous functions for MLAN module * @brief This file include miscellaneous functions for MLAN module
* *
* *
* Copyright 2009-2023 NXP * Copyright 2009-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -1679,7 +1679,8 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
case MLAN_REG_MAC: case MLAN_REG_MAC:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
case MLAN_REG_MAC2: case MLAN_REG_MAC2:
#endif #endif
cmd_no = HostCmd_CMD_MAC_REG_ACCESS; cmd_no = HostCmd_CMD_MAC_REG_ACCESS;
@ -1687,7 +1688,8 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
case MLAN_REG_BBP: case MLAN_REG_BBP:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
case MLAN_REG_BBP2: case MLAN_REG_BBP2:
#endif #endif
cmd_no = HostCmd_CMD_BBP_REG_ACCESS; cmd_no = HostCmd_CMD_BBP_REG_ACCESS;
@ -1695,7 +1697,8 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
case MLAN_REG_RF: case MLAN_REG_RF:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
case MLAN_REG_RF2: case MLAN_REG_RF2:
#endif #endif
cmd_no = HostCmd_CMD_RF_REG_ACCESS; cmd_no = HostCmd_CMD_RF_REG_ACCESS;
@ -1709,15 +1712,17 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
case MLAN_REG_BCA: case MLAN_REG_BCA:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
case MLAN_REG_BCA2: case MLAN_REG_BCA2:
#endif #endif
cmd_no = HostCmd_CMD_BCA_REG_ACCESS; cmd_no = HostCmd_CMD_BCA_REG_ACCESS;
break; break;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \ defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(SD9177) || defined(SDIW615) || defined(USBIW615) defined(USBIW624) || defined(SD9097) || defined(SD9177) || \
defined(SDIW615) || defined(USBIW615)
case MLAN_REG_CIU: case MLAN_REG_CIU:
cmd_no = HostCmd_CMD_REG_ACCESS; cmd_no = HostCmd_CMD_REG_ACCESS;
break; break;
@ -3600,7 +3605,7 @@ mlan_status wlan_misc_multi_ap_cfg(pmlan_adapter pmadapter,
* *
* @return MTRUE/MFALSE * @return MTRUE/MFALSE
*/ */
t_u8 wlan_check_beacon_prot_supported(mlan_private *pmpriv, static t_u8 wlan_check_beacon_prot_supported(mlan_private *pmpriv,
BSSDescriptor_t *pbss_desc) BSSDescriptor_t *pbss_desc)
{ {
if (pbss_desc && pbss_desc->pext_cap) { if (pbss_desc && pbss_desc->pext_cap) {
@ -4187,7 +4192,8 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
if (IS_STREAM_2X2(pmadapter->feature_control)) { if (IS_STREAM_2X2(pmadapter->feature_control)) {
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) ||
@ -4236,7 +4242,8 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
ant_cfg->rx_antenna &= 0x0003; ant_cfg->rx_antenna &= 0x0003;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
} }
#endif #endif
if (!ant_cfg->tx_antenna || if (!ant_cfg->tx_antenna ||
@ -4335,7 +4342,8 @@ mlan_status wlan_handle_antcfg(mlan_private *pmpriv, t_u32 init_antcfg)
if (IS_STREAM_2X2(pmadapter->feature_control)) { if (IS_STREAM_2X2(pmadapter->feature_control)) {
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmadapter->card_type) || if (IS_CARD9098(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) ||
@ -4379,7 +4387,8 @@ mlan_status wlan_handle_antcfg(mlan_private *pmpriv, t_u32 init_antcfg)
ant_cfg.rx_antenna &= 0x0003; ant_cfg.rx_antenna &= 0x0003;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
} }
#endif #endif
if (!ant_cfg.tx_antenna || if (!ant_cfg.tx_antenna ||

File diff suppressed because it is too large Load diff

View file

@ -186,7 +186,8 @@ Change log:
/** PF start bit */ /** PF start bit */
#define ADMA_MSIX_PF_BIT 24 #define ADMA_MSIX_PF_BIT 24
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
/** PCIE9098 dev_id/vendor id reg */ /** PCIE9098 dev_id/vendor id reg */
#define PCIE9098_DEV_ID_REG 0x0000 #define PCIE9098_DEV_ID_REG 0x0000
/** PCIE revision ID register */ /** PCIE revision ID register */

View file

@ -966,6 +966,17 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
if (pmadapter->ext_scan && pmadapter->ext_scan_enh && if (pmadapter->ext_scan && pmadapter->ext_scan_enh &&
pmadapter->ext_scan_type == EXT_SCAN_ENHANCE) pmadapter->ext_scan_type == EXT_SCAN_ENHANCE)
done_early = MFALSE; done_early = MFALSE;
/*
* Stop the loop if the *next* channel is of different
* Band
*/
// coverity[overflow_sink:SUPPRESS]
if (ptmp_chan_list->bandcfg.chanBand !=
((ChanScanParamSet_t *)(ptmp_chan_list - 1))
->bandcfg.chanBand) {
done_early = MTRUE;
}
} }
/* The total scan time should be less than scan command timeout /* The total scan time should be less than scan command timeout
@ -1025,9 +1036,11 @@ wlan_scan_channel_list(mlan_private *pmpriv, t_void *pioctl_buf,
if (IS_FW_SUPPORT_11AX(pmadapter) && if (IS_FW_SUPPORT_11AX(pmadapter) &&
((pmpriv->config_bands & BAND_GAX) || ((pmpriv->config_bands & BAND_GAX) ||
(pmpriv->config_bands & BAND_AAX))) { (pmpriv->config_bands & BAND_AAX))) {
t_u16 select_band =
(radio_type == BAND_5GHZ ? BAND_AAX : BAND_GAX);
phe_cap = (MrvlIEtypes_Extension_t *)ptlv_pos; phe_cap = (MrvlIEtypes_Extension_t *)ptlv_pos;
len = wlan_fill_he_cap_tlv(pmpriv, pmpriv->config_bands, len = wlan_fill_he_cap_tlv(pmpriv, select_band, phe_cap,
phe_cap, MFALSE); MFALSE);
HEXDUMP("SCAN: HE_CAPABILITIES IE", (t_u8 *)phe_cap, HEXDUMP("SCAN: HE_CAPABILITIES IE", (t_u8 *)phe_cap,
len); len);
ptlv_pos += len; ptlv_pos += len;
@ -5181,7 +5194,8 @@ done:
static mlan_status wlan_update_ssid_in_beacon_buf( static mlan_status wlan_update_ssid_in_beacon_buf(
mlan_adapter *pmadapter, BSSDescriptor_t *pbss_entry, mlan_adapter *pmadapter, BSSDescriptor_t *pbss_entry,
BSSDescriptor_t *pnew_entry, IEEEtypes_Ssid_t *pssid, BSSDescriptor_t *pnew_entry, IEEEtypes_Ssid_t *pssid,
IEEEtypes_ExtCap_t *pnew_extcap, IEEEtypes_Generic_t *pnew_rsnx) IEEEtypes_ExtCap_t *pnew_extcap, IEEEtypes_Generic_t *pnew_rsnx,
IEEEtypes_Generic_t *pnew_rsn)
{ {
mlan_callbacks *pcb = (pmlan_callbacks)&pmadapter->callbacks; mlan_callbacks *pcb = (pmlan_callbacks)&pmadapter->callbacks;
t_u8 *pbeacon_buf = MNULL; t_u8 *pbeacon_buf = MNULL;
@ -5189,7 +5203,7 @@ static mlan_status wlan_update_ssid_in_beacon_buf(
t_s8 offset = pnew_entry->ssid.ssid_len - pbss_entry->ssid.ssid_len; t_s8 offset = pnew_entry->ssid.ssid_len - pbss_entry->ssid.ssid_len;
IEEEtypes_ExtCap_t *pextcap; IEEEtypes_ExtCap_t *pextcap;
mlan_status ret = MLAN_STATUS_FAILURE; mlan_status ret = MLAN_STATUS_FAILURE;
t_u32 rsnx_offset = 0; t_u32 rsnx_offset = 0, rsn_offset = 0;
if (pnew_entry->ssid.ssid_len >= pbss_entry->ssid.ssid_len) if (pnew_entry->ssid.ssid_len >= pbss_entry->ssid.ssid_len)
beacon_buf_size = beacon_buf_size =
@ -5205,6 +5219,11 @@ static mlan_status wlan_update_ssid_in_beacon_buf(
beacon_buf_size += beacon_buf_size +=
pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t); pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t);
rsn_offset = beacon_buf_size;
if (pnew_rsn)
beacon_buf_size +=
pnew_rsn->ieee_hdr.len + sizeof(IEEEtypes_Header_t);
ret = pcb->moal_malloc(pmadapter->pmoal_handle, beacon_buf_size, ret = pcb->moal_malloc(pmadapter->pmoal_handle, beacon_buf_size,
MLAN_MEM_DEF, (t_u8 **)&pbeacon_buf); MLAN_MEM_DEF, (t_u8 **)&pbeacon_buf);
if (ret != MLAN_STATUS_SUCCESS || !pbeacon_buf) { if (ret != MLAN_STATUS_SUCCESS || !pbeacon_buf) {
@ -5293,6 +5312,11 @@ static mlan_status wlan_update_ssid_in_beacon_buf(
pmadapter, pbeacon_buf + rsnx_offset, (t_u8 *)pnew_rsnx, pmadapter, pbeacon_buf + rsnx_offset, (t_u8 *)pnew_rsnx,
pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t), pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t),
pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t)); pnew_rsnx->ieee_hdr.len + sizeof(IEEEtypes_Header_t));
if (pnew_rsn)
memcpy_ext(pmadapter, pbeacon_buf + rsn_offset,
(t_u8 *)pnew_rsn,
pnew_rsn->ieee_hdr.len + sizeof(IEEEtypes_Header_t),
pnew_rsn->ieee_hdr.len + sizeof(IEEEtypes_Header_t));
DBG_HEXDUMP(MCMD_D, "MBSSID beacon buf", pbeacon_buf, beacon_buf_size); DBG_HEXDUMP(MCMD_D, "MBSSID beacon buf", pbeacon_buf, beacon_buf_size);
ret = MLAN_STATUS_SUCCESS; ret = MLAN_STATUS_SUCCESS;
done: done:
@ -5361,6 +5385,7 @@ static t_void wlan_parse_non_trans_bssid_profile(
(IEEEtypes_Header_t *)pbss_profile->profile_data; (IEEEtypes_Header_t *)pbss_profile->profile_data;
IEEEtypes_MultiBSSIDIndex_t *pbssid_index = MNULL; IEEEtypes_MultiBSSIDIndex_t *pbssid_index = MNULL;
IEEEtypes_Ssid_t *pssid = MNULL; IEEEtypes_Ssid_t *pssid = MNULL;
IEEEtypes_Generic_t *prsn = MNULL;
IEEEtypes_NotxBssCap_t *pcap = IEEEtypes_NotxBssCap_t *pcap =
(IEEEtypes_NotxBssCap_t *)pbss_profile->profile_data; (IEEEtypes_NotxBssCap_t *)pbss_profile->profile_data;
t_u8 *pos = pbss_profile->profile_data; t_u8 *pos = pbss_profile->profile_data;
@ -5418,6 +5443,12 @@ static t_void wlan_parse_non_trans_bssid_profile(
prsnx->ieee_hdr.len + prsnx->ieee_hdr.len +
sizeof(IEEEtypes_Header_t)); sizeof(IEEEtypes_Header_t));
break; break;
case RSN_IE:
prsn = (IEEEtypes_Generic_t *)pos;
DBG_HEXDUMP(MCMD_D, "MBSSID RSN", pos,
prsn->ieee_hdr.len +
sizeof(IEEEtypes_Header_t));
break;
case SSID: case SSID:
pssid = (IEEEtypes_Ssid_t *)pos; pssid = (IEEEtypes_Ssid_t *)pos;
PRINTM(MCMND, "MBSSID: Find mbssid ssid=%s\n", PRINTM(MCMND, "MBSSID: Find mbssid ssid=%s\n",
@ -5454,7 +5485,7 @@ static t_void wlan_parse_non_trans_bssid_profile(
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
wlan_update_ssid_in_beacon_buf( wlan_update_ssid_in_beacon_buf(
pmadapter, pbss_entry, bss_new_entry, pssid, pmadapter, pbss_entry, bss_new_entry, pssid,
pextcap, prsnx)) { pextcap, prsnx, prsn)) {
PRINTM(MERROR, PRINTM(MERROR,
"Fail to update MBSSID beacon buf\n"); "Fail to update MBSSID beacon buf\n");
pcb->moal_mfree(pmadapter->pmoal_handle, pcb->moal_mfree(pmadapter->pmoal_handle,

View file

@ -3,7 +3,7 @@
* @brief This file contains SDIO specific code * @brief This file contains SDIO specific code
* *
* *
* Copyright 2008-2021 NXP * Copyright 2008-2021, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -225,7 +225,8 @@ static const struct _mlan_card_info mlan_card_info_sd8897 = {
#if defined(SD8977) || defined(SD8997) || defined(SD8987) || \ #if defined(SD8977) || defined(SD8997) || defined(SD8987) || \
defined(SD9098) || defined(SD9097) || defined(SDIW624) || \ defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD8978) || defined(SD9177) || defined(SDIW615) defined(SDAW693) || defined(SD8978) || defined(SD9177) || \
defined(SDIW615)
static const struct _mlan_sdio_card_reg mlan_reg_sd8977_sd8997 = { static const struct _mlan_sdio_card_reg mlan_reg_sd8977_sd8997 = {
.start_rd_port = 0, .start_rd_port = 0,
.start_wr_port = 0, .start_wr_port = 0,
@ -326,6 +327,17 @@ static const struct _mlan_card_info mlan_card_info_sdiw624 = {
}; };
#endif #endif
#ifdef SDAW693
static const struct _mlan_card_info mlan_card_info_sdaw693 = {
.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,
.support_11mc = 1,
};
#endif
#ifdef SD9098 #ifdef SD9098
static const struct _mlan_card_info mlan_card_info_sd9098 = { static const struct _mlan_card_info mlan_card_info_sd9098 = {
.max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K,
@ -1055,7 +1067,8 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw,
check_fw_status = MTRUE; check_fw_status = MTRUE;
} }
#endif #endif
#if defined(SD9097) || defined(SD9177) || defined(SDIW624) || defined(SDIW615) #if defined(SD9097) || defined(SD9177) || defined(SDIW624) || \
defined(SDAW693) || defined(SDIW615)
if (IS_SD9097(pmadapter->card_type) || if (IS_SD9097(pmadapter->card_type) ||
IS_SDIW624(pmadapter->card_type) || IS_SDIW624(pmadapter->card_type) ||
IS_SDAW693(pmadapter->card_type) || IS_SDAW693(pmadapter->card_type) ||
@ -2444,6 +2457,12 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter)
pmadapter->pcard_info = &mlan_card_info_sdiw624; pmadapter->pcard_info = &mlan_card_info_sdiw624;
break; break;
#endif #endif
#ifdef SDAW693
case CARD_TYPE_SDAW693:
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
pmadapter->pcard_info = &mlan_card_info_sdaw693;
break;
#endif
#ifdef SDIW615 #ifdef SDIW615
case CARD_TYPE_SDIW615: case CARD_TYPE_SDIW615:
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997; pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
@ -2472,7 +2491,7 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter)
* @param pmadapter A pointer to mlan_adapter structure * @param pmadapter A pointer to mlan_adapter structure
* @return N/A * @return N/A
*/ */
void wlan_dump_mp_registers(pmlan_adapter pmadapter) static void wlan_dump_mp_registers(pmlan_adapter pmadapter)
{ {
t_u32 mp_wr_bitmap; t_u32 mp_wr_bitmap;
t_bool new_mode = pmadapter->pcard_sd->supports_sdio_new_mode; t_bool new_mode = pmadapter->pcard_sd->supports_sdio_new_mode;
@ -3066,8 +3085,8 @@ exit:
} }
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \ #if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD9177) || defined(SD8997) || defined(SD8987) || \ defined(SDAW693) || defined(SD9177) || defined(SD8997) || \
defined(SD8978) || defined(SDIW615) defined(SD8987) || defined(SD8978) || defined(SDIW615)
/** /**
* @brief This function sends vdll data to the card. * @brief This function sends vdll data to the card.
* *
@ -3129,8 +3148,8 @@ static mlan_status wlan_sdio_host_to_card_ext(pmlan_private pmpriv, t_u8 type,
mlan_adapter *pmadapter = pmpriv->adapter; mlan_adapter *pmadapter = pmpriv->adapter;
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \ #if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD9177) || defined(SD8997) || defined(SD8987) || \ defined(SDAW693) || defined(SD9177) || defined(SD8997) || \
defined(SD8978) || defined(SDIW615) defined(SD8987) || defined(SD8978) || defined(SDIW615)
if (type == MLAN_TYPE_VDLL) if (type == MLAN_TYPE_VDLL)
return wlan_sdio_send_vdll(pmadapter, pmbuf); return wlan_sdio_send_vdll(pmadapter, pmbuf);
#endif #endif
@ -3613,7 +3632,8 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
} }
#if defined(SD8997) || defined(SD8977) || defined(SD8987) || \ #if defined(SD8997) || defined(SD8977) || defined(SD8987) || \
defined(SD9098) || defined(SD9097) || defined(SDIW624) || \ defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD8978) || defined(SD9177) || defined(SDIW615) defined(SDAW693) || defined(SD8978) || defined(SD9177) || \
defined(SDIW615)
if (MFALSE if (MFALSE
#ifdef SD8997 #ifdef SD8997
|| IS_SD8997(pmadapter->card_type) || IS_SD8997(pmadapter->card_type)
@ -3636,6 +3656,9 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
#ifdef SDIW624 #ifdef SDIW624
|| IS_SDIW624(pmadapter->card_type) || IS_SDIW624(pmadapter->card_type)
#endif #endif
#ifdef SDAW693
|| IS_SDAW693(pmadapter->card_type)
#endif
#ifdef SDIW615 #ifdef SDIW615
|| IS_SDIW615(pmadapter->card_type) || IS_SDIW615(pmadapter->card_type)
#endif #endif

View file

@ -1041,6 +1041,8 @@ mlan_status mlan_rx_process(t_void *padapter, t_u8 *rx_pkts)
pcb->moal_spin_lock(pmadapter->pmoal_handle, pmadapter->prx_proc_lock); pcb->moal_spin_lock(pmadapter->pmoal_handle, pmadapter->prx_proc_lock);
if (pmadapter->mlan_rx_processing || pmadapter->rx_lock_flag) { if (pmadapter->mlan_rx_processing || pmadapter->rx_lock_flag) {
pmadapter->more_rx_task_flag = MTRUE; pmadapter->more_rx_task_flag = MTRUE;
if (rx_pkts)
*rx_pkts = 0;
pcb->moal_spin_unlock(pmadapter->pmoal_handle, pcb->moal_spin_unlock(pmadapter->pmoal_handle,
pmadapter->prx_proc_lock); pmadapter->prx_proc_lock);
goto exit_rx_proc; goto exit_rx_proc;
@ -1092,14 +1094,16 @@ rx_process_start:
goto rx_process_start; goto rx_process_start;
} }
if (pmadapter->delay_task_flag && if (!IS_PCIE(pmadapter->card_type) &&
pmadapter->delay_task_flag &&
(pmadapter->rx_pkts_queued < LOW_RX_PENDING)) { (pmadapter->rx_pkts_queued < LOW_RX_PENDING)) {
PRINTM(MEVENT, "Run\n"); PRINTM(MEVENT, "Run\n");
pmadapter->delay_task_flag = MFALSE; pmadapter->delay_task_flag = MFALSE;
mlan_queue_main_work(pmadapter); mlan_queue_main_work(pmadapter);
} }
#ifdef PCIE #ifdef PCIE
if (pmadapter->delay_rx_data_flag && if (IS_PCIE(pmadapter->card_type) &&
pmadapter->delay_rx_data_flag &&
(pmadapter->rx_pkts_queued < LOW_RX_PENDING)) { (pmadapter->rx_pkts_queued < LOW_RX_PENDING)) {
PRINTM(MEVENT, "Run\n"); PRINTM(MEVENT, "Run\n");
pmadapter->delay_rx_data_flag = MFALSE; pmadapter->delay_rx_data_flag = MFALSE;
@ -1180,7 +1184,7 @@ process_start:
pmadapter->pending_disconnect_priv = MNULL; pmadapter->pending_disconnect_priv = MNULL;
} }
#if defined(SDIO) #if defined(SDIO)
if (!IS_USB(pmadapter->card_type)) { if (IS_SD(pmadapter->card_type)) {
if (pmadapter->rx_pkts_queued > HIGH_RX_PENDING) { if (pmadapter->rx_pkts_queued > HIGH_RX_PENDING) {
pcb->moal_tp_accounting_rx_param( pcb->moal_tp_accounting_rx_param(
pmadapter->pmoal_handle, 2, 0); pmadapter->pmoal_handle, 2, 0);
@ -1458,19 +1462,23 @@ mlan_status mlan_send_packet(t_void *padapter, pmlan_buffer pmbuf)
mlan_ntohs(*(t_u16 *)&pmbuf->pbuf[pmbuf->data_offset + mlan_ntohs(*(t_u16 *)&pmbuf->pbuf[pmbuf->data_offset +
MLAN_ETHER_PKT_TYPE_OFFSET]); MLAN_ETHER_PKT_TYPE_OFFSET]);
#ifdef UAP_SUPPORT
/** Identify ICMP packet from ETH_IP packet. ICMP packet in IP header /** Identify ICMP packet from ETH_IP packet. ICMP packet in IP header
* Protocol field is 0x01 */ * Protocol field is 0x01 */
/** Enable the ICMP_VIA_BYPASS_TXQ only if wacp_mode is enabled */ /** Enable the ICMP_VIA_BYPASS_TXQ only if wacp_mode is enabled */
if ((pmadapter->init_para.wacp_mode) && if ((pmadapter->init_para.wacp_mode) &&
(pmpriv->bss_role == MLAN_BSS_ROLE_UAP && ((pmpriv->bss_role == MLAN_BSS_ROLE_UAP) &&
pmpriv->uap_bss_started)) { pmpriv->uap_bss_started)) {
if (eth_type == MLAN_ETHER_PKT_TYPE_IP) { if (eth_type == MLAN_ETHER_PKT_TYPE_IP) {
ip_protocol = ip_protocol =
*((t_u8 *)(pmbuf->pbuf + pmbuf->data_offset + *((t_u8 *)(pmbuf->pbuf + pmbuf->data_offset +
MLAN_ETHER_PKT_TYPE_OFFSET + MLAN_ETHER_PKT_TYPE_OFFSET +
MLAN_IP_PROTOCOL_OFFSET)); MLAN_IP_PROTOCOL_OFFSET));
if (ip_protocol == MLAN_IP_PROTOCOL_ICMP)
pmbuf->priority = WMM_HIGHEST_PRIORITY;
} }
} }
#endif
if ((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) || if ((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) ||
(eth_type == MLAN_ETHER_PKT_TYPE_ARP) || (eth_type == MLAN_ETHER_PKT_TYPE_ARP) ||

View file

@ -5,7 +5,7 @@
* it is ready. * it is ready.
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -406,9 +406,11 @@ static mlan_status wlan_cmd_mfg_tx_frame(pmlan_private pmpriv,
mcmd->short_preamble = wlan_cpu_to_le32(cfg->short_preamble); mcmd->short_preamble = wlan_cpu_to_le32(cfg->short_preamble);
mcmd->act_sub_ch = wlan_cpu_to_le32(cfg->act_sub_ch); mcmd->act_sub_ch = wlan_cpu_to_le32(cfg->act_sub_ch);
mcmd->short_gi = wlan_cpu_to_le32(cfg->short_gi); mcmd->short_gi = wlan_cpu_to_le32(cfg->short_gi);
mcmd->adv_coding = wlan_cpu_to_le32(cfg->adv_coding);
mcmd->tx_bf = wlan_cpu_to_le32(cfg->tx_bf); mcmd->tx_bf = wlan_cpu_to_le32(cfg->tx_bf);
mcmd->gf_mode = wlan_cpu_to_le32(cfg->gf_mode); mcmd->gf_mode = wlan_cpu_to_le32(cfg->gf_mode);
mcmd->stbc = wlan_cpu_to_le32(cfg->stbc); mcmd->stbc = wlan_cpu_to_le32(cfg->stbc);
mcmd->signal_bw = wlan_cpu_to_le32(cfg->signal_bw);
mcmd->NumPkt = wlan_cpu_to_le32(cfg->NumPkt); mcmd->NumPkt = wlan_cpu_to_le32(cfg->NumPkt);
mcmd->MaxPE = wlan_cpu_to_le32(cfg->MaxPE); mcmd->MaxPE = wlan_cpu_to_le32(cfg->MaxPE);
mcmd->BeamChange = wlan_cpu_to_le32(cfg->BeamChange); mcmd->BeamChange = wlan_cpu_to_le32(cfg->BeamChange);
@ -484,8 +486,9 @@ static mlan_status wlan_cmd_mfg_config_trigger_frame(pmlan_private pmpriv,
* @return MLAN_STATUS_SUCCESS * @return MLAN_STATUS_SUCCESS
*/ */
mlan_status wlan_cmd_mfg_he_tb_tx(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, static mlan_status wlan_cmd_mfg_he_tb_tx(pmlan_private pmpriv,
t_u16 action, t_void *pdata_buf) HostCmd_DS_COMMAND *cmd, t_u16 action,
t_void *pdata_buf)
{ {
struct mfg_Cmd_HE_TBTx_t *mcmd = struct mfg_Cmd_HE_TBTx_t *mcmd =
(struct mfg_Cmd_HE_TBTx_t *)&cmd->params.mfg_he_power; (struct mfg_Cmd_HE_TBTx_t *)&cmd->params.mfg_he_power;
@ -520,8 +523,9 @@ mlan_status wlan_cmd_mfg_he_tb_tx(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
* @return MLAN_STATUS_SUCCESS * @return MLAN_STATUS_SUCCESS
*/ */
mlan_status wlan_cmd_mfg_otp_rw(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, static mlan_status wlan_cmd_mfg_otp_rw(pmlan_private pmpriv,
t_u16 action, t_void *pdata_buf) HostCmd_DS_COMMAND *cmd, t_u16 action,
t_void *pdata_buf)
{ {
mfg_cmd_otp_mac_addr_rd_wr_t *mcmd = mfg_cmd_otp_mac_addr_rd_wr_t *mcmd =
(mfg_cmd_otp_mac_addr_rd_wr_t *)&cmd->params (mfg_cmd_otp_mac_addr_rd_wr_t *)&cmd->params
@ -2960,9 +2964,9 @@ mlan_status wlan_cmd_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
* @return N/A * @return N/A
*/ */
mlan_status wlan_cmd_ipv6_ra_offload(mlan_private *pmpriv, static mlan_status wlan_cmd_ipv6_ra_offload(mlan_private *pmpriv,
HostCmd_DS_COMMAND *pcmd, t_u16 cmd_action, HostCmd_DS_COMMAND *pcmd,
void *pdata_buf) t_u16 cmd_action, void *pdata_buf)
{ {
HostCmd_DS_IPV6_RA_OFFLOAD *ipv6_ra_cfg = &pcmd->params.ipv6_ra_offload; HostCmd_DS_IPV6_RA_OFFLOAD *ipv6_ra_cfg = &pcmd->params.ipv6_ra_offload;
mlan_ds_misc_ipv6_ra_offload *ipv6_ra_offload = mlan_ds_misc_ipv6_ra_offload *ipv6_ra_offload =

View file

@ -4,7 +4,7 @@
* responses generated by firmware. * responses generated by firmware.
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -2505,7 +2505,7 @@ mlan_status wlan_ret_arb_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
* *
* @return MLAN_STATUS_SUCCESS * @return MLAN_STATUS_SUCCESS
*/ */
mlan_status wlan_ret_ipv6_ra_offload(pmlan_private pmpriv, static mlan_status wlan_ret_ipv6_ra_offload(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp, HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf) mlan_ioctl_req *pioctl_buf)
{ {
@ -2897,9 +2897,11 @@ static mlan_status wlan_ret_mfg_tx_frame(pmlan_private pmpriv,
cfg->short_preamble = wlan_le32_to_cpu(mcmd->short_preamble); cfg->short_preamble = wlan_le32_to_cpu(mcmd->short_preamble);
cfg->act_sub_ch = wlan_le32_to_cpu(mcmd->act_sub_ch); cfg->act_sub_ch = wlan_le32_to_cpu(mcmd->act_sub_ch);
cfg->short_gi = wlan_le32_to_cpu(mcmd->short_gi); cfg->short_gi = wlan_le32_to_cpu(mcmd->short_gi);
cfg->adv_coding = wlan_le32_to_cpu(mcmd->adv_coding);
cfg->tx_bf = wlan_le32_to_cpu(mcmd->tx_bf); cfg->tx_bf = wlan_le32_to_cpu(mcmd->tx_bf);
cfg->gf_mode = wlan_le32_to_cpu(mcmd->gf_mode); cfg->gf_mode = wlan_le32_to_cpu(mcmd->gf_mode);
cfg->stbc = wlan_le32_to_cpu(mcmd->stbc); cfg->stbc = wlan_le32_to_cpu(mcmd->stbc);
cfg->signal_bw = wlan_le32_to_cpu(mcmd->signal_bw);
cfg->NumPkt = wlan_le32_to_cpu(mcmd->NumPkt); cfg->NumPkt = wlan_le32_to_cpu(mcmd->NumPkt);
cfg->MaxPE = wlan_le32_to_cpu(mcmd->MaxPE); cfg->MaxPE = wlan_le32_to_cpu(mcmd->MaxPE);
cfg->BeamChange = wlan_le32_to_cpu(mcmd->BeamChange); cfg->BeamChange = wlan_le32_to_cpu(mcmd->BeamChange);

View file

@ -737,6 +737,7 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
ENTER(); ENTER();
if (!pmbuf) { if (!pmbuf) {
PRINTM(MERROR, "ERR:event buffer is null\n");
LEAVE(); LEAVE();
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
@ -744,6 +745,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
/* Event length check */ /* Event length check */
if ((pmbuf->data_len - sizeof(eventcause)) > MAX_EVENT_SIZE) { if ((pmbuf->data_len - sizeof(eventcause)) > MAX_EVENT_SIZE) {
pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID; pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID;
PRINTM(MERROR, "ERR:event buffer len invalid=%d\n",
pmbuf->data_len);
LEAVE(); LEAVE();
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
@ -946,7 +949,7 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
(pmbuf->pbuf + pmbuf->data_offset + sizeof(eventcause)); (pmbuf->pbuf + pmbuf->data_offset + sizeof(eventcause));
memcpy_ext(pmpriv->adapter, pmpriv->assoc_req_buf, evt_buf, memcpy_ext(pmpriv->adapter, pmpriv->assoc_req_buf, evt_buf,
pmbuf->data_len - sizeof(eventcause), pmbuf->data_len - sizeof(eventcause),
MRVDRV_ASSOC_RSP_BUF_SIZE); ASSOC_RSP_BUF_SIZE);
break; break;
case EVENT_FW_DEBUG_INFO: case EVENT_FW_DEBUG_INFO:

View file

@ -3,7 +3,7 @@
* @brief This file contains the functions for station ioctl. * @brief This file contains the functions for station ioctl.
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -2509,8 +2509,15 @@ static mlan_status wlan_sec_ioctl_auth_mode(pmlan_adapter pmadapter,
sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf; sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_GET) if (pioctl_req->action == MLAN_ACT_GET)
sec->param.auth_mode = pmpriv->sec_info.authentication_mode; sec->param.auth_mode = pmpriv->sec_info.authentication_mode;
else else {
pmpriv->sec_info.authentication_mode = sec->param.auth_mode; pmpriv->sec_info.authentication_mode = sec->param.auth_mode;
if (pmpriv->sec_info.authentication_mode ==
MLAN_AUTH_MODE_OWE) {
/* set ewpa_query to TRUE for OWE to set ewpa_enabled
* flag later */
pmpriv->ewpa_query = MTRUE;
}
}
pioctl_req->data_read_written = sizeof(t_u32) + MLAN_SUB_COMMAND_SIZE; pioctl_req->data_read_written = sizeof(t_u32) + MLAN_SUB_COMMAND_SIZE;
LEAVE(); LEAVE();
@ -4580,7 +4587,7 @@ static mlan_status wlan_misc_ioctl_ips_cfg(pmlan_adapter pmadapter,
* *
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/ */
mlan_status wlan_misc_ioctl_ipv6_ra_offload(pmlan_adapter pmadapter, static mlan_status wlan_misc_ioctl_ipv6_ra_offload(pmlan_adapter pmadapter,
mlan_ioctl_req *pioctl_req) mlan_ioctl_req *pioctl_req)
{ {
pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index];
@ -5447,7 +5454,8 @@ mlan_status wlan_set_ewpa_mode(mlan_private *priv, mlan_ds_passphrase *psec_pp)
if ((psec_pp->psk_type == MLAN_PSK_PASSPHRASE && if ((psec_pp->psk_type == MLAN_PSK_PASSPHRASE &&
psec_pp->psk.passphrase.passphrase_len > 0) || psec_pp->psk.passphrase.passphrase_len > 0) ||
(psec_pp->psk_type == MLAN_PSK_PMK)) (psec_pp->psk_type == MLAN_PSK_PMK) ||
priv->sec_info.authentication_mode == MLAN_AUTH_MODE_OWE)
priv->sec_info.ewpa_enabled = MTRUE; priv->sec_info.ewpa_enabled = MTRUE;
else else
priv->sec_info.ewpa_enabled = MFALSE; priv->sec_info.ewpa_enabled = MFALSE;

View file

@ -890,8 +890,12 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf)
*/ */
if ((!IS_11N_ENABLED(priv) && if ((!IS_11N_ENABLED(priv) &&
!(prx_pd->flags & RXPD_FLAG_PKT_DIRECT_LINK)) || !(prx_pd->flags & RXPD_FLAG_PKT_DIRECT_LINK)) ||
memcmp(priv->adapter, priv->curr_addr, (memcmp(priv->adapter, priv->curr_addr,
prx_pkt->eth803_hdr.dest_addr, MLAN_MAC_ADDR_LENGTH)) { prx_pkt->eth803_hdr.dest_addr, MLAN_MAC_ADDR_LENGTH) &&
!(prx_pd->flags & RXPD_FLAG_PKT_EASYMESH)) ||
((prx_pd->flags & RXPD_FLAG_PKT_EASYMESH) &&
(is_bcast_addr(prx_pkt->eth803_hdr.dest_addr) ||
is_mcast_addr(prx_pkt->eth803_hdr.dest_addr)))) {
priv->snr = prx_pd->snr; priv->snr = prx_pd->snr;
priv->nf = prx_pd->nf; priv->nf = prx_pd->nf;
wlan_process_rx_packet(pmadapter, pmbuf); wlan_process_rx_packet(pmadapter, pmbuf);

View file

@ -4,7 +4,7 @@
* @brief This file contains the handling of TX/RX in MLAN * @brief This file contains the handling of TX/RX in MLAN
* *
* *
* Copyright 2009-2021 NXP * Copyright 2009-2021, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -108,7 +108,7 @@ t_u8 mcast_drv_update_allow_flag = MTRUE;
* *
* @return Nothing * @return Nothing
*/ */
void wlan_drv_mcast_cycle_delay_calulation(pmlan_adapter pmadapter, static void wlan_drv_mcast_cycle_delay_calulation(pmlan_adapter pmadapter,
pmlan_buffer pmbuf) pmlan_buffer pmbuf)
{ {
static t_u32 prev_mcast_sec = 0; static t_u32 prev_mcast_sec = 0;

View file

@ -722,7 +722,8 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
t_u16 ac; t_u16 ac;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
int rx_mcs_supp = 0; int rx_mcs_supp = 0;
#endif #endif
@ -1335,7 +1336,8 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
sizeof(tlv_htcap->ht_cap.supported_mcs_set)); sizeof(tlv_htcap->ht_cap.supported_mcs_set));
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(pmpriv->adapter->card_type) || if (IS_CARD9098(pmpriv->adapter->card_type) ||
IS_CARDIW624(pmpriv->adapter->card_type) || IS_CARDIW624(pmpriv->adapter->card_type) ||
IS_CARD9097(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type) ||
@ -5628,12 +5630,15 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
ENTER(); ENTER();
if (!pmbuf) { if (!pmbuf) {
PRINTM(MERROR, "ERR:event buffer is null\n");
LEAVE(); LEAVE();
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
/* Event length check */ /* Event length check */
if (pmbuf && (pmbuf->data_len - sizeof(eventcause)) > MAX_EVENT_SIZE) { if (pmbuf && (pmbuf->data_len - sizeof(eventcause)) > MAX_EVENT_SIZE) {
pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID; pmbuf->status_code = MLAN_ERROR_PKT_SIZE_INVALID;
PRINTM(MERROR, "ERR:event buffer len invalid=%d\n",
pmbuf->data_len);
LEAVE(); LEAVE();
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }

View file

@ -3,7 +3,7 @@
* @brief This file contains the handling of AP mode ioctls * @brief This file contains the handling of AP mode ioctls
* *
* *
* Copyright 2009-2023 NXP * Copyright 2009-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -2347,6 +2347,8 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
pioctl_req); pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_CSI) if (misc->sub_command == MLAN_OID_MISC_CSI)
status = wlan_misc_csi(pmadapter, pioctl_req); status = wlan_misc_csi(pmadapter, pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_MULTI_AP_CFG)
status = wlan_misc_multi_ap_cfg(pmadapter, pioctl_req);
break; break;
case MLAN_IOCTL_POWER_CFG: case MLAN_IOCTL_POWER_CFG:
power = (mlan_ds_power_cfg *)pioctl_req->pbuf; power = (mlan_ds_power_cfg *)pioctl_req->pbuf;

View file

@ -396,7 +396,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH];
/** Black bird card type */ /** Black bird card type */
#define CARD_TYPE_AW693 0x0c #define CARD_TYPE_AW693 0x0c
/** IW615 card type */ /** IW615 card type */
#define CARD_TYPE_IW615 0x0c #define CARD_TYPE_IW615 0x0d
/** 9098 A0 reverion num */ /** 9098 A0 reverion num */
#define CHIP_9098_REV_A0 1 #define CHIP_9098_REV_A0 1
@ -667,6 +667,7 @@ typedef enum {
#define MEVT_D MBIT(18) #define MEVT_D MBIT(18)
#define MFW_D MBIT(19) #define MFW_D MBIT(19)
#define MIF_D MBIT(20) #define MIF_D MBIT(20)
#define MFWDP_D MBIT(21)
#define MENTRY MBIT(28) #define MENTRY MBIT(28)
#define MWARN MBIT(29) #define MWARN MBIT(29)

View file

@ -739,7 +739,7 @@ typedef struct _mlan_chan_list {
#define CHAN_FLAGS_MAX MBIT(31) #define CHAN_FLAGS_MAX MBIT(31)
/** Maximum response buffer length */ /** Maximum response buffer length */
#define ASSOC_RSP_BUF_SIZE 500 #define ASSOC_RSP_BUF_SIZE 2060
/** Type definition of mlan_ds_misc_assoc_rsp for MLAN_OID_MISC_ASSOC_RSP */ /** Type definition of mlan_ds_misc_assoc_rsp for MLAN_OID_MISC_ASSOC_RSP */
typedef struct _mlan_ds_misc_assoc_rsp { typedef struct _mlan_ds_misc_assoc_rsp {
@ -4025,6 +4025,7 @@ typedef struct _mlan_ds_11ax_cfg {
#define MLAN_11AX_TWT_SETUP_SUBID 0x114 #define MLAN_11AX_TWT_SETUP_SUBID 0x114
#define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115 #define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115
#define MLAN_11AX_TWT_REPORT_SUBID 0x116 #define MLAN_11AX_TWT_REPORT_SUBID 0x116
#define MLAN_11AX_TWT_INFORMATION_SUBID 0x119
#define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322) #define MRVL_DOT11AX_ENABLE_SR_TLV_ID (PROPRIETARY_TLV_BASE_ID + 322)
#define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323) #define MRVL_DOT11AX_OBSS_PD_OFFSET_TLV_ID (PROPRIETARY_TLV_BASE_ID + 323)
@ -4202,6 +4203,18 @@ typedef MLAN_PACK_START struct _mlan_ds_twt_report {
t_u8 data[36]; t_u8 data[36];
} MLAN_PACK_END mlan_ds_twt_report, *pmlan_ds_twt_report; } MLAN_PACK_END mlan_ds_twt_report, *pmlan_ds_twt_report;
/** Type definition of mlan_ds_twt_information for MLAN_OID_11AX_TWT_CFG */
typedef struct MLAN_PACK_START _mlan_ds_twt_information {
/** TWT Flow Identifier. Range: [0-7] */
t_u8 flow_identifier;
/** Suspend Duration. Range: [0-UINT32_MAX]
* 0:Suspend forever;
* Else:Suspend agreement for specific duration in milli seconds,
* after than resume the agreement and enter SP immediately
*/
t_u32 suspend_duration;
} MLAN_PACK_END mlan_ds_twt_information, *pmlan_ds_twt_information;
/** Type definition of mlan_ds_twtcfg for MLAN_OID_11AX_TWT_CFG */ /** Type definition of mlan_ds_twtcfg for MLAN_OID_11AX_TWT_CFG */
typedef struct MLAN_PACK_START _mlan_ds_twtcfg { typedef struct MLAN_PACK_START _mlan_ds_twtcfg {
/** Sub-command */ /** Sub-command */
@ -4217,6 +4230,10 @@ typedef struct MLAN_PACK_START _mlan_ds_twtcfg {
mlan_ds_twt_teardown twt_teardown; mlan_ds_twt_teardown twt_teardown;
/** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */ /** TWT report for Sub ID: MLAN_11AX_TWT_REPORT_SUBID */
mlan_ds_twt_report twt_report; mlan_ds_twt_report twt_report;
/** TWT Information config for Sub ID:
* MLAN_11AX_TWT_INFORMATION_SUBID
*/
mlan_ds_twt_information twt_information;
} param; } param;
} MLAN_PACK_END mlan_ds_twtcfg, *pmlan_ds_twtcfg; } MLAN_PACK_END mlan_ds_twtcfg, *pmlan_ds_twtcfg;
@ -4296,14 +4313,16 @@ enum _mlan_reg_type {
MLAN_REG_BCA = 7, MLAN_REG_BCA = 7,
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \ defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(SD9177) || defined(SDIW615) || defined(USBIW615) defined(USBIW624) || defined(SD9097) || defined(SD9177) || \
defined(SDIW615) || defined(USBIW615)
MLAN_REG_CIU = 8, MLAN_REG_CIU = 8,
#endif #endif
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \ #if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \ defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \ defined(SDAW693) || defined(PCIEAW693) || defined(PCIEIW624) || \
defined(SDIW615) || defined(USBIW615) defined(USBIW624) || defined(SD9097) || defined(SDIW615) || \
defined(USBIW615)
MLAN_REG_MAC2 = 0x81, MLAN_REG_MAC2 = 0x81,
MLAN_REG_BBP2 = 0x82, MLAN_REG_BBP2 = 0x82,
MLAN_REG_RF2 = 0x83, MLAN_REG_RF2 = 0x83,
@ -5083,7 +5102,7 @@ typedef MLAN_PACK_START struct _mlan_ds_drcs_cfg {
/** Channel swith time (in TU) for chan_idx */ /** Channel swith time (in TU) for chan_idx */
t_u8 switchtime; t_u8 switchtime;
/** Undoze time (in TU) for chan_idx */ /** Undoze time (in TU) for chan_idx */
t_u8 undozetime; t_u8 rx_wait_time;
/** Rx traffic control scheme when channel switch*/ /** Rx traffic control scheme when channel switch*/
/** only valid for GC/STA interface*/ /** only valid for GC/STA interface*/
t_u8 mode; t_u8 mode;
@ -5844,7 +5863,9 @@ struct MLAN_PACK_START mfg_cmd_tx_frame2 {
/** STBC */ /** STBC */
t_u32 stbc; t_u32 stbc;
/** power id */ /** power id */
t_u32 rsvd[2]; t_u32 rsvd[1];
/**signal bw*/
t_u32 signal_bw;
/** NumPkt */ /** NumPkt */
t_u32 NumPkt; t_u32 NumPkt;
/** MaxPE */ /** MaxPE */

View file

@ -3,7 +3,7 @@
* @brief This file contains the functions for CFG80211. * @brief This file contains the functions for CFG80211.
* *
* *
* Copyright 2011-2023 NXP * Copyright 2011-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -206,8 +206,8 @@ void *woal_get_netdev_priv(struct net_device *dev)
* *
* @return radio_type * @return radio_type
*/ */
struct ieee80211_channel *woal_get_ieee80211_channel(moal_private *priv, static struct ieee80211_channel *
chan_band_info *pchan_info) woal_get_ieee80211_channel(moal_private *priv, chan_band_info *pchan_info)
{ {
enum ieee80211_band band = IEEE80211_BAND_2GHZ; enum ieee80211_band band = IEEE80211_BAND_2GHZ;
int freq = 0; int freq = 0;
@ -2627,38 +2627,6 @@ void woal_cfg80211_mgmt_frame_register(struct wiphy *wiphy,
LEAVE(); LEAVE();
} }
#ifdef UAP_CFG80211
#if KERNEL_VERSION(3, 12, 0) <= CFG80211_VERSION_CODE
/*
* @brief prepare and send WOAL_EVENT_CANCEL_CHANRPT
*
* @param priv A pointer moal_private structure
*
* @return N/A
*/
void woal_cancel_chanrpt_event(moal_private *priv)
{
struct woal_event *evt;
unsigned long flags;
moal_handle *handle = priv->phandle;
evt = kzalloc(sizeof(struct woal_event), GFP_ATOMIC);
if (!evt) {
PRINTM(MERROR, "Fail to alloc memory for deauth event\n");
LEAVE();
return;
}
evt->priv = priv;
evt->type = WOAL_EVENT_CANCEL_CHANRPT;
INIT_LIST_HEAD(&evt->link);
spin_lock_irqsave(&handle->evt_lock, flags);
list_add_tail(&evt->link, &handle->evt_queue);
spin_unlock_irqrestore(&handle->evt_lock, flags);
queue_work(handle->evt_workqueue, &handle->evt_work);
}
#endif
#endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
/* /*
* @brief check if we need set remain_on_channel * @brief check if we need set remain_on_channel
@ -2668,7 +2636,7 @@ void woal_cancel_chanrpt_event(moal_private *priv)
* *
* @return MFALSE-no need set remain_on_channel * @return MFALSE-no need set remain_on_channel
*/ */
t_u8 woal_check_mgmt_tx_channel(moal_private *priv, static t_u8 woal_check_mgmt_tx_channel(moal_private *priv,
struct ieee80211_channel *chan, struct ieee80211_channel *chan,
unsigned int wait) unsigned int wait)
{ {
@ -2696,8 +2664,9 @@ t_u8 woal_check_mgmt_tx_channel(moal_private *priv,
* *
* @return 0 -- success, otherwise fail * @return 0 -- success, otherwise fail
*/ */
int woal_mgmt_tx(moal_private *priv, const u8 *buf, size_t len, static int woal_mgmt_tx(moal_private *priv, const u8 *buf, size_t len,
struct ieee80211_channel *chan, u64 cookie, unsigned int wait) struct ieee80211_channel *chan, u64 cookie,
unsigned int wait)
{ {
int ret = 0; int ret = 0;
pmlan_buffer pmbuf = NULL; pmlan_buffer pmbuf = NULL;
@ -5198,7 +5167,9 @@ void woal_cfg80211_notify_channel(moal_private *priv,
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
if (MLAN_STATUS_SUCCESS == if (MLAN_STATUS_SUCCESS ==
woal_chandef_create(priv, &chandef, pchan_info)) { woal_chandef_create(priv, &chandef, pchan_info)) {
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(6, 7, 0) <= CFG80211_VERSION_CODE
wiphy_lock(priv->wdev->wiphy);
#elif KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
mutex_lock(&priv->wdev->mtx); mutex_lock(&priv->wdev->mtx);
#endif #endif
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0)
@ -5211,7 +5182,9 @@ void woal_cfg80211_notify_channel(moal_private *priv,
#else #else
cfg80211_ch_switch_notify(priv->netdev, &chandef); cfg80211_ch_switch_notify(priv->netdev, &chandef);
#endif #endif
#if KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(6, 7, 0) <= CFG80211_VERSION_CODE
wiphy_unlock(priv->wdev->wiphy);
#elif KERNEL_VERSION(3, 14, 0) <= CFG80211_VERSION_CODE
mutex_unlock(&priv->wdev->mtx); mutex_unlock(&priv->wdev->mtx);
#endif #endif
priv->channel = pchan_info->channel; priv->channel = pchan_info->channel;

View file

@ -3,7 +3,7 @@
* @brief This file contains the CFG80211 specific defines. * @brief This file contains the CFG80211 specific defines.
* *
* *
* Copyright 2011-2022 NXP * Copyright 2011-2022, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -431,7 +431,13 @@ int woal_cfg80211_set_coalesce(struct wiphy *wiphy,
struct cfg80211_coalesce *coalesce); struct cfg80211_coalesce *coalesce);
#endif #endif
#if KERNEL_VERSION(3, 4, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(6, 7, 0) <= CFG80211_VERSION_CODE
int woal_cfg80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_ap_settings *params);
int woal_cfg80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_ap_update *info);
#elif KERNEL_VERSION(3, 4, 0) <= CFG80211_VERSION_CODE
int woal_cfg80211_add_beacon(struct wiphy *wiphy, struct net_device *dev, int woal_cfg80211_add_beacon(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_ap_settings *params); struct cfg80211_ap_settings *params);

View file

@ -3,7 +3,7 @@
* @brief This file contains the functions for CFG80211 vendor. * @brief This file contains the functions for CFG80211 vendor.
* *
* *
* Copyright 2015-2022 NXP * Copyright 2015-2022, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -1142,7 +1142,7 @@ done:
* *
* @return An invalid ring id for failure or valid ring id on success. * @return An invalid ring id for failure or valid ring id on success.
*/ */
int woal_get_ring_id_by_name(moal_private *priv, char *ring_name) static int woal_get_ring_id_by_name(moal_private *priv, char *ring_name)
{ {
int id; int id;
wifi_ring_buffer *ring; wifi_ring_buffer *ring;
@ -1172,8 +1172,9 @@ int woal_get_ring_id_by_name(moal_private *priv, char *ring_name)
* *
* @return 0: success 1: fail * @return 0: success 1: fail
*/ */
int woal_start_logging(moal_private *priv, char *ring_name, int log_level, static int woal_start_logging(moal_private *priv, char *ring_name,
int flags, int time_intval, int threshold) int log_level, int flags, int time_intval,
int threshold)
{ {
int ret = 0; int ret = 0;
int ring_id; int ring_id;
@ -1452,7 +1453,7 @@ static t_u32 woal_get_ring_next_entry(wifi_ring_buffer *ring, t_u32 offset)
* *
* @return data length * @return data length
*/ */
int woal_ring_pull_data(moal_private *priv, int ring_id, void *data, static int woal_ring_pull_data(moal_private *priv, int ring_id, void *data,
t_s32 buf_len) t_s32 buf_len)
{ {
t_s32 r_len = 0; t_s32 r_len = 0;
@ -1499,8 +1500,9 @@ int woal_ring_pull_data(moal_private *priv, int ring_id, void *data,
* *
* @return 0: success 1: fail * @return 0: success 1: fail
*/ */
int woal_ring_buffer_data_vendor_event(moal_private *priv, int ring_id, static int
t_u8 *data, int len, woal_ring_buffer_data_vendor_event(moal_private *priv, int ring_id, t_u8 *data,
int len,
wifi_ring_buffer_status *ring_status) wifi_ring_buffer_status *ring_status)
{ {
struct wiphy *wiphy = NULL; struct wiphy *wiphy = NULL;
@ -1588,7 +1590,7 @@ done:
* *
* @return void * @return void
*/ */
void woal_ring_poll_worker(struct work_struct *work) static void woal_ring_poll_worker(struct work_struct *work)
{ {
struct delayed_work *d_work = to_delayed_work(work); struct delayed_work *d_work = to_delayed_work(work);
wifi_ring_buffer *ring_info = wifi_ring_buffer *ring_info =
@ -1659,7 +1661,7 @@ exit:
* *
* @return 0: success -1: fail * @return 0: success -1: fail
*/ */
int woal_ring_push_data(moal_private *priv, int ring_id, static int woal_ring_push_data(moal_private *priv, int ring_id,
wifi_ring_buffer_entry *hdr, void *data) wifi_ring_buffer_entry *hdr, void *data)
{ {
unsigned long flags; unsigned long flags;
@ -2073,7 +2075,7 @@ done:
* *
* @return 0: success 1: fail * @return 0: success 1: fail
*/ */
int woal_wake_reason_vendor_event(moal_private *priv, static int woal_wake_reason_vendor_event(moal_private *priv,
mlan_ds_hs_wakeup_reason wake_reason) mlan_ds_hs_wakeup_reason wake_reason)
{ {
struct wiphy *wiphy = NULL; struct wiphy *wiphy = NULL;
@ -2166,9 +2168,8 @@ woal_cfg80211_subcmd_start_packet_fate_monitor(struct wiphy *wiphy,
t_u32 reply_len = 0; t_u32 reply_len = 0;
int ret = 0; int ret = 0;
/* TODO: Tune pkt fate monitor for TP, Disabling it for now */ struct net_device *dev = wdev->netdev;
// struct net_device *dev = wdev->netdev; moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
// moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
ENTER(); ENTER();
@ -2180,8 +2181,9 @@ woal_cfg80211_subcmd_start_packet_fate_monitor(struct wiphy *wiphy,
goto done; goto done;
} }
/* TODO: Tune pkt fate monitor for TP, Disabling it for now */ /* Enable pkt fate monitor and use drvdbg MDAT_D to control forwarding
// priv->pkt_fate_monitor_enable = MTRUE; * data packet to kernel */
priv->pkt_fate_monitor_enable = MTRUE;
ret = cfg80211_vendor_cmd_reply(skb); ret = cfg80211_vendor_cmd_reply(skb);
@ -2206,10 +2208,11 @@ done:
* *
* @return 0: success 1: fail * @return 0: success 1: fail
*/ */
int woal_packet_fate_vendor_event(moal_private *priv, static int woal_packet_fate_vendor_event(moal_private *priv,
packet_fate_packet_type pkt_type, t_u8 fate, packet_fate_packet_type pkt_type,
frame_type payload_type, t_u32 drv_ts_usec, t_u8 fate, frame_type payload_type,
t_u32 fw_ts_usec, t_u8 *data, t_u32 len) t_u32 drv_ts_usec, t_u32 fw_ts_usec,
t_u8 *data, t_u32 len)
{ {
struct wiphy *wiphy = NULL; struct wiphy *wiphy = NULL;
struct sk_buff *skb = NULL; struct sk_buff *skb = NULL;
@ -2529,8 +2532,9 @@ done:
* @return non-zero if packet should be passed to AP, zero if * @return non-zero if packet should be passed to AP, zero if
* packet should be dropped. * packet should be dropped.
*/ */
int process_packet(const t_u8 *program, t_u32 program_len, const t_u8 *packet, static int process_packet(const t_u8 *program, t_u32 program_len,
t_u32 packet_len, t_u32 filter_age) const t_u8 *packet, t_u32 packet_len,
t_u32 filter_age)
{ {
/* Program counter */ /* Program counter */
t_u32 pc = 0; t_u32 pc = 0;

View file

@ -4,7 +4,7 @@
* @brief This file contains private ioctl functions * @brief This file contains private ioctl functions
* *
* Copyright 2014-2023 NXP * Copyright 2014-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -4076,7 +4076,7 @@ done:
static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf, static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf,
t_u32 respbuflen, t_u8 bBSSID) t_u32 respbuflen, t_u8 bBSSID)
{ {
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
moal_handle *handle = priv->phandle; moal_handle *handle = priv->phandle;
int ret = 0; int ret = 0;
int header_len = 0; int header_len = 0;
@ -4102,7 +4102,12 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf,
copy_len = strlen(respbuf) - header_len; copy_len = strlen(respbuf) - header_len;
buflen = MIN(copy_len, (int)(sizeof(buf) - 1)); buflen = MIN(copy_len, (int)(sizeof(buf) - 1));
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
memset(&ssid_bssid, 0, sizeof(mlan_ssid_bssid)); ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
LEAVE();
return -ENOMEM;
}
moal_memcpy_ext(handle, buf, respbuf + header_len, buflen, sizeof(buf)); moal_memcpy_ext(handle, buf, respbuf + header_len, buflen, sizeof(buf));
priv->assoc_with_mac = MFALSE; priv->assoc_with_mac = MFALSE;
@ -4124,7 +4129,7 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf,
if (buf[i] == ':') { if (buf[i] == ':') {
mac_idx++; mac_idx++;
} else { } else {
ssid_bssid.bssid[mac_idx] = ssid_bssid->bssid[mac_idx] =
(t_u8)woal_atox(buf + i); (t_u8)woal_atox(buf + i);
while ((i < buflen) && isxdigit(buf[i + 1])) while ((i < buflen) && isxdigit(buf[i + 1]))
/* Skip entire hex value */ /* Skip entire hex value */
@ -4134,32 +4139,32 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf,
/* Skip one space between the BSSID and start of the SSID */ /* Skip one space between the BSSID and start of the SSID */
i++; i++;
PRINTM(MMSG, "Trying to associate AP BSSID = [" MACSTR "]\n", PRINTM(MMSG, "Trying to associate AP BSSID = [" MACSTR "]\n",
MAC2STR(ssid_bssid.bssid)); MAC2STR(ssid_bssid->bssid));
priv->assoc_with_mac = MTRUE; priv->assoc_with_mac = MTRUE;
} }
ssid_bssid.ssid.ssid_len = buflen - i; ssid_bssid->ssid.ssid_len = buflen - i;
/* Check the size of the ssid_len */ /* Check the size of the ssid_len */
if (ssid_bssid.ssid.ssid_len > MLAN_MAX_SSID_LENGTH + 1) { if (ssid_bssid->ssid.ssid_len > MLAN_MAX_SSID_LENGTH + 1) {
PRINTM(MERROR, "ssid_bssid.ssid.ssid_len = %d\n", PRINTM(MERROR, "ssid_bssid->ssid.ssid_len = %d\n",
ssid_bssid.ssid.ssid_len); ssid_bssid->ssid.ssid_len);
ret = -E2BIG; ret = -E2BIG;
goto setessid_ret; goto setessid_ret;
} }
/* Copy the SSID */ /* Copy the SSID */
moal_memcpy_ext(handle, ssid_bssid.ssid.ssid, buf + i, moal_memcpy_ext(handle, ssid_bssid->ssid.ssid, buf + i,
ssid_bssid.ssid.ssid_len, MLAN_MAX_SSID_LENGTH); ssid_bssid->ssid.ssid_len, MLAN_MAX_SSID_LENGTH);
if (!ssid_bssid.ssid.ssid_len || if (!ssid_bssid->ssid.ssid_len ||
(MFALSE == woal_ssid_valid(&ssid_bssid.ssid))) { (MFALSE == woal_ssid_valid(&ssid_bssid->ssid))) {
PRINTM(MERROR, "Invalid SSID - aborting set_essid\n"); PRINTM(MERROR, "Invalid SSID - aborting set_essid\n");
ret = -EINVAL; ret = -EINVAL;
goto setessid_ret; goto setessid_ret;
} }
PRINTM(MMSG, "Trying to associate AP SSID = %s\n", PRINTM(MMSG, "Trying to associate AP SSID = %s\n",
(char *)ssid_bssid.ssid.ssid); (char *)ssid_bssid->ssid.ssid);
/* Cancel re-association */ /* Cancel re-association */
priv->reassoc_required = MFALSE; priv->reassoc_required = MFALSE;
@ -4174,14 +4179,14 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf,
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE); woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE);
if (MTRUE == woal_is_connected(priv, &ssid_bssid)) { if (MTRUE == woal_is_connected(priv, ssid_bssid)) {
PRINTM(MIOCTL, "Already connect to the network\n"); PRINTM(MIOCTL, "Already connect to the network\n");
ret = snprintf(respbuf, CMD_BUF_LEN, ret = snprintf(respbuf, CMD_BUF_LEN,
"Has already connected to this ESSID!\n") + "Has already connected to this ESSID!\n") +
1; 1;
goto setessid_ret; goto setessid_ret;
} }
moal_memcpy_ext(handle, &priv->prev_ssid_bssid, &ssid_bssid, moal_memcpy_ext(handle, &priv->prev_ssid_bssid, ssid_bssid,
sizeof(mlan_ssid_bssid), sizeof(mlan_ssid_bssid)); sizeof(mlan_ssid_bssid), sizeof(mlan_ssid_bssid));
priv->auto_assoc_priv.drv_reconnect.status = MFALSE; priv->auto_assoc_priv.drv_reconnect.status = MFALSE;
priv->auto_assoc_priv.auto_assoc_trigger_flag = priv->auto_assoc_priv.auto_assoc_trigger_flag =
@ -4199,6 +4204,7 @@ static int woal_priv_assocessid(moal_private *priv, t_u8 *respbuf,
ret = snprintf(respbuf, CMD_BUF_LEN, "%s\n", buf) + 1; ret = snprintf(respbuf, CMD_BUF_LEN, "%s\n", buf) + 1;
setessid_ret: setessid_ret:
kfree(ssid_bssid);
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE); woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE);
MOAL_REL_SEMAPHORE(&handle->reassoc_sem); MOAL_REL_SEMAPHORE(&handle->reassoc_sem);
@ -5679,7 +5685,7 @@ static int woal_priv_set_ap(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen)
t_u8 *data_ptr; t_u8 *data_ptr;
const t_u8 bcast[MLAN_MAC_ADDR_LENGTH] = {255, 255, 255, 255, 255, 255}; const t_u8 bcast[MLAN_MAC_ADDR_LENGTH] = {255, 255, 255, 255, 255, 255};
const t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0, 0, 0, 0, 0, 0}; const t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0, 0, 0, 0, 0, 0};
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
mlan_bss_info bss_info; mlan_bss_info bss_info;
struct mwreq *mwr; struct mwreq *mwr;
struct sockaddr *awrq; struct sockaddr *awrq;
@ -5717,8 +5723,12 @@ static int woal_priv_set_ap(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen)
goto done; goto done;
} }
/* Broadcast MAC means search for best network */ ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
memset(&ssid_bssid, 0, sizeof(mlan_ssid_bssid)); if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
ret = -ENOMEM;
goto done;
}
if (memcmp(bcast, awrq->sa_data, MLAN_MAC_ADDR_LENGTH)) { if (memcmp(bcast, awrq->sa_data, MLAN_MAC_ADDR_LENGTH)) {
/* Check if we are already assoicated to the AP */ /* Check if we are already assoicated to the AP */
@ -5726,21 +5736,22 @@ static int woal_priv_set_ap(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen)
if (!memcmp(awrq->sa_data, &bss_info.bssid, ETH_ALEN)) if (!memcmp(awrq->sa_data, &bss_info.bssid, ETH_ALEN))
goto done; goto done;
} }
moal_memcpy_ext(priv->phandle, &ssid_bssid.bssid, awrq->sa_data, moal_memcpy_ext(priv->phandle, &ssid_bssid->bssid,
ETH_ALEN, sizeof(mlan_802_11_mac_addr)); awrq->sa_data, ETH_ALEN,
sizeof(mlan_802_11_mac_addr));
} }
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_find_best_network(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_find_best_network(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
PRINTM(MERROR, PRINTM(MERROR,
"ASSOC: WAP: MAC address not found in BSSID List\n"); "ASSOC: WAP: MAC address not found in BSSID List\n");
ret = -ENETUNREACH; ret = -ENETUNREACH;
goto done; goto done;
} }
/* Zero SSID implies use BSSID to connect */ /* Zero SSID implies use BSSID to connect */
memset(&ssid_bssid.ssid, 0, sizeof(mlan_802_11_ssid)); memset(&ssid_bssid->ssid, 0, sizeof(mlan_802_11_ssid));
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_bss_start(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_bss_start(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }
@ -5761,6 +5772,8 @@ static int woal_priv_set_ap(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen)
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
done: done:
if (ssid_bssid)
kfree(ssid_bssid);
LEAVE(); LEAVE();
return ret; return ret;
} }
@ -5879,7 +5892,7 @@ static int woal_priv_set_essid(moal_private *priv, t_u8 *respbuf,
t_u32 respbuflen) t_u32 respbuflen)
{ {
mlan_802_11_ssid req_ssid; mlan_802_11_ssid req_ssid;
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
moal_handle *handle = priv->phandle; moal_handle *handle = priv->phandle;
#ifdef REASSOCIATION #ifdef REASSOCIATION
mlan_bss_info bss_info; mlan_bss_info bss_info;
@ -5914,7 +5927,13 @@ static int woal_priv_set_essid(moal_private *priv, t_u8 *respbuf,
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE); woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE);
memset(&req_ssid, 0, sizeof(mlan_802_11_ssid)); memset(&req_ssid, 0, sizeof(mlan_802_11_ssid));
memset(&ssid_bssid, 0, sizeof(mlan_ssid_bssid));
ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
ret = -ENOMEM;
goto setessid_ret;
}
req_ssid.ssid_len = mwr->u.essid.length; req_ssid.ssid_len = mwr->u.essid.length;
@ -5948,10 +5967,10 @@ static int woal_priv_set_essid(moal_private *priv, t_u8 *respbuf,
PRINTM(MINFO, "Requested new SSID = %s\n", PRINTM(MINFO, "Requested new SSID = %s\n",
(char *)req_ssid.ssid); (char *)req_ssid.ssid);
moal_memcpy_ext(handle, &ssid_bssid.ssid, &req_ssid, moal_memcpy_ext(handle, &ssid_bssid->ssid, &req_ssid,
sizeof(mlan_802_11_ssid), sizeof(mlan_802_11_ssid),
sizeof(mlan_802_11_ssid)); sizeof(mlan_802_11_ssid));
if (MTRUE == woal_is_connected(priv, &ssid_bssid)) { if (MTRUE == woal_is_connected(priv, ssid_bssid)) {
PRINTM(MIOCTL, "Already connect to the network\n"); PRINTM(MIOCTL, "Already connect to the network\n");
goto setessid_ret; goto setessid_ret;
} }
@ -5990,7 +6009,7 @@ static int woal_priv_set_essid(moal_private *priv, t_u8 *respbuf,
if (mwr->u.essid.flags != 0xFFFF) { if (mwr->u.essid.flags != 0xFFFF) {
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_find_essid(priv, &ssid_bssid, woal_find_essid(priv, ssid_bssid,
MOAL_IOCTL_WAIT)) { MOAL_IOCTL_WAIT)) {
/* Do specific SSID scanning */ /* Do specific SSID scanning */
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
@ -6007,24 +6026,23 @@ static int woal_priv_set_essid(moal_private *priv, t_u8 *respbuf,
if (mode != MW_MODE_ADHOC) { if (mode != MW_MODE_ADHOC) {
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_find_best_network(priv, MOAL_IOCTL_WAIT, woal_find_best_network(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
&ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto setessid_ret; goto setessid_ret;
} }
} }
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
else if (MLAN_STATUS_SUCCESS != else if (MLAN_STATUS_SUCCESS !=
woal_find_best_network(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) woal_find_best_network(priv, MOAL_IOCTL_WAIT, ssid_bssid))
/* Adhoc start, Check the channel command */ /* Adhoc start, Check the channel command */
woal_11h_channel_check_ioctl(priv, MOAL_IOCTL_WAIT); woal_11h_channel_check_ioctl(priv, MOAL_IOCTL_WAIT);
#endif #endif
/* Connect to BSS by ESSID */ /* Connect to BSS by ESSID */
memset(&ssid_bssid.bssid, 0, MLAN_MAC_ADDR_LENGTH); memset(&ssid_bssid->bssid, 0, MLAN_MAC_ADDR_LENGTH);
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_bss_start(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_bss_start(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto setessid_ret; goto setessid_ret;
} }
@ -6043,6 +6061,8 @@ static int woal_priv_set_essid(moal_private *priv, t_u8 *respbuf,
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
setessid_ret: setessid_ret:
if (ssid_bssid)
kfree(ssid_bssid);
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE); woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE);
#ifdef REASSOCIATION #ifdef REASSOCIATION
@ -8691,7 +8711,7 @@ static int woal_priv_drcs_time_slicing_cfg(moal_private *priv, t_u8 *respbuf,
drcs_cfg = (mlan_ds_drcs_cfg *)&cfg->param.drcs_cfg[0]; drcs_cfg = (mlan_ds_drcs_cfg *)&cfg->param.drcs_cfg[0];
drcs_cfg->chantime = (t_u8)data[0]; drcs_cfg->chantime = (t_u8)data[0];
drcs_cfg->switchtime = (t_u8)data[1]; drcs_cfg->switchtime = (t_u8)data[1];
drcs_cfg->undozetime = (t_u8)data[2]; drcs_cfg->rx_wait_time = (t_u8)data[2];
drcs_cfg->mode = (t_u8)data[3]; drcs_cfg->mode = (t_u8)data[3];
/* Set the same parameters for two channels*/ /* Set the same parameters for two channels*/
if (user_data_len < (int)ARRAY_SIZE(data)) if (user_data_len < (int)ARRAY_SIZE(data))
@ -8703,7 +8723,7 @@ static int woal_priv_drcs_time_slicing_cfg(moal_private *priv, t_u8 *respbuf,
drcs_cfg->chan_idx = 0x2; drcs_cfg->chan_idx = 0x2;
drcs_cfg->chantime = (t_u8)data[4]; drcs_cfg->chantime = (t_u8)data[4];
drcs_cfg->switchtime = (t_u8)data[5]; drcs_cfg->switchtime = (t_u8)data[5];
drcs_cfg->undozetime = (t_u8)data[6]; drcs_cfg->rx_wait_time = (t_u8)data[6];
drcs_cfg->mode = (t_u8)data[7]; drcs_cfg->mode = (t_u8)data[7];
} }
} }
@ -13828,7 +13848,7 @@ static int woal_priv_associate_ssid_bssid(moal_private *priv, t_u8 *respbuf,
{ {
int ret = 0, copy_len = 0; int ret = 0, copy_len = 0;
int header_len = 0; int header_len = 0;
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
#ifdef REASSOCIATION #ifdef REASSOCIATION
mlan_bss_info bss_info; mlan_bss_info bss_info;
#endif #endif
@ -13849,7 +13869,12 @@ static int woal_priv_associate_ssid_bssid(moal_private *priv, t_u8 *respbuf,
mac_idx = 0; mac_idx = 0;
buflen = MIN(copy_len, (int)(sizeof(buf) - 1)); buflen = MIN(copy_len, (int)(sizeof(buf) - 1));
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
memset(&ssid_bssid, 0, sizeof(ssid_bssid)); ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
ret = -ENOMEM;
goto done;
}
if (buflen < (3 * ETH_ALEN) + 2) { if (buflen < (3 * ETH_ALEN) + 2) {
PRINTM(MERROR, PRINTM(MERROR,
@ -13874,7 +13899,7 @@ static int woal_priv_associate_ssid_bssid(moal_private *priv, t_u8 *respbuf,
if (buf[i] == ':') { if (buf[i] == ':') {
mac_idx++; mac_idx++;
} else { } else {
ssid_bssid.bssid[mac_idx] = (t_u8)woal_atox(buf + i); ssid_bssid->bssid[mac_idx] = (t_u8)woal_atox(buf + i);
while (((i < buflen) && isxdigit(buf[i + 1]))) while (((i < buflen) && isxdigit(buf[i + 1])))
/* Skip entire hex value */ /* Skip entire hex value */
@ -13886,17 +13911,17 @@ static int woal_priv_associate_ssid_bssid(moal_private *priv, t_u8 *respbuf,
i++; i++;
/* Copy the SSID */ /* Copy the SSID */
ssid_bssid.ssid.ssid_len = buflen - i; ssid_bssid->ssid.ssid_len = buflen - i;
moal_memcpy_ext(priv->phandle, ssid_bssid.ssid.ssid, buf + i, moal_memcpy_ext(priv->phandle, ssid_bssid->ssid.ssid, buf + i,
sizeof(ssid_bssid.ssid.ssid), sizeof(ssid_bssid->ssid.ssid),
sizeof(ssid_bssid.ssid.ssid)); sizeof(ssid_bssid->ssid.ssid));
PRINTM(MCMND, "iwpriv assoc: AP=[" MACSTR "], ssid(%d)=[%s]\n", PRINTM(MCMND, "iwpriv assoc: AP=[" MACSTR "], ssid(%d)=[%s]\n",
MAC2STR(ssid_bssid.bssid), (int)ssid_bssid.ssid.ssid_len, MAC2STR(ssid_bssid->bssid), (int)ssid_bssid->ssid.ssid_len,
ssid_bssid.ssid.ssid); ssid_bssid->ssid.ssid);
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_bss_start(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_bss_start(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }
@ -13915,6 +13940,8 @@ static int woal_priv_associate_ssid_bssid(moal_private *priv, t_u8 *respbuf,
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
done: done:
if (ssid_bssid)
kfree(ssid_bssid);
LEAVE(); LEAVE();
return ret; return ret;
} }
@ -15201,6 +15228,62 @@ done:
return ret; return ret;
} }
/**
* @brief Configure TWT Information parameters
*
* @param priv Pointer to the mlan_private driver data struct
* @param respbuf A pointer to response buffer
* @param len Length used
* @param respbuflen Available length of response buffer
*
* @return Number of bytes written if successful else negative
* value
*/
static int woal_priv_twt_information(moal_private *priv, t_u8 *respbuf,
t_u8 len, t_u32 respbuflen)
{
mlan_ioctl_req *req = NULL;
mlan_ds_twtcfg *cfg = NULL;
int ret = 0;
mlan_status status = MLAN_STATUS_SUCCESS;
ENTER();
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_twtcfg));
if (req == NULL) {
PRINTM(MERROR, "Failed to allocate ioctl_req!\n");
ret = -ENOMEM;
goto done;
}
req->req_id = MLAN_IOCTL_11AX_CFG;
req->action = MLAN_ACT_SET;
cfg = (mlan_ds_twtcfg *)req->pbuf;
cfg->sub_command = MLAN_OID_11AX_TWT_CFG;
cfg->sub_id = MLAN_11AX_TWT_INFORMATION_SUBID;
if (len) {
moal_memcpy_ext(priv->phandle,
(t_u8 *)&cfg->param.twt_information, respbuf,
len, sizeof(mlan_ds_twt_information));
}
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "woal_request_ioctl failed!\n");
ret = -EFAULT;
goto done;
}
ret = sizeof(mlan_ds_twt_information);
done:
if (status != MLAN_STATUS_PENDING) {
kfree(req);
}
LEAVE();
return ret;
}
#ifdef WIFI_DIRECT_SUPPORT #ifdef WIFI_DIRECT_SUPPORT
#if defined(UAP_CFG80211) #if defined(UAP_CFG80211)
/** /**
@ -21285,6 +21368,21 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
priv_cmd.total_len); priv_cmd.total_len);
len += strlen(PRIV_CMD_TWT_REPORT) + strlen(CMD_NXP); len += strlen(PRIV_CMD_TWT_REPORT) + strlen(CMD_NXP);
goto handled; goto handled;
} else if (strnicmp(buf + strlen(CMD_NXP),
PRIV_CMD_TWT_INFORMATION,
strlen(PRIV_CMD_TWT_INFORMATION)) == 0) {
pdata = buf + strlen(CMD_NXP) +
strlen(PRIV_CMD_TWT_INFORMATION);
len = priv_cmd.used_len -
strlen(PRIV_CMD_TWT_INFORMATION) -
strlen(CMD_NXP);
len = woal_priv_twt_information(priv, pdata, len,
priv_cmd.total_len);
len += strlen(PRIV_CMD_TWT_INFORMATION) +
strlen(CMD_NXP);
goto handled;
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
} else if (strnicmp(buf + strlen(CMD_NXP), } else if (strnicmp(buf + strlen(CMD_NXP),
PRIV_CMD_GET_CFG_CHAN_LIST, PRIV_CMD_GET_CFG_CHAN_LIST,

View file

@ -4,7 +4,7 @@
* @brief This file contains definition for private IOCTL call. * @brief This file contains definition for private IOCTL call.
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -405,6 +405,8 @@ typedef struct _ssu_params_cfg {
#define PRIV_CMD_TWT_TEARDOWN "twt_teardown" #define PRIV_CMD_TWT_TEARDOWN "twt_teardown"
/** Private command: TWT report Cfg */ /** Private command: TWT report Cfg */
#define PRIV_CMD_TWT_REPORT "twt_report" #define PRIV_CMD_TWT_REPORT "twt_report"
/** Private command: TWT Information Cfg */
#define PRIV_CMD_TWT_INFORMATION "twt_information"
#define PRIV_CMD_LPM "lpm" #define PRIV_CMD_LPM "lpm"
@ -414,6 +416,10 @@ int woal_do_ioctl(struct net_device *dev, struct ifreq *req, void __user *data,
#else #else
int woal_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd); int woal_do_ioctl(struct net_device *dev, struct ifreq *req, int cmd);
#endif #endif
mlan_status parse_arguments(t_u8 *pos, int *data, int datalen,
int *user_data_len);
/* /*
* For android private commands, fixed value of ioctl is used. * For android private commands, fixed value of ioctl is used.
* Internally commands are differentiated using strings. * Internally commands are differentiated using strings.

View file

@ -156,10 +156,11 @@ static int rps = 0;
/** /**
* rps cpu mask * rps cpu mask
* rps can be configure to any value between 0x1 - 0xf * rps can be configure to any value between 0x1 - 0xff
* ex: value of 0x3(0011) indicates to use cpu-0 and cpu-1 * ex: value of 0x3(0011) indicates to use cpu-0 and cpu-1
* ex: value of 0x3f(11 1111) indicates to use cpu-0 and cpu-5
*/ */
#define RPS_CPU_MASK 0xf #define RPS_CPU_MASK 0xff
#endif #endif
#endif #endif
@ -365,6 +366,9 @@ static card_type_entry card_type_map_tbl[] = {
#ifdef SDIW624 #ifdef SDIW624
{CARD_TYPE_SDIW624, 0, CARD_SDIW624}, {CARD_TYPE_SDIW624, 0, CARD_SDIW624},
#endif #endif
#ifdef SDAW693
{CARD_TYPE_SDAW693, 0, CARD_SDAW693},
#endif
#ifdef SDIW615 #ifdef SDIW615
{CARD_TYPE_SDIW615, 0, CARD_SDIW615}, {CARD_TYPE_SDIW615, 0, CARD_SDIW615},
#endif #endif
@ -380,6 +384,9 @@ static card_type_entry card_type_map_tbl[] = {
#ifdef PCIE9098 #ifdef PCIE9098
{CARD_TYPE_PCIE9098, 0, CARD_PCIE9098}, {CARD_TYPE_PCIE9098, 0, CARD_PCIE9098},
#endif #endif
#ifdef PCIEAW693
{CARD_TYPE_PCIEAW693, 0, CARD_PCIEAW693},
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
{CARD_TYPE_PCIEIW624, 0, CARD_PCIEIW624}, {CARD_TYPE_PCIEIW624, 0, CARD_PCIEIW624},
#endif #endif

View file

@ -3,7 +3,7 @@
* @brief This file contains ioctl function to MLAN * @brief This file contains ioctl function to MLAN
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -1248,7 +1248,7 @@ mlan_status woal_bss_start(moal_private *priv, t_u8 wait_option,
mlan_ds_bss *bss = NULL; mlan_ds_bss *bss = NULL;
mlan_status status; mlan_status status;
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
mlan_ssid_bssid temp_ssid_bssid; mlan_ssid_bssid *temp_ssid_bssid = NULL;
#endif #endif
ENTER(); ENTER();
@ -1264,12 +1264,20 @@ mlan_status woal_bss_start(moal_private *priv, t_u8 wait_option,
LEAVE(); LEAVE();
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
moal_memcpy_ext(priv->phandle, &temp_ssid_bssid, ssid_bssid, temp_ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!temp_ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
LEAVE();
return MLAN_STATUS_FAILURE;
}
moal_memcpy_ext(priv->phandle, temp_ssid_bssid, ssid_bssid,
sizeof(mlan_ssid_bssid), sizeof(mlan_ssid_bssid)); sizeof(mlan_ssid_bssid), sizeof(mlan_ssid_bssid));
if (MLAN_STATUS_SUCCESS == if (MLAN_STATUS_SUCCESS ==
woal_find_best_network(priv, wait_option, &temp_ssid_bssid)) woal_find_best_network(priv, wait_option, temp_ssid_bssid))
woal_check_mc_connection(priv, wait_option, woal_check_mc_connection(priv, wait_option,
temp_ssid_bssid.channel); temp_ssid_bssid->channel);
kfree(temp_ssid_bssid);
#endif #endif
/* Allocate an IOCTL request buffer */ /* Allocate an IOCTL request buffer */
@ -6608,7 +6616,7 @@ mlan_status woal_set_rssi_low_threshold(moal_private *priv, char *rssi,
priv->mrvl_rssi_low = low_rssi; priv->mrvl_rssi_low = low_rssi;
#endif #endif
misc->param.subscribe_event.low_rssi = low_rssi; misc->param.subscribe_event.low_rssi = low_rssi;
misc->param.subscribe_event.low_rssi_freq = 0; misc->param.subscribe_event.low_rssi_freq = 1;
ret = woal_request_ioctl(priv, req, wait_option); ret = woal_request_ioctl(priv, req, wait_option);
if (ret == MLAN_STATUS_FAILURE) { if (ret == MLAN_STATUS_FAILURE) {
PRINTM(MERROR, "request set rssi_low_threshold fail!\n"); PRINTM(MERROR, "request set rssi_low_threshold fail!\n");
@ -6672,7 +6680,7 @@ mlan_status woal_set_rssi_threshold(moal_private *priv, t_u32 event_id,
SUBSCRIBE_EVT_ACT_BITWISE_SET; SUBSCRIBE_EVT_ACT_BITWISE_SET;
misc->param.subscribe_event.evt_bitmap = misc->param.subscribe_event.evt_bitmap =
SUBSCRIBE_EVT_RSSI_LOW | SUBSCRIBE_EVT_RSSI_HIGH; SUBSCRIBE_EVT_RSSI_LOW | SUBSCRIBE_EVT_RSSI_HIGH;
misc->param.subscribe_event.low_rssi_freq = 0; misc->param.subscribe_event.low_rssi_freq = 1;
misc->param.subscribe_event.low_rssi = priv->last_rssi_low; misc->param.subscribe_event.low_rssi = priv->last_rssi_low;
misc->param.subscribe_event.high_rssi_freq = 0; misc->param.subscribe_event.high_rssi_freq = 0;
misc->param.subscribe_event.high_rssi = priv->last_rssi_high; misc->param.subscribe_event.high_rssi = priv->last_rssi_high;
@ -8276,12 +8284,15 @@ static int parse_tx_pwr_string(moal_handle *handle, const char *s, size_t len,
/* tx power value */ /* tx power value */
pos = strsep(&string, " \t"); pos = strsep(&string, " \t");
if (pow_conv && pos) { if (pow_conv && pos) {
/* for SH and later chipsets we need to convert user power vals /* We need to convert user power vals including -ve vals to
* including -ve vals to 1/16dbm resolution*/ * 1/16dbm resolution*/
tx_pwr_local = woal_string_to_number(pos); tx_pwr_local = woal_string_to_number(pos);
if (tx_pwr_local != 0xffffffff) {
PowerLevelToDUT11Bits(tx_pwr_local, &tx_pwr_converted); PowerLevelToDUT11Bits(tx_pwr_local, &tx_pwr_converted);
d->data1 = tx_pwr_converted; d->data1 = tx_pwr_converted;
pow_limit = 384; pow_limit = 384;
} else
d->data1 = (t_u32)tx_pwr_local;
} else if (pos) { } else if (pos) {
d->data1 = (t_u32)woal_string_to_number(pos); d->data1 = (t_u32)woal_string_to_number(pos);
} }
@ -8666,6 +8677,10 @@ static int parse_tx_frame_string(const char *s, size_t len,
if (pos) if (pos)
d->stbc = (t_u32)woal_string_to_number(pos); d->stbc = (t_u32)woal_string_to_number(pos);
pos = strsep(&string, " \t");
if (pos)
d->signal_bw = (t_u32)woal_string_to_number(pos);
pos = strsep(&string, " \t"); pos = strsep(&string, " \t");
if (pos) if (pos)
d->NumPkt = (t_u32)woal_string_to_number(pos); d->NumPkt = (t_u32)woal_string_to_number(pos);
@ -9108,18 +9123,20 @@ mlan_status woal_process_rf_test_mode_cmd(moal_handle *handle, t_u32 cmd,
handle->rf_data->tx_frame_data[12] = handle->rf_data->tx_frame_data[12] =
misc->param.mfg_tx_frame2.stbc; misc->param.mfg_tx_frame2.stbc;
handle->rf_data->tx_frame_data[13] = handle->rf_data->tx_frame_data[13] =
misc->param.mfg_tx_frame2.NumPkt; misc->param.mfg_tx_frame2.signal_bw;
handle->rf_data->tx_frame_data[14] = handle->rf_data->tx_frame_data[14] =
misc->param.mfg_tx_frame2.MaxPE; misc->param.mfg_tx_frame2.NumPkt;
handle->rf_data->tx_frame_data[15] = handle->rf_data->tx_frame_data[15] =
misc->param.mfg_tx_frame2.BeamChange; misc->param.mfg_tx_frame2.MaxPE;
handle->rf_data->tx_frame_data[16] = handle->rf_data->tx_frame_data[16] =
misc->param.mfg_tx_frame2.Dcm; misc->param.mfg_tx_frame2.BeamChange;
handle->rf_data->tx_frame_data[17] = handle->rf_data->tx_frame_data[17] =
misc->param.mfg_tx_frame2.Doppler; misc->param.mfg_tx_frame2.Dcm;
handle->rf_data->tx_frame_data[18] = handle->rf_data->tx_frame_data[18] =
misc->param.mfg_tx_frame2.MidP; misc->param.mfg_tx_frame2.Doppler;
handle->rf_data->tx_frame_data[19] = handle->rf_data->tx_frame_data[19] =
misc->param.mfg_tx_frame2.MidP;
handle->rf_data->tx_frame_data[20] =
misc->param.mfg_tx_frame2.QNum; misc->param.mfg_tx_frame2.QNum;
for (i = 0; i < ETH_ALEN; i++) { for (i = 0; i < ETH_ALEN; i++) {
handle->rf_data->bssid[i] = handle->rf_data->bssid[i] =

View file

@ -4,7 +4,7 @@
* driver. * driver.
* *
* *
* Copyright 2008-2022 NXP * Copyright 2008-2022, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -516,6 +516,50 @@ static struct _card_info card_info_SDIW624 = {
}; };
#endif #endif
#ifdef SDAW693
static struct _card_info card_info_SDAW693 = {
.embedded_supp = 1,
.drcs = 1,
.go_noa = 1,
.v16_fw_api = 1,
.v17_fw_api = 1,
.pmic = 1,
.cal_data_cfg = 0,
.low_power_enable = 0,
.rx_rate_max = 412,
.histogram_table_num = 3,
.feature_control = FEATURE_CTRL_DEFAULT,
.rev_id_reg = 0xc8,
.host_strap_reg = 0xf4,
.magic_reg = 0xf0,
.fw_name = SDAW693_DEFAULT_COMBO_FW_NAME,
.fw_name_wlan = SDAW693_DEFAULT_WLAN_FW_NAME,
#ifdef SDIO
.dump_fw_info = DUMP_FW_SDIO_V3,
.dump_fw_ctrl_reg = 0xf9,
.dump_fw_start_reg = 0xf1,
.dump_fw_end_reg = 0xf8,
.dump_fw_host_ready = 0xcc,
.dump_reg.reg_table = {0x08, 0x58, 0x5C, 0x5D, 0x60, 0x61, 0x62, 0x64,
0x65, 0x66, 0x68, 0x69, 0x6a},
.dump_reg.reg_table_size = 13,
.scratch_reg = 0xe8,
.func1_reg_start = 0x10,
.func1_reg_end = 0x17,
.fw_stuck_code_reg = 0xEB,
.fw_reset_reg = 0x0EE,
.fw_reset_val = 0x99,
.fw_wakeup_reg = 0,
.fw_wakeup_val = 2,
.slew_rate_reg = 0x90002328,
.slew_rate_bit_offset = 12,
#endif
.sniffer_support = 1,
.per_pkt_cfg_support = 1,
.host_mlme_required = 1,
};
#endif
#ifdef SD9177 #ifdef SD9177
static struct _card_info card_info_SD9177 = { static struct _card_info card_info_SD9177 = {
.embedded_supp = 1, .embedded_supp = 1,
@ -713,6 +757,34 @@ static struct _card_info card_info_PCIEIW624 = {
}; };
#endif #endif
#ifdef PCIEAW693
static struct _card_info card_info_PCIEAW693 = {
.embedded_supp = 1,
.drcs = 1,
.go_noa = 1,
.v16_fw_api = 1,
.v17_fw_api = 1,
.pmic = 1,
.cal_data_cfg = 0,
.low_power_enable = 0,
.rx_rate_max = 412,
.histogram_table_num = 3,
.feature_control = FEATURE_CTRL_DEFAULT,
.rev_id_reg = 0x8,
.host_strap_reg = 0x1c70,
.magic_reg = 0x1c74,
.fw_name = PCIEAW693_DEFAULT_COMBO_FW_NAME,
.fw_name_wlan = PCIEAW693_DEFAULT_WLAN_FW_NAME,
.fw_stuck_code_reg = 0x1c80,
.fw_reset_reg = 0x1c94,
.fw_reset_val = 0x98,
.fw_wakeup_reg = 0x0,
.sniffer_support = 1,
.per_pkt_cfg_support = 1,
.host_mlme_required = 1,
};
#endif
#ifdef USB8801 #ifdef USB8801
static struct _card_info card_info_USB8801 = { static struct _card_info card_info_USB8801 = {
.embedded_supp = 0, .embedded_supp = 0,
@ -900,6 +972,8 @@ static struct _card_info card_info_SD8987 = {
}; };
#endif #endif
#define NXP_ETH_P_EAPOL 0x888E
/** Driver version */ /** Driver version */
char driver_version[] = char driver_version[] =
INTF_CARDTYPE KERN_VERSION "--" MLAN_RELEASE_VERSION "-GPL" INTF_CARDTYPE KERN_VERSION "--" MLAN_RELEASE_VERSION "-GPL"
@ -1019,6 +1093,57 @@ static struct workqueue_struct *register_workqueue;
/** register work */ /** register work */
static struct work_struct register_work; static struct work_struct register_work;
#ifdef DUMP_TO_PROC
#define MAX_BUF_SIZE 100
/**
* @brief This function writes the fw dump in kernel(dmesg) log
*
* @param pfd_buf pointer to fw dump buffer
* @param fwdump_len length of fw dump buffer
*
* @return N/A
*/
void woal_print_firmware_dump_buf(t_u8 *pfd_buf, t_u64 fwdump_len)
{
t_u64 i = 0, count = 0;
u8 buf[MAX_BUF_SIZE] = {0};
u8 *ptr = NULL;
ENTER();
if (!pfd_buf || !fwdump_len) {
PRINTM(MERROR,
"%s: fw dump buffer is NULL or total length is zero\n",
__func__);
return;
}
PRINTM(MFW_D, "===== FW Dump To Console START=====\n");
for (i = 0; ((i < fwdump_len) && ((i + 15) < fwdump_len)); i += 16) {
PRINTM(MFW_D,
"[FW Dump] %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
pfd_buf[i], pfd_buf[i + 1], pfd_buf[i + 2],
pfd_buf[i + 3], pfd_buf[i + 4], pfd_buf[i + 5],
pfd_buf[i + 6], pfd_buf[i + 7], pfd_buf[i + 8],
pfd_buf[i + 9], pfd_buf[i + 10], pfd_buf[i + 11],
pfd_buf[i + 12], pfd_buf[i + 13], pfd_buf[i + 14],
pfd_buf[i + 15]);
count++;
moal_usleep_range(NULL, 40, 50);
}
if (i < fwdump_len) {
ptr = buf;
for (; i < fwdump_len; i++) {
ptr += snprintf(ptr, MAX_BUF_SIZE, " %02X", pfd_buf[i]);
}
PRINTM(MFW_D, "[FW Dump]%s\n", buf);
}
PRINTM(MFW_D, "===== FW Dump To Console END=====\n");
PRINTM(MFW_D, "FW Dump buffer length = %llu\n", fwdump_len);
}
#endif
/** /**
* @brief This function send fw dump event to kernel * @brief This function send fw dump event to kernel
* *
@ -1333,7 +1458,8 @@ static void woal_hang_work_queue(struct work_struct *work)
void woal_process_hang(moal_handle *handle) void woal_process_hang(moal_handle *handle)
{ {
ENTER(); ENTER();
if (!handle || handle->fw_reseting) { if (!handle || handle->fw_reseting ||
(handle->hardware_status != HardwareStatusReady)) {
LEAVE(); LEAVE();
return; return;
} }
@ -2538,6 +2664,10 @@ void woal_free_moal_handle(moal_handle *handle)
} }
#endif #endif
if (handle->is_fw_dump_timer_set) {
woal_cancel_timer(&handle->fw_dump_timer);
handle->is_fw_dump_timer_set = MFALSE;
}
/* Free allocated memory for fwdump filename */ /* Free allocated memory for fwdump filename */
kfree(handle->fwdump_fname); kfree(handle->fwdump_fname);
if (fwdump_fname) { if (fwdump_fname) {
@ -2734,7 +2864,7 @@ static t_u32 woal_set_sdio_slew_rate(moal_handle *handle)
(handle->params.slew_rate > 3 || handle->params.slew_rate < 0)) (handle->params.slew_rate > 3 || handle->params.slew_rate < 0))
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \ #if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD9177) || defined(SDIW615) defined(SDAW693) || defined(SD9177) || defined(SDIW615)
if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) || if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) ||
IS_SDIW624(handle->card_type) || IS_SDIW615(handle->card_type) || IS_SDIW624(handle->card_type) || IS_SDIW615(handle->card_type) ||
IS_SD9177(handle->card_type)) IS_SD9177(handle->card_type))
@ -3804,13 +3934,13 @@ static ssize_t woal_set_rps_map(struct netdev_rx_queue *queue, const char *buf,
static mlan_status woal_add_card_dpc(moal_handle *handle) static mlan_status woal_add_card_dpc(moal_handle *handle)
{ {
mlan_status ret = MLAN_STATUS_SUCCESS; mlan_status ret = MLAN_STATUS_SUCCESS;
int i; int i, j;
char str_buf[MLAN_MAX_VER_STR_LEN]; char str_buf[MLAN_MAX_VER_STR_LEN];
#if defined(CONFIG_RPS) #if defined(CONFIG_RPS)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
moal_private *priv_rps = NULL; moal_private *priv_rps = NULL;
t_u8 rps_buf[2]; t_u8 rps_buf[3];
#endif #endif
#endif #endif
@ -3933,22 +4063,30 @@ static mlan_status woal_add_card_dpc(moal_handle *handle)
#if defined(CONFIG_RPS) #if defined(CONFIG_RPS)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
if (handle->params.rps) { if (handle->params.rps) {
priv_rps = woal_get_priv_bss_type(handle, MLAN_BSS_TYPE_STA);
snprintf(rps_buf, sizeof(rps_buf), "%x", handle->params.rps); snprintf(rps_buf, sizeof(rps_buf), "%x", handle->params.rps);
if (priv_rps) { for (i = 0; i < MIN(handle->priv_num, MLAN_MAX_BSS_NUM); i++) {
priv_rps = handle->priv[i];
if (priv_rps && priv_rps->netdev) {
PRINTM(MCMND, "bss_type=%d bss_role=%d \n",
priv_rps->bss_type, priv_rps->bss_role);
PRINTM(MCMND, PRINTM(MCMND,
"num_rx_queues=%u real_num_rx_queues=%u\n", "num_rx_queues=%u real_num_rx_queues=%u rps_buf=%s\n",
priv_rps->netdev->num_rx_queues, priv_rps->netdev->num_rx_queues,
priv_rps->netdev->real_num_rx_queues); priv_rps->netdev->real_num_rx_queues,
for (i = 0; rps_buf);
i < (int)MIN(priv_rps->netdev->num_rx_queues, for (j = 0;
priv_rps->netdev->real_num_rx_queues); j <
i++) { (int)MIN(priv_rps->netdev->num_rx_queues,
woal_set_rps_map(&(priv_rps->netdev->_rx[i]), priv_rps->netdev
->real_num_rx_queues);
j++) {
woal_set_rps_map(
&(priv_rps->netdev->_rx[j]),
rps_buf, strlen(rps_buf)); rps_buf, strlen(rps_buf));
} }
} }
} }
}
#endif #endif
#endif #endif
@ -4302,8 +4440,11 @@ static mlan_status woal_init_fw_dpc(moal_handle *handle)
fw.fw_reload = handle->params.fw_reload; fw.fw_reload = handle->params.fw_reload;
else else
fw.fw_reload = 0; fw.fw_reload = 0;
/* Make sure device is awake before FW download */
mlan_pm_wakeup_card(handle->pmlan_adapter, MTRUE);
wifi_status = WIFI_STATUS_FW_DNLD; wifi_status = WIFI_STATUS_FW_DNLD;
ret = mlan_dnld_fw(handle->pmlan_adapter, &fw); ret = mlan_dnld_fw(handle->pmlan_adapter, &fw);
mlan_pm_wakeup_card(handle->pmlan_adapter, MFALSE);
if (ret == MLAN_STATUS_FAILURE) { if (ret == MLAN_STATUS_FAILURE) {
wifi_status = WIFI_STATUS_DNLD_FW_FAIL; wifi_status = WIFI_STATUS_DNLD_FW_FAIL;
PRINTM(MERROR, PRINTM(MERROR,
@ -4384,13 +4525,20 @@ static mlan_status woal_init_fw_dpc(moal_handle *handle)
10 * HZ); 10 * HZ);
if (handle->hardware_status != HardwareStatusReady) { if (handle->hardware_status != HardwareStatusReady) {
wifi_status = WIFI_STATUS_INIT_FW_FAIL; wifi_status = WIFI_STATUS_INIT_FW_FAIL;
handle->event_fw_dump = MFALSE;
if (handle->ops.reg_dbg) if (handle->ops.reg_dbg)
handle->ops.reg_dbg(handle); handle->ops.reg_dbg(handle);
#ifdef DEBUG_LEVEL1 #ifdef DEBUG_LEVEL1
if (drvdbg & MFW_D) { if (drvdbg & MFW_D) {
drvdbg &= ~MFW_D; if (handle->ops.dump_fw_info) {
if (handle->ops.dump_fw_info)
handle->ops.dump_fw_info(handle); handle->ops.dump_fw_info(handle);
#ifdef DUMP_TO_PROC
woal_print_firmware_dump_buf(
handle->fw_dump_buf,
handle->fw_dump_len);
#endif
}
drvdbg &= ~MFW_D;
} }
#endif #endif
ret = MLAN_STATUS_FAILURE; ret = MLAN_STATUS_FAILURE;
@ -5352,6 +5500,12 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index,
INIT_LIST_HEAD(&priv->mcast_list); INIT_LIST_HEAD(&priv->mcast_list);
spin_lock_init(&priv->mcast_lock); spin_lock_init(&priv->mcast_lock);
#ifdef STA_CFG80211
INIT_LIST_HEAD(&priv->dhcp_discover_queue);
/* CID - 10017917 */
// coverity[side_effect_free: SUPPRESS]
spin_lock_init(&priv->dhcp_discover_lock);
#endif
#ifdef STA_CFG80211 #ifdef STA_CFG80211
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
spin_lock_init(&priv->connect_lock); spin_lock_init(&priv->connect_lock);
@ -5648,6 +5802,9 @@ void woal_remove_interface(moal_handle *handle, t_u8 bss_index)
woal_flush_tcp_sess_queue(priv); woal_flush_tcp_sess_queue(priv);
woal_flush_tx_stat_queue(priv); woal_flush_tx_stat_queue(priv);
#ifdef STA_CFG80211
woal_flush_dhcp_discover_queue(priv);
#endif
#ifdef STA_CFG80211 #ifdef STA_CFG80211
if (priv->bss_type == MLAN_BSS_TYPE_STA) if (priv->bss_type == MLAN_BSS_TYPE_STA)
@ -5733,9 +5890,16 @@ void woal_remove_interface(moal_handle *handle, t_u8 bss_index)
/* Clear the whole backhaul station list in moal */ /* Clear the whole backhaul station list in moal */
for (count = 0; count < MAX_STA_COUNT; count++) { for (count = 0; count < MAX_STA_COUNT; count++) {
if (priv->vlan_sta_list[count]) { if (priv->vlan_sta_list[count]) {
if (priv->vlan_sta_list[count]->is_valid) if (priv->vlan_sta_list[count]->is_valid) {
priv->vlan_sta_list[count]->is_valid = MFALSE;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
cfg80211_unregister_netdevice(
priv->vlan_sta_list[count]->netdev);
#else
unregister_netdevice( unregister_netdevice(
priv->vlan_sta_list[count]->netdev); priv->vlan_sta_list[count]->netdev);
#endif
}
kfree(priv->vlan_sta_list[count]); kfree(priv->vlan_sta_list[count]);
} }
priv->vlan_sta_list[count] = NULL; priv->vlan_sta_list[count] = NULL;
@ -6279,6 +6443,9 @@ int woal_close(struct net_device *dev)
#endif #endif
woal_flush_tx_stat_queue(priv); woal_flush_tx_stat_queue(priv);
#ifdef STA_CFG80211
woal_flush_dhcp_discover_queue(priv);
#endif
if ((priv->media_connected == MTRUE) if ((priv->media_connected == MTRUE)
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
@ -6361,7 +6528,7 @@ int woal_close(struct net_device *dev)
* *
* @return 0 --success, otherwise fail * @return 0 --success, otherwise fail
*/ */
void woal_disable_ampdu(moal_private *priv) static void woal_disable_ampdu(moal_private *priv)
{ {
mlan_ds_11n_aggr_prio_tbl aggr_prio_tbl; mlan_ds_11n_aggr_prio_tbl aggr_prio_tbl;
int i; int i;
@ -6959,7 +7126,6 @@ u16 woal_select_queue(struct net_device *dev, struct sk_buff *skb
#else #else
tid = skb->priority = woal_classify8021d(skb); tid = skb->priority = woal_classify8021d(skb);
#endif #endif
#define NXP_ETH_P_EAPOL 0x888E
#define NXP_ETH_P_WAPI 0x88B4 #define NXP_ETH_P_WAPI 0x88B4
switch (skb->protocol) { switch (skb->protocol) {
case htons(ETH_P_ARP): case htons(ETH_P_ARP):
@ -7075,6 +7241,143 @@ void woal_remove_tx_info(moal_private *priv, t_u8 tx_seq_num)
LEAVE(); LEAVE();
} }
#if defined(STA_CFG80211)
/**
* @brief This function flushes timesync info queue
*
* @param priv A pointer to moal_private structure
*
* @return N/A
*/
void woal_flush_dhcp_discover_queue(moal_private *priv)
{
struct dhcp_discover_info *discover_info = NULL, *tmp_node;
unsigned long flags;
spin_lock_irqsave(&priv->dhcp_discover_lock, flags);
list_for_each_entry_safe (discover_info, tmp_node,
&priv->dhcp_discover_queue, link) {
list_del(&discover_info->link);
kfree(discover_info);
}
INIT_LIST_HEAD(&priv->dhcp_discover_queue);
spin_unlock_irqrestore(&priv->dhcp_discover_lock, flags);
}
/**
* @brief This function gets dhcp_discover_info
*
* @param priv A pointer to moal_private structure
* @param transation_id token_id of the packet
*
* @return N/A
*/
struct dhcp_discover_info *woal_get_dhcp_discover_info(moal_private *priv,
t_u32 transaction_id)
{
struct dhcp_discover_info *discover_info = NULL;
ENTER();
list_for_each_entry (discover_info, &priv->dhcp_discover_queue, link) {
// TODO: add 5 second ageout check
if (discover_info->transaction_id == transaction_id) {
LEAVE();
return discover_info;
}
}
LEAVE();
return NULL;
}
/**
* @brief add dhcp_discover_node
*
* @param priv A pointer to moal_private structure
* @param transaction_id dhcp discover pkt's transaction_id
* @param pmbuf pmbuf
*
* @return N/A
*/
t_void woal_add_dhcp_discover_node(moal_private *priv, t_u32 transaction_id,
mlan_buffer *pmbuf)
{
struct dhcp_discover_info *node = NULL;
unsigned long flags;
t_u8 find_node = MFALSE;
if (priv) {
spin_lock_irqsave(&priv->dhcp_discover_lock, flags);
list_for_each_entry (node, &priv->dhcp_discover_queue, link) {
if (node->transaction_id == transaction_id) {
find_node = MTRUE;
node->in_ts_sec = pmbuf->in_ts_sec;
node->in_ts_usec = pmbuf->in_ts_usec;
break;
}
}
if (!find_node) {
/* create new mcast node */
node = kzalloc(sizeof(struct dhcp_discover_info),
GFP_ATOMIC);
if (node) {
node->transaction_id = transaction_id;
node->in_ts_sec = pmbuf->in_ts_sec;
node->in_ts_usec = pmbuf->in_ts_usec;
INIT_LIST_HEAD(&node->link);
list_add_tail(&node->link,
&priv->dhcp_discover_queue);
PRINTM(MCMND,
"Add to dhcp_disover_queue: transaction_id=0x%x\n",
transaction_id);
}
}
spin_unlock_irqrestore(&priv->dhcp_discover_lock, flags);
}
/* CID - 36267456 */
// coverity[leaked_storage:SUPPRESS]
}
/**
* @brief get_dhcp_discover packet's transation_id
*
* @param skb point to struct skb_buff
*
* @return transation_id
*/
t_u32 woal_get_dhcp_discover_transation_id(struct sk_buff *skb)
{
struct ethhdr *eth;
struct iphdr *iph;
struct udphdr *udph;
struct dhcp_pkt *dhcp_info;
t_u16 min_pkt_size = 0;
const t_u8 bc_mac[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
ENTER();
eth = (struct ethhdr *)(skb->data);
if (memcmp(eth->h_dest, bc_mac, MLAN_MAC_ADDR_LENGTH))
goto done;
min_pkt_size = DHCP_ETH_HEADER_SIZE + DHCP_MIN_IP_HEADER_SIZE +
DHCP_UDP_HEADER_SIZE + sizeof(struct dhcp_pkt);
if (skb->len < min_pkt_size)
goto done;
if (eth->h_proto == __constant_htons(ETH_P_IP)) {
iph = (struct iphdr *)((t_u8 *)eth + sizeof(struct ethhdr));
if (iph->protocol == DHCP_UDP_PROTO) {
udph = (struct udphdr *)((t_u8 *)iph + (iph->ihl << 2));
if (udph->source == __constant_htons(DHCP_SRC_PORT) &&
udph->dest == __constant_htons(DHCP_DST_PORT)) {
dhcp_info = (struct dhcp_pkt
*)((t_u8 *)udph +
sizeof(struct udphdr));
return __constant_htonl(dhcp_info->xid);
}
}
}
done:
LEAVE();
return 0;
}
#endif
/** /**
* @brief This function flush mcast list * @brief This function flush mcast list
* *
@ -7630,7 +7933,7 @@ done:
* @param pmbuf A mlan buffer * @param pmbuf A mlan buffer
* @return N/A * @return N/A
*/ */
void woal_send_tx_pkt_to_mon_if(moal_private *priv, pmlan_buffer pmbuf) static void woal_send_tx_pkt_to_mon_if(moal_private *priv, pmlan_buffer pmbuf)
{ {
struct ieee80211_hdr *dot11_hdr = NULL; struct ieee80211_hdr *dot11_hdr = NULL;
struct radiotap_info *rt = NULL; struct radiotap_info *rt = NULL;
@ -7880,6 +8183,15 @@ static void woal_start_xmit(moal_private *priv, struct sk_buff *skb)
multi_ap_packet = woal_check_easymesh_packet(priv, pmbuf); multi_ap_packet = woal_check_easymesh_packet(priv, pmbuf);
} }
#endif #endif
#endif
#ifdef STA_CFG80211
if (priv->multi_ap_flag && priv->bss_type == MLAN_BSS_TYPE_STA) {
t_u32 transaction_id;
transaction_id = woal_get_dhcp_discover_transation_id(skb);
if (transaction_id)
woal_add_dhcp_discover_node(priv, transaction_id,
pmbuf);
}
#endif #endif
if (priv->enable_tcp_ack_enh == MTRUE) { if (priv->enable_tcp_ack_enh == MTRUE) {
@ -7990,7 +8302,8 @@ netdev_tx_t woal_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
priv->stats.tx_dropped++; priv->stats.tx_dropped++;
goto done; goto done;
} }
if (moal_extflg_isset(priv->phandle, EXT_TX_WORK)) { if (moal_extflg_isset(priv->phandle, EXT_TX_WORK) &&
(skb->protocol != htons(NXP_ETH_P_EAPOL))) {
spin_lock_bh(&(priv->tx_q.lock)); spin_lock_bh(&(priv->tx_q.lock));
__skb_queue_tail(&(priv->tx_q), skb); __skb_queue_tail(&(priv->tx_q), skb);
spin_unlock_bh(&(priv->tx_q.lock)); spin_unlock_bh(&(priv->tx_q.lock));
@ -8703,7 +9016,7 @@ pmlan_ioctl_req woal_alloc_mlan_ioctl_req(int size)
t_s32 temp_size = 0; t_s32 temp_size = 0;
ENTER(); ENTER();
flag = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; flag = GFP_ATOMIC;
if (!woal_secure_add( if (!woal_secure_add(
&size, &size,
@ -8812,6 +9125,11 @@ static int woal_get_card_info(moal_handle *phandle)
phandle->card_info = &card_info_SD9097; phandle->card_info = &card_info_SD9097;
break; break;
#endif #endif
#ifdef SDAW693
case CARD_TYPE_SDAW693:
phandle->card_info = &card_info_SDAW693;
break;
#endif
#ifdef SDIW624 #ifdef SDIW624
case CARD_TYPE_SDIW624: case CARD_TYPE_SDIW624:
phandle->card_info = &card_info_SDIW624; phandle->card_info = &card_info_SDIW624;
@ -8838,6 +9156,12 @@ static int woal_get_card_info(moal_handle *phandle)
phandle->card_info = &card_info_PCIE9097; phandle->card_info = &card_info_PCIE9097;
break; break;
#endif #endif
#ifdef PCIEAW693
case CARD_TYPE_PCIEAW693:
phandle->card_info = &card_info_PCIEAW693;
phandle->event_fw_dump = MTRUE;
break;
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
case CARD_TYPE_PCIEIW624: case CARD_TYPE_PCIEIW624:
phandle->card_info = &card_info_PCIEIW624; phandle->card_info = &card_info_PCIEIW624;
@ -9908,7 +10232,11 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
moal_memcpy_ext(phandle, pos, pmevent->event_buf + OFFSET_SEQNUM, moal_memcpy_ext(phandle, pos, pmevent->event_buf + OFFSET_SEQNUM,
pmevent->event_len - OFFSET_SEQNUM, pmevent->event_len - OFFSET_SEQNUM,
FW_DUMP_INFO_LEN - phandle->fw_dump_len); FW_DUMP_INFO_LEN - phandle->fw_dump_len);
if (pmevent->event_len > OFFSET_SEQNUM) {
phandle->fw_dump_len += pmevent->event_len - OFFSET_SEQNUM; phandle->fw_dump_len += pmevent->event_len - OFFSET_SEQNUM;
} else {
PRINTM(MERROR, "event_len is invalid\n");
}
PRINTM(MINFO, "fw dump event: evt_len=%d toal_len=%ld\n", PRINTM(MINFO, "fw dump event: evt_len=%d toal_len=%ld\n",
pmevent->event_len, (long int)phandle->fw_dump_len); pmevent->event_len, (long int)phandle->fw_dump_len);
@ -9935,6 +10263,66 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
} }
#else #else
t_void woal_print_firmware_dump(moal_handle *phandle, char *fwdp_fname)
{
struct file *pfile_fwdump = NULL;
loff_t pos = 0;
t_u8 *pbuf = NULL;
t_u32 i = 0, count = 0, fwdump_len = 0, ret = 0;
ENTER();
pos = 0;
fwdump_len = (t_u32)phandle->fw_dump_len;
ret = moal_vmalloc(phandle, fwdump_len, &pbuf);
if (ret != MLAN_STATUS_SUCCESS || !pbuf) {
PRINTM(MFWDP_D, " moal_vmalloc failed\n");
} else {
memset(pbuf, 0, fwdump_len);
pfile_fwdump = filp_open(fwdp_fname, O_RDONLY, 0644);
ret = kernel_read(pfile_fwdump, pbuf,
(long int)phandle->fw_dump_len, &pos);
if (ret <= 0) {
PRINTM(MFWDP_D, "kernel_read failed %d\n", ret);
} else {
PRINTM(MFWDP_D,
"===== FW Dump To Console START=====\n");
for (i = 0;
((i < fwdump_len) && ((i + 15) < fwdump_len));
i += 16) {
PRINTM(MFWDP_D,
"[FW Dump] %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
pbuf[i], pbuf[i + 1], pbuf[i + 2],
pbuf[i + 3], pbuf[i + 4], pbuf[i + 5],
pbuf[i + 6], pbuf[i + 7], pbuf[i + 8],
pbuf[i + 9], pbuf[i + 10], pbuf[i + 11],
pbuf[i + 12], pbuf[i + 13], pbuf[i + 14],
pbuf[i + 15]);
count++;
usleep_range(10, 20);
}
if (i < fwdump_len) {
for (; i < fwdump_len; i++) {
PRINTM(MFWDP_D, "%02X\n", pbuf[i]);
}
}
PRINTM(MFWDP_D, "===== FW Dump To Console END=====\n");
PRINTM(MFWDP_D, "FW Dump buffer length = %d\n",
fwdump_len);
}
filp_close(pfile_fwdump, NULL);
}
if (pbuf)
moal_vfree(phandle, pbuf);
}
t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
{ {
struct file *pfile_fwdump = NULL; struct file *pfile_fwdump = NULL;
@ -10018,7 +10406,11 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
LEAVE(); LEAVE();
return; return;
} }
if (pmevent->event_len > OFFSET_SEQNUM) {
phandle->fw_dump_len += pmevent->event_len - OFFSET_SEQNUM; phandle->fw_dump_len += pmevent->event_len - OFFSET_SEQNUM;
} else {
PRINTM(MERROR, "event_len is invalid\n");
}
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0)
vfs_write(pfile_fwdump, vfs_write(pfile_fwdump,
(const char __user *)pmevent->event_buf + OFFSET_SEQNUM, (const char __user *)pmevent->event_buf + OFFSET_SEQNUM,
@ -10029,6 +10421,10 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
#endif #endif
filp_close(pfile_fwdump, NULL); filp_close(pfile_fwdump, NULL);
if (type == DUMP_TYPE_ENDE) { if (type == DUMP_TYPE_ENDE) {
woal_print_firmware_dump(phandle,
(phandle->fwdump_fname ?
phandle->fwdump_fname :
fwdump_fname));
PRINTM(MMSG, "==== FW DUMP END: %ld bytes ====\n", PRINTM(MMSG, "==== FW DUMP END: %ld bytes ====\n",
(long int)phandle->fw_dump_len); (long int)phandle->fw_dump_len);
phandle->fw_dump = MFALSE; phandle->fw_dump = MFALSE;
@ -10048,7 +10444,7 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent)
} }
#endif /* DUMP_TO_PROC */ #endif /* DUMP_TO_PROC */
#define DRV_INFO_SIZE 0x60000 #define DRV_INFO_SIZE 0xA0000
#define DRV_INFO_PER_INTF 0x11000 #define DRV_INFO_PER_INTF 0x11000
#define ROW_SIZE_16 16 #define ROW_SIZE_16 16
#define ROW_SIZE_32 32 #define ROW_SIZE_32 32
@ -10082,7 +10478,7 @@ static int woal_save_hex_dump(int rowsize, const void *buf, size_t len,
hex_dump_to_buffer(ptr + i, linelen, rowsize, 1, linebuf, hex_dump_to_buffer(ptr + i, linelen, rowsize, 1, linebuf,
sizeof(linebuf), false); sizeof(linebuf), false);
pos += snprintf(pos, MAX_BUF_LEN, "%s\n", linebuf); pos += snprintf(pos, sizeof(linebuf), "%s\n", linebuf);
} }
return (int)(pos - (char *)save_buf); return (int)(pos - (char *)save_buf);
@ -11505,7 +11901,13 @@ t_void woal_evt_work_queue(struct work_struct *work)
break; break;
case WOAL_EVENT_RX_MGMT_PKT: case WOAL_EVENT_RX_MGMT_PKT:
#if defined(UAP_CFG80211) || defined(STA_CFG80211) #if defined(UAP_CFG80211) || defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
priv = evt->priv;
wiphy_lock(priv->wdev->wiphy);
cfg80211_rx_mlme_mgmt(priv->netdev, evt->evt.event_buf,
evt->evt.event_len);
wiphy_unlock(priv->wdev->wiphy);
#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
priv = evt->priv; priv = evt->priv;
mutex_lock(&priv->wdev->mtx); mutex_lock(&priv->wdev->mtx);
cfg80211_rx_mlme_mgmt(priv->netdev, evt->evt.event_buf, cfg80211_rx_mlme_mgmt(priv->netdev, evt->evt.event_buf,
@ -11642,7 +12044,7 @@ t_void woal_rx_work_queue(struct work_struct *work)
* *
* @return N/A * @return N/A
*/ */
void woal_pcie_rx_data_task(unsigned long data) static void woal_pcie_rx_data_task(unsigned long data)
{ {
moal_handle *handle = (moal_handle *)data; moal_handle *handle = (moal_handle *)data;
wifi_timeval start_timeval; wifi_timeval start_timeval;
@ -11689,7 +12091,7 @@ void woal_pcie_rx_data_task(unsigned long data)
* *
* @return N/A * @return N/A
*/ */
t_void woal_pcie_tx_complete_task(unsigned long data) static t_void woal_pcie_tx_complete_task(unsigned long data)
{ {
moal_handle *handle = (moal_handle *)data; moal_handle *handle = (moal_handle *)data;
ENTER(); ENTER();
@ -11847,7 +12249,7 @@ t_void woal_pcie_delayed_tx_work(struct work_struct *work)
* @return skb buffer * @return skb buffer
*/ */
struct sk_buff *woal_skb_dequeue_spinlock(struct sk_buff_head *list) static struct sk_buff *woal_skb_dequeue_spinlock(struct sk_buff_head *list)
{ {
struct sk_buff *result; struct sk_buff *result;
@ -11864,7 +12266,7 @@ struct sk_buff *woal_skb_dequeue_spinlock(struct sk_buff_head *list)
* *
* @return N/A * @return N/A
*/ */
t_void woal_tx_work_handler(struct work_struct *work) static t_void woal_tx_work_handler(struct work_struct *work)
{ {
moal_handle *handle = container_of(work, moal_handle, tx_work); moal_handle *handle = container_of(work, moal_handle, tx_work);
moal_private *priv = NULL; moal_private *priv = NULL;
@ -13675,6 +14077,9 @@ static void woal_cleanup_module(void)
goto exit; goto exit;
} }
woal_flush_tx_stat_queue(handle->priv[i]); woal_flush_tx_stat_queue(handle->priv[i]);
#ifdef STA_CFG80211
woal_flush_dhcp_discover_queue(handle->priv[i]);
#endif
#endif #endif
} }

View file

@ -3,7 +3,7 @@
* @brief This file contains wlan driver specific defines etc. * @brief This file contains wlan driver specific defines etc.
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -44,6 +44,8 @@ Change log:
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/ip.h>
#include <linux/ipv6.h>
#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 10, 17) #if LINUX_VERSION_CODE > KERNEL_VERSION(4, 10, 17)
#include <uapi/linux/sched/types.h> #include <uapi/linux/sched/types.h>
#endif #endif
@ -1375,7 +1377,7 @@ struct rf_test_mode_data {
/* Tx continuous config values */ /* Tx continuous config values */
t_u32 tx_cont_data[6]; t_u32 tx_cont_data[6];
/* Tx frame config values */ /* Tx frame config values */
t_u32 tx_frame_data[20]; t_u32 tx_frame_data[22];
/* HE TB Tx values */ /* HE TB Tx values */
t_u32 he_tb_tx[4]; t_u32 he_tb_tx[4];
t_s32 he_tb_tx_power[1]; t_s32 he_tb_tx_power[1];
@ -1453,6 +1455,7 @@ typedef struct _auto_zero_dfs_cfg {
} __ATTRIB_PACK__ auto_zero_dfs_cfg; } __ATTRIB_PACK__ auto_zero_dfs_cfg;
#if defined(UAP_CFG80211) || defined(STA_CFG80211) #if defined(UAP_CFG80211) || defined(STA_CFG80211)
/** station node */
typedef struct _station_node { typedef struct _station_node {
/** station aid */ /** station aid */
t_u16 aid; t_u16 aid;
@ -1464,6 +1467,71 @@ typedef struct _station_node {
t_u8 is_valid; t_u8 is_valid;
} station_node; } station_node;
/** dhcp discover info */
struct dhcp_discover_info {
/** link */
struct list_head link;
/** transaction id */
t_u32 transaction_id;
/** Time stamp when packet is received (seconds) */
t_u32 in_ts_sec;
/** Time stamp when packet is received (micro seconds) */
t_u32 in_ts_usec;
};
#define UDP_PSEUDO_HEADER_SIZE 12
#define DHCP_ETH_HEADER_SIZE 14
#define DHCP_MIN_IP_HEADER_SIZE 20
#define DHCP_UDP_HEADER_SIZE 8
#define DHCP_IP_PROTO 0x0800
#define DHCP_IP_VERSION 0x04
#define DHCP_IP_TOS 0x00
#define DHCP_IP_TTL 0x40
#define DHCP_UDP_PROTO 0x11
#define DHCP_IPADDR_SIZE 4
#define DHCP_SRC_PORT 0x0044
#define DHCP_DST_PORT 0x0043
struct dhcp_pkt {
/** DHCP op code or message type */
t_u8 op;
/** Hardware address type */
t_u8 htype;
/** Hardware address length */
t_u8 hlen;
/** Hops is optionally used by relay agents */
t_u8 hops;
/** Transaction identifier */
t_u32 xid;
/** Seconds till the client has started the DHCP process */
t_u16 secs;
/** Flags */
t_u16 flags;
/**
* IP address of the client Only filled in if
* the client is in BOUND, RENEW or REBINDING
*/
t_u32 ciaddr;
/**
* Your IP address offered to the client.
* Sent by server during the DISCOVER and ACK
*/
t_u32 yiaddr;
/**
* IP address of the DHCP server to use next.
*/
t_u32 siaddr;
/** Relay agent IP address */
t_u32 giaddr;
t_u8 chaddr[16];
/** Null terminated server host name */
t_u8 sname[64];
t_u8 file[128];
/** BOOTP magic cookie */
t_u32 magic;
t_u8 pOptions[1];
} __ATTRIB_PACK__;
#define EASY_MESH_MULTI_AP_FH_BSS (t_u8)(0x20) #define EASY_MESH_MULTI_AP_FH_BSS (t_u8)(0x20)
#define EASY_MESH_MULTI_AP_BH_BSS (t_u8)(0x40) #define EASY_MESH_MULTI_AP_BH_BSS (t_u8)(0x40)
#define EASY_MESH_MULTI_AP_BH_AND_FH_BSS (t_u8)(0x60) #define EASY_MESH_MULTI_AP_BH_AND_FH_BSS (t_u8)(0x60)
@ -1865,6 +1933,10 @@ struct _moal_private {
moal_private *parent_priv; moal_private *parent_priv;
#endif #endif
#endif #endif
/** dhcp discover lock*/
spinlock_t dhcp_discover_lock;
/** DHCP DISCOVER Info queue */
struct list_head dhcp_discover_queue;
/** txwatchdog disable */ /** txwatchdog disable */
t_u8 txwatchdog_disable; t_u8 txwatchdog_disable;
@ -3066,10 +3138,8 @@ struct _moal_handle {
BOOLEAN is_tp_acnt_timer_set; BOOLEAN is_tp_acnt_timer_set;
t_u8 request_pm; t_u8 request_pm;
#ifdef IMX_SUPPORT
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
struct pm_qos_request woal_pm_qos_req; struct pm_qos_request woal_pm_qos_req;
#endif
#endif #endif
t_u32 ips_ctrl; t_u32 ips_ctrl;
BOOLEAN is_edmac_enabled; BOOLEAN is_edmac_enabled;
@ -3242,6 +3312,12 @@ extern t_u32 drvdbg;
} while (0) } while (0)
#endif /* DEBUG_LEVEL2 */ #endif /* DEBUG_LEVEL2 */
#define PRINTM_MFWDP_D(level, msg...) \
do { \
woal_print(level, msg); \
if (drvdbg & MFWDP_D) \
printk(KERN_DEBUG msg); \
} while (0)
#define PRINTM_MFW_D(level, msg...) \ #define PRINTM_MFW_D(level, msg...) \
do { \ do { \
woal_print(level, msg); \ woal_print(level, msg); \
@ -3855,6 +3931,8 @@ void woal_dump_firmware_info(moal_handle *phandle);
void woal_dump_firmware_info_v2(moal_handle *phandle); void woal_dump_firmware_info_v2(moal_handle *phandle);
void woal_dump_firmware_info_v3(moal_handle *phandle); void woal_dump_firmware_info_v3(moal_handle *phandle);
#endif /* SDIO_MMC */ #endif /* SDIO_MMC */
/* Print FW dumps in kernel(dmesg) log */
t_void woal_print_firmware_dump(moal_handle *phandle, char *fwdp_fname);
/* Store the FW dumps received from events in a file */ /* Store the FW dumps received from events in a file */
void woal_store_firmware_dump(moal_handle *phandle, pmlan_event pmevent); void woal_store_firmware_dump(moal_handle *phandle, pmlan_event pmevent);
void woal_send_fw_dump_complete_event(moal_private *priv); void woal_send_fw_dump_complete_event(moal_private *priv);
@ -3911,9 +3989,9 @@ void woal_send_iwevcustom_event(moal_private *priv, char *str);
/** Get channel list */ /** Get channel list */
mlan_status woal_get_channel_list(moal_private *priv, t_u8 wait_option, mlan_status woal_get_channel_list(moal_private *priv, t_u8 wait_option,
mlan_chan_list *chanlist); mlan_chan_list *chanlist);
#endif
mlan_status woal_11d_check_ap_channel(moal_private *priv, t_u8 wait_option, mlan_status woal_11d_check_ap_channel(moal_private *priv, t_u8 wait_option,
mlan_ssid_bssid *ssid_bssid); mlan_ssid_bssid *ssid_bssid);
#endif
/** Set/Get retry count */ /** Set/Get retry count */
mlan_status woal_set_get_retry(moal_private *priv, t_u32 action, mlan_status woal_set_get_retry(moal_private *priv, t_u32 action,
t_u8 wait_option, int *value); t_u8 wait_option, int *value);
@ -4230,6 +4308,12 @@ mlan_status woal_set_hotspotcfg(moal_private *priv, t_u8 wait_option,
#if defined(STA_CFG80211) #if defined(STA_CFG80211)
mlan_status woal_multi_ap_cfg(moal_private *priv, t_u8 wait_option, t_u8 flag); mlan_status woal_multi_ap_cfg(moal_private *priv, t_u8 wait_option, t_u8 flag);
struct dhcp_discover_info *woal_get_dhcp_discover_info(moal_private *priv,
t_u32 transaction_id);
void woal_flush_dhcp_discover_queue(moal_private *priv);
t_u32 woal_get_dhcp_discover_transation_id(struct sk_buff *skb);
t_void woal_add_dhcp_discover_node(moal_private *priv, t_u32 transaction_id,
mlan_buffer *pmbuf);
#endif #endif
mlan_status woal_set_get_wowlan_config(moal_private *priv, t_u16 action, mlan_status woal_set_get_wowlan_config(moal_private *priv, t_u16 action,
@ -4323,4 +4407,7 @@ t_bool woal_secure_sub(t_void *datain, t_s32 sub, t_void *dataout,
mlan_status woal_edmac_cfg(moal_private *priv, t_u8 *country_code); mlan_status woal_edmac_cfg(moal_private *priv, t_u8 *country_code);
#ifdef DUMP_TO_PROC
void woal_print_firmware_dump_buf(t_u8 *pfd_buf, t_u64 fwdump_len);
#endif
#endif /* _MOAL_MAIN_H */ #endif /* _MOAL_MAIN_H */

View file

@ -117,6 +117,24 @@ static const struct pci_device_id wlan_ids[] = {
0, 0,
}, },
#endif #endif
#ifdef PCIEAW693
{
PCIE_VENDOR_ID_NXP,
PCIE_DEVICE_ID_88WAW693_FN0,
PCI_ANY_ID,
PCI_ANY_ID,
0,
0,
},
{
PCIE_VENDOR_ID_NXP,
PCIE_DEVICE_ID_88WAW693_FN1,
PCI_ANY_ID,
PCI_ANY_ID,
0,
0,
},
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
{ {
PCIE_VENDOR_ID_NXP, PCIE_VENDOR_ID_NXP,
@ -145,7 +163,7 @@ MODULE_DEVICE_TABLE(pci, wlan_ids);
static mlan_status woal_pcie_preinit(struct pci_dev *pdev); static mlan_status woal_pcie_preinit(struct pci_dev *pdev);
#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \ #if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \
defined(PCIE9097) || defined(PCIEIW624) defined(PCIE9097) || defined(PCIEAW693) || defined(PCIEIW624)
static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
t_u8 resetflag); t_u8 resetflag);
#endif #endif
@ -216,6 +234,20 @@ static t_u16 woal_update_card_type(t_void *card)
strlen(KERN_VERSION)); strlen(KERN_VERSION));
} }
#endif #endif
#ifdef PCIEAW693
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WAW693_FN0 ||
cardp_pcie->dev->device == PCIE_DEVICE_ID_88WAW693_FN1) {
card_type = CARD_TYPE_PCIEAW693;
moal_memcpy_ext(NULL, driver_version, CARD_PCIEAW693,
strlen(CARD_PCIEAW693), strlen(driver_version));
moal_memcpy_ext(NULL,
driver_version + strlen(INTF_CARDTYPE) +
strlen(KERN_VERSION),
V18, strlen(V18),
strlen(driver_version) - strlen(INTF_CARDTYPE) -
strlen(KERN_VERSION));
}
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WIW624) { if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WIW624) {
card_type = CARD_TYPE_PCIEIW624; card_type = CARD_TYPE_PCIEIW624;
@ -408,6 +440,25 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag)
} }
handle->pmlan_adapter = NULL; handle->pmlan_adapter = NULL;
} }
#ifdef DUMP_TO_PROC
if (handle->fw_dump_buf) {
moal_vfree(handle, handle->fw_dump_buf);
handle->fw_dump_buf = NULL;
handle->fw_dump_len = 0;
}
#endif
#ifdef PCIEAW693
if (IS_PCIEAW693(handle->card_type))
handle->event_fw_dump = MTRUE;
#endif
#ifdef PCIEIW624
if (IS_PCIEIW624(handle->card_type))
handle->event_fw_dump = MTRUE;
#endif
#ifdef PCIE9098
if (IS_PCIE9098(handle->card_type))
handle->event_fw_dump = MTRUE;
#endif
goto exit; goto exit;
@ -422,7 +473,7 @@ perform_init:
if (!handle->pmlan_adapter) if (!handle->pmlan_adapter)
goto err_init_fw; goto err_init_fw;
#if defined(PCIE9098) #if defined(PCIE9098) || defined(PCIEAW693)
if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) || if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) ||
(card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1)) (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1))
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1); mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1);
@ -647,7 +698,8 @@ static void woal_pcie_shutdown(struct pci_dev *dev)
handle = card->handle; handle = card->handle;
if (handle->second_mac) if (handle->second_mac)
goto done; goto done;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(handle->card_type) || IS_PCIEIW624(handle->card_type) || if (IS_PCIE9098(handle->card_type) || IS_PCIEIW624(handle->card_type) ||
IS_PCIEAW693(handle->card_type) || IS_PCIE9097(handle->card_type)) { IS_PCIEAW693(handle->card_type) || IS_PCIE9097(handle->card_type)) {
if (RDWR_STATUS_FAILURE != if (RDWR_STATUS_FAILURE !=
@ -1516,7 +1568,7 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
break; break;
} }
#if defined(PCIE9098) #if defined(PCIE9098) || defined(PCIEAW693)
if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) || if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) ||
(card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1)) (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1))
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1); mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1);
@ -1644,7 +1696,8 @@ void woal_pcie_bus_unregister(void)
LEAVE(); LEAVE();
} }
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
#define PCIE9098_DUMP_CTRL_REG 0x1C94 #define PCIE9098_DUMP_CTRL_REG 0x1C94
#define PCIE9098_DUMP_START_REG 0x1C98 #define PCIE9098_DUMP_START_REG 0x1C98
#define PCIE9098_DUMP_END_REG 0x1C9F #define PCIE9098_DUMP_END_REG 0x1C9F
@ -1655,7 +1708,8 @@ void woal_pcie_bus_unregister(void)
#define DEBUG_DUMP_END_REG 0xCFF #define DEBUG_DUMP_END_REG 0xCFF
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
#define PCIE9098_SCRATCH_12_REG 0x1C90 #define PCIE9098_SCRATCH_12_REG 0x1C90
#define PCIE9098_SCRATCH_14_REG 0x1C98 #define PCIE9098_SCRATCH_14_REG 0x1C98
#define PCIE9098_SCRATCH_15_REG 0x1C9C #define PCIE9098_SCRATCH_15_REG 0x1C9C
@ -1691,7 +1745,8 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
t_u32 dump_end_reg = 0; t_u32 dump_end_reg = 0;
t_u32 scratch_14_reg = 0; t_u32 scratch_14_reg = 0;
t_u32 scratch_15_reg = 0; t_u32 scratch_15_reg = 0;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
/* Tx/Rx/Event AMDA start address */ /* Tx/Rx/Event AMDA start address */
t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080}; t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080};
t_u8 j; t_u8 j;
@ -1731,7 +1786,8 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -1776,7 +1832,8 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
} }
i++; i++;
} }
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -1855,7 +1912,8 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
t_u32 dump_end_reg = 0; t_u32 dump_end_reg = 0;
t_u32 scratch_14_reg = 0; t_u32 scratch_14_reg = 0;
t_u32 scratch_15_reg = 0; t_u32 scratch_15_reg = 0;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
/* Tx/Rx/Event AMDA start address */ /* Tx/Rx/Event AMDA start address */
t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080}; t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080};
t_u8 j; t_u8 j;
@ -1889,7 +1947,8 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -1929,7 +1988,8 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
} }
i++; i++;
} }
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -2020,7 +2080,7 @@ static memory_type_mapping mem_type_mapping_tbl_8897[] = {
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ #if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624) defined(PCIEAW693) || defined(PCIEIW624)
#define DEBUG_HOST_READY_8997 0xCC #define DEBUG_HOST_READY_8997 0xCC
#define DEBUG_HOST_EVENT_READY 0xAA #define DEBUG_HOST_EVENT_READY 0xAA
#define DEBUG_HOST_RESET_READY 0x99 #define DEBUG_HOST_RESET_READY 0x99
@ -2030,7 +2090,7 @@ static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL,
#endif #endif
#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \ #if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \
defined(PCIE9097) || defined(PCIEIW624) defined(PCIE9097) || defined(PCIEAW693) || defined(PCIEIW624)
/** /**
* @brief This function reads data by 8 bit from card register * @brief This function reads data by 8 bit from card register
* *
@ -2080,7 +2140,8 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -2101,7 +2162,8 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
dump_ctrl_reg, debug_host_ready); dump_ctrl_reg, debug_host_ready);
return RDWR_STATUS_FAILURE; return RDWR_STATUS_FAILURE;
} }
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -2354,7 +2416,7 @@ done:
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ #if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624) defined(PCIEAW693) || defined(PCIEIW624)
/** /**
* @brief This function dump firmware memory to file * @brief This function dump firmware memory to file
* *
@ -2386,7 +2448,8 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
PRINTM(MERROR, "Could not dump firmwware info\n"); PRINTM(MERROR, "Could not dump firmwware info\n");
return; return;
} }
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -2424,7 +2487,8 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
if (RDWR_STATUS_FAILURE == if (RDWR_STATUS_FAILURE ==
woal_pcie_rdwr_firmware(phandle, doneflag, 0)) woal_pcie_rdwr_firmware(phandle, doneflag, 0))
goto done; goto done;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) || if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
@ -2572,7 +2636,7 @@ done:
*/ */
static t_u8 woal_pcie_is_second_mac(moal_handle *handle) static t_u8 woal_pcie_is_second_mac(moal_handle *handle)
{ {
#if defined(PCIE9098) #if defined(PCIE9098) || defined(PCIEAW693)
pcie_service_card *card = (pcie_service_card *)handle->card; pcie_service_card *card = (pcie_service_card *)handle->card;
if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) || if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) ||
(card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1)) (card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1))
@ -2597,7 +2661,7 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
woal_pcie_dump_fw_info_v1(phandle); woal_pcie_dump_fw_info_v1(phandle);
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ #if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624) defined(PCIEAW693) || defined(PCIEIW624)
if (IS_PCIE8997(phandle->card_type) || if (IS_PCIE8997(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) || IS_PCIEAW693(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) || IS_PCIEIW624(phandle->card_type) ||
@ -2636,19 +2700,19 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
static mlan_status woal_pcie_get_fw_name(moal_handle *handle) static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
{ {
mlan_status ret = MLAN_STATUS_SUCCESS; mlan_status ret = MLAN_STATUS_SUCCESS;
#if defined(PCIE9098) #if defined(PCIE9098) || defined(PCIEAW693)
pcie_service_card *card = (pcie_service_card *)handle->card; pcie_service_card *card = (pcie_service_card *)handle->card;
moal_handle *ref_handle = NULL; moal_handle *ref_handle = NULL;
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ #if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624) defined(PCIEAW693) || defined(PCIEIW624)
t_u32 rev_id_reg = handle->card_info->rev_id_reg; t_u32 rev_id_reg = handle->card_info->rev_id_reg;
t_u32 revision_id = 0; t_u32 revision_id = 0;
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \ #if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624) defined(PCIEAW693) || defined(PCIEIW624)
t_u32 host_strap_reg = handle->card_info->host_strap_reg; t_u32 host_strap_reg = handle->card_info->host_strap_reg;
t_u32 magic_reg = handle->card_info->magic_reg; t_u32 magic_reg = handle->card_info->magic_reg;
t_u32 strap = 0; t_u32 strap = 0;
@ -2658,9 +2722,13 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
t_u32 boot_mode_reg = handle->card_info->boot_mode_reg; t_u32 boot_mode_reg = handle->card_info->boot_mode_reg;
t_u32 boot_mode; t_u32 boot_mode;
#endif #endif
t_u32 value = 0;
ENTER(); ENTER();
/* Make sure device is awake before reading host interface registers */
woal_pcie_read_reg(handle, handle->card_info->fw_wakeup_reg, &value);
if (handle->params.fw_name) { if (handle->params.fw_name) {
#ifdef PCIE9097 #ifdef PCIE9097
if (IS_PCIE9097(handle->card_type)) { if (IS_PCIE9097(handle->card_type)) {
@ -2810,6 +2878,37 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
} }
} }
#endif #endif
#ifdef PCIEAW693
if (IS_PCIEAW693(handle->card_type)) {
if (card->dev->device == PCIE_DEVICE_ID_88WAW693_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);
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,
PCIEUARTAW693_DEFAULT_COMBO_FW_NAME);
else
strcpy(handle->card_info->fw_name,
PCIEAW693_DEFAULT_COMBO_FW_NAME);
}
} else {
ref_handle = (moal_handle *)handle->pref_mac;
if (ref_handle) {
strcpy(handle->card_info->fw_name,
ref_handle->card_info->fw_name);
strcpy(handle->card_info->fw_name_wlan,
ref_handle->card_info->fw_name_wlan);
}
}
}
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
if (IS_PCIEIW624(handle->card_type)) { if (IS_PCIEIW624(handle->card_type)) {
woal_pcie_read_reg(handle, rev_id_reg, &revision_id); woal_pcie_read_reg(handle, rev_id_reg, &revision_id);
@ -2901,6 +3000,7 @@ static int woal_pcie_reset_fw(moal_handle *handle)
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }
PRINTM(MMSG, "PCIE Trigger FW In-band Reset success."); PRINTM(MMSG, "PCIE Trigger FW In-band Reset success.");
done: done:
LEAVE(); LEAVE();

View file

@ -47,7 +47,7 @@ Change log:
#define PCIE_DEVICE_ID_88W9097 (0x2b56) #define PCIE_DEVICE_ID_88W9097 (0x2b56)
#endif #endif
#if defined(PCIE9098) #if defined(PCIE9098) || defined(PCIEAW693)
/** PCIE device ID for 9098 card FN0 */ /** PCIE device ID for 9098 card FN0 */
#define PCIE_DEVICE_ID_88W9098P_FN0 (0x2b43) #define PCIE_DEVICE_ID_88W9098P_FN0 (0x2b43)
/** PCIE device ID for 9098 card FN1 */ /** PCIE device ID for 9098 card FN1 */
@ -59,7 +59,7 @@ Change log:
#define PCIE_DEVICE_ID_88WIW624 (0x3000) #define PCIE_DEVICE_ID_88WIW624 (0x3000)
#endif #endif
#if defined(PCIE9098) #if defined(PCIE9098) || defined(PCIEAW693)
/** PCIE device ID for AW693 card FN0 */ /** PCIE device ID for AW693 card FN0 */
#define PCIE_DEVICE_ID_88WAW693_FN0 (0x3003) #define PCIE_DEVICE_ID_88WAW693_FN0 (0x3003)
/** PCIE device ID for AW693 card FN1 */ /** PCIE device ID for AW693 card FN1 */
@ -91,6 +91,12 @@ Change log:
#define PCIE8897_DEFAULT_WLAN_FW_NAME "nxp/pcie8897_wlan.bin" #define PCIE8897_DEFAULT_WLAN_FW_NAME "nxp/pcie8897_wlan.bin"
#endif /* PCIE8897*/ #endif /* PCIE8897*/
#ifdef PCIEAW693
#define PCIEUARTAW693_DEFAULT_COMBO_FW_NAME "nxp/pcieuartaw693_combo.bin"
#define PCIEAW693_DEFAULT_COMBO_FW_NAME "nxp/pcieuartaw693_combo.bin"
#define PCIEAW693_DEFAULT_WLAN_FW_NAME "nxp/pcieaw693_wlan.bin"
#endif /* PCIEAW693*/
#ifdef PCIE9098 #ifdef PCIE9098
#define PCIE9098_Z1Z2 0x00 #define PCIE9098_Z1Z2 0x00
#define PCIE9098_A0 0x01 #define PCIE9098_A0 0x01
@ -131,7 +137,8 @@ Change log:
#define PCIEIW624_DEFAULT_WLAN_FW_NAME "nxp/pcieiw624_wlan.bin" #define PCIEIW624_DEFAULT_WLAN_FW_NAME "nxp/pcieiw624_wlan.bin"
#endif /* PCIEIW624 */ #endif /* PCIEIW624 */
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) #if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEAW693) || \
defined(PCIEIW624)
#define PCIE_NUM_MSIX_VECTORS 32 #define PCIE_NUM_MSIX_VECTORS 32
#else #else
#define PCIE_NUM_MSIX_VECTORS 4 #define PCIE_NUM_MSIX_VECTORS 4

View file

@ -3,7 +3,7 @@
* @brief This file contains standard ioctl functions * @brief This file contains standard ioctl functions
* *
* *
* Copyright 2008-2021 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -75,7 +75,7 @@ static t_u8 SupportedInfraBand[] = {
*/ */
static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq) static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
{ {
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
#ifdef REASSOCIATION #ifdef REASSOCIATION
mlan_bss_info bss_info; mlan_bss_info bss_info;
#endif #endif
@ -86,7 +86,12 @@ static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
ENTER(); ENTER();
memset(&ssid_bssid, 0, sizeof(ssid_bssid)); ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
LEAVE();
return -ENOMEM;
}
mac_idx = 0; mac_idx = 0;
buflen = MIN(wrq->u.data.length, (sizeof(buf) - 1)); buflen = MIN(wrq->u.data.length, (sizeof(buf) - 1));
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
@ -94,7 +99,7 @@ static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
if (buflen < (3 * ETH_ALEN) + 2) { if (buflen < (3 * ETH_ALEN) + 2) {
PRINTM(MERROR, PRINTM(MERROR,
"Associate: Insufficient length in IOCTL input\n"); "Associate: Insufficient length in IOCTL input\n");
kfree(ssid_bssid);
/* buffer should be at least 3 characters per BSSID octet "00:" /* buffer should be at least 3 characters per BSSID octet "00:"
** plus a space separater and at least 1 char in the SSID ** plus a space separater and at least 1 char in the SSID
*/ */
@ -105,6 +110,7 @@ static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
if (copy_from_user(buf, wrq->u.data.pointer, buflen) != 0) { if (copy_from_user(buf, wrq->u.data.pointer, buflen) != 0) {
/* copy_from_user failed */ /* copy_from_user failed */
PRINTM(MERROR, "Associate: copy from user failed\n"); PRINTM(MERROR, "Associate: copy from user failed\n");
kfree(ssid_bssid);
LEAVE(); LEAVE();
return -EINVAL; return -EINVAL;
} }
@ -118,9 +124,11 @@ static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
if (buf[i] == ':') { if (buf[i] == ':') {
mac_idx++; mac_idx++;
} else { } else {
if (mac_idx < ETH_ALEN) if (mac_idx < ETH_ALEN) {
ssid_bssid.bssid[mac_idx] = // coverity[tainted_data: SUPPRESS]
ssid_bssid->bssid[mac_idx] =
(t_u8)woal_atox(buf + i); (t_u8)woal_atox(buf + i);
}
while ((i < buflen) && (isxdigit(buf[i + 1]))) { while ((i < buflen) && (isxdigit(buf[i + 1]))) {
/* Skip entire hex value */ /* Skip entire hex value */
@ -133,17 +141,18 @@ static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
i++; i++;
/* Copy the SSID */ /* Copy the SSID */
ssid_bssid.ssid.ssid_len = buflen - i - 1; ssid_bssid->ssid.ssid_len = buflen - i - 1;
moal_memcpy_ext(priv->phandle, ssid_bssid.ssid.ssid, buf + i, moal_memcpy_ext(priv->phandle, ssid_bssid->ssid.ssid, buf + i,
sizeof(ssid_bssid.ssid.ssid), sizeof(ssid_bssid->ssid.ssid),
sizeof(ssid_bssid.ssid.ssid)); sizeof(ssid_bssid->ssid.ssid));
PRINTM(MCMND, "iwpriv assoc: AP=[" MACSTR "], ssid(%d)=[%s]\n", PRINTM(MCMND, "iwpriv assoc: AP=[" MACSTR "], ssid(%d)=[%s]\n",
MAC2STR(ssid_bssid.bssid), (int)ssid_bssid.ssid.ssid_len, MAC2STR(ssid_bssid->bssid), (int)ssid_bssid->ssid.ssid_len,
ssid_bssid.ssid.ssid); ssid_bssid->ssid.ssid);
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_bss_start(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_bss_start(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
kfree(ssid_bssid);
LEAVE(); LEAVE();
return -EFAULT; return -EFAULT;
} }
@ -160,7 +169,7 @@ static int woal_associate_ssid_bssid(moal_private *priv, struct iwreq *wrq)
sizeof(mlan_802_11_mac_addr)); sizeof(mlan_802_11_mac_addr));
} }
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
kfree(ssid_bssid);
LEAVE(); LEAVE();
return 0; return 0;
} }

View file

@ -3,7 +3,7 @@
* @brief This file contains functions for proc file. * @brief This file contains functions for proc file.
* *
* *
* Copyright 2008-2022 NXP * Copyright 2008-2022, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -26,6 +26,7 @@ Change log:
********************************************************/ ********************************************************/
#include "moal_main.h" #include "moal_main.h"
#include "moal_eth_ioctl.h"
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
#include "moal_uap.h" #include "moal_uap.h"
#endif #endif
@ -64,9 +65,6 @@ static char *szModes[] = {
}; };
#endif #endif
mlan_status parse_arguments(t_u8 *pos, int *data, int datalen,
int *user_data_len);
/******************************************************** /********************************************************
Global Variables Global Variables
********************************************************/ ********************************************************/
@ -455,7 +453,7 @@ static int parse_cmd52_string(const char *buffer, size_t len, int *func,
} }
#endif #endif
void woal_priv_get_tx_rx_ant(struct seq_file *sfp, moal_private *priv) static void woal_priv_get_tx_rx_ant(struct seq_file *sfp, moal_private *priv)
{ {
int ret = 0; int ret = 0;
int data[4] = {0}; int data[4] = {0};
@ -519,7 +517,7 @@ void woal_priv_get_tx_rx_ant(struct seq_file *sfp, moal_private *priv)
return; return;
} }
mlan_status woal_priv_set_tx_rx_ant(moal_handle *handle, char *line) static mlan_status woal_priv_set_tx_rx_ant(moal_handle *handle, char *line)
{ {
moal_private *priv = NULL; moal_private *priv = NULL;
mlan_ioctl_req *req = NULL; mlan_ioctl_req *req = NULL;

View file

@ -153,6 +153,13 @@ Change log:
#define SDIW624_DEFAULT_WLAN_FW_NAME "nxp/sdiw624_wlan.bin" #define SDIW624_DEFAULT_WLAN_FW_NAME "nxp/sdiw624_wlan.bin"
#endif /* SDIW624 */ #endif /* SDIW624 */
#ifdef SDAW693
#define SDAW693_DEFAULT_COMBO_FW_NAME "nxp/sdsdwaw693_combo.bin"
#define SDUARTAW693_COMBO_FW_NAME "nxp/sduartw693_combo.bin"
#define SDSDAW693_COMBO_FW_NAME "sdsdaw693_combo.bin"
#define SDAW693_DEFAULT_WLAN_FW_NAME "nxp/sdaw693_wlan.bin"
#endif /* SDAW693 */
#ifdef SD9177 #ifdef SD9177
#define SD9177_A0 0x00 #define SD9177_A0 0x00
#define SD9177_A1 0x01 #define SD9177_A1 0x01

View file

@ -78,6 +78,12 @@ static moal_if_ops sdiommc_ops;
/** Device ID for SD8987 */ /** Device ID for SD8987 */
#define SD_DEVICE_ID_8987 (0x9149) #define SD_DEVICE_ID_8987 (0x9149)
#endif #endif
#ifdef SDAW693
/** Device ID for SDAW693 */
#define SD_DEVICE_ID_AW693_FN1 (0x0211)
/** Device ID for SDAW693 */
#define SD_DEVICE_ID_AW693_FN2 (0x0212)
#endif
#ifdef SD9098 #ifdef SD9098
/** Device ID for SD9098 */ /** Device ID for SD9098 */
#define SD_DEVICE_ID_9098_FN1 (0x914D) #define SD_DEVICE_ID_9098_FN1 (0x914D)
@ -124,6 +130,10 @@ static const struct sdio_device_id wlan_ids[] = {
#ifdef SD8987 #ifdef SD8987
{SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_8987)}, {SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_8987)},
#endif #endif
#ifdef SDAW693
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN1)},
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN2)},
#endif
#ifdef SD9098 #ifdef SD9098
{SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN1)}, {SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN1)},
{SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN2)}, {SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN2)},
@ -428,6 +438,21 @@ static t_u16 woal_update_card_type(t_void *card)
(strlen(INTF_CARDTYPE) + strlen(KERN_VERSION))); (strlen(INTF_CARDTYPE) + strlen(KERN_VERSION)));
} }
#endif #endif
#ifdef SDAW693
if (cardp_sd->func->device == SD_DEVICE_ID_AW693_FN1 ||
cardp_sd->func->device == SD_DEVICE_ID_AW693_FN2) {
card_type = CARD_TYPE_SDAW693;
moal_memcpy_ext(NULL, driver_version, CARD_SDAW693,
strlen(CARD_SDAW693), 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 #ifdef SD9097
if (cardp_sd->func->device == SD_DEVICE_ID_9097) { if (cardp_sd->func->device == SD_DEVICE_ID_9097) {
card_type = CARD_TYPE_SD9097; card_type = CARD_TYPE_SD9097;
@ -1445,10 +1470,14 @@ int woal_sdio_read_write_cmd52(moal_handle *handle, int func, int reg, int val)
*/ */
static t_u8 woal_sdiommc_is_second_mac(moal_handle *handle) static t_u8 woal_sdiommc_is_second_mac(moal_handle *handle)
{ {
#if defined(SD9098) #if defined(SDAW693) || defined(SD9098)
sdio_mmc_card *card = (sdio_mmc_card *)handle->card; sdio_mmc_card *card = (sdio_mmc_card *)handle->card;
#endif #endif
#ifdef SDAW693
if (card->func->device == SD_DEVICE_ID_AW693_FN2)
return MTRUE;
#endif
#ifdef SD9098 #ifdef SD9098
if (card->func->device == SD_DEVICE_ID_9098_FN2) if (card->func->device == SD_DEVICE_ID_9098_FN2)
return MTRUE; return MTRUE;
@ -1466,8 +1495,8 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
t_u32 rev_id_reg = handle->card_info->rev_id_reg; t_u32 rev_id_reg = handle->card_info->rev_id_reg;
#if defined(SD8987) || defined(SD8997) || defined(SD9098) || \ #if defined(SD8987) || defined(SD8997) || defined(SD9098) || \
defined(SD9097) || defined(SDIW624) || defined(SD8978) || \ defined(SD9097) || defined(SDIW624) || defined(SDAW693) || \
defined(SD9177) || defined(SDIW615) defined(SD8978) || defined(SD9177) || defined(SDIW615)
t_u32 magic_reg = handle->card_info->magic_reg; t_u32 magic_reg = handle->card_info->magic_reg;
t_u32 magic = 0; t_u32 magic = 0;
t_u32 host_strap_reg = handle->card_info->host_strap_reg; t_u32 host_strap_reg = handle->card_info->host_strap_reg;
@ -1487,8 +1516,8 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
PRINTM(MCMND, "revision_id=0x%x\n", revision_id); PRINTM(MCMND, "revision_id=0x%x\n", revision_id);
#if defined(SD8987) || defined(SD8997) || defined(SD9098) || \ #if defined(SD8987) || defined(SD8997) || defined(SD9098) || \
defined(SD9097) || defined(SDIW624) || defined(SD8978) || \ defined(SD9097) || defined(SDIW624) || defined(SDAW693) || \
defined(SD9177) || defined(SDIW615) defined(SD8978) || defined(SD9177) || defined(SDIW615)
/** Revision ID register */ /** Revision ID register */
woal_sdiommc_read_reg(handle, magic_reg, &magic); woal_sdiommc_read_reg(handle, magic_reg, &magic);
/** Revision ID register */ /** Revision ID register */
@ -1653,6 +1682,20 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
} }
} }
#endif #endif
#ifdef SDAW693
if (IS_SDAW693(handle->card_type)) {
if (magic == CHIP_MAGIC_VALUE) {
if (strap == CARD_TYPE_SD_UART)
strncpy(handle->card_info->fw_name,
SDUARTAW693_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
else
strncpy(handle->card_info->fw_name,
SDSDAW693_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
}
}
#endif
#ifdef SDIW624 #ifdef SDIW624
if (IS_SDIW624(handle->card_type)) { if (IS_SDIW624(handle->card_type)) {
@ -2931,7 +2974,7 @@ static int woal_sdiommc_reset_fw(moal_handle *handle)
goto done; goto done;
} }
#if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \ #if defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD9177) || defined(SDIW615) defined(SDAW693) || defined(SD9177) || defined(SDIW615)
if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) || if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) ||
IS_SDIW624(handle->card_type) || IS_SD9177(handle->card_type) || IS_SDIW624(handle->card_type) || IS_SD9177(handle->card_type) ||
IS_SDIW615(handle->card_type) || IS_SDAW693(handle->card_type)) IS_SDIW615(handle->card_type) || IS_SDAW693(handle->card_type))
@ -3064,6 +3107,17 @@ static mlan_status woal_do_sdiommc_flr(moal_handle *handle, bool prepare,
} }
handle->pmlan_adapter = NULL; handle->pmlan_adapter = NULL;
} }
#ifdef DUMP_TO_PROC
if (handle->fw_dump_buf) {
moal_vfree(handle, handle->fw_dump_buf);
handle->fw_dump_buf = NULL;
handle->fw_dump_len = 0;
}
#endif
#ifdef SD9177
if (IS_SD9177(handle->card_type))
handle->event_fw_dump = MTRUE;
#endif
goto exit; goto exit;

View file

@ -3,7 +3,7 @@
* @brief This file contains the callback functions registered to MLAN * @brief This file contains the callback functions registered to MLAN
* *
* *
* Copyright 2008-2023 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -224,6 +224,10 @@ mlan_status moal_malloc_consistent(t_void *pmoal, t_u32 size, t_u8 **ppbuf,
__func__, (int)size); __func__, (int)size);
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
#ifdef PCIEAW693
if (IS_PCIEAW693(handle->card_type))
dma |= 0x100000000;
#endif
*pbuf_pa = (t_u64)dma; *pbuf_pa = (t_u64)dma;
atomic_inc(&handle->malloc_cons_count); atomic_inc(&handle->malloc_cons_count);
@ -248,6 +252,10 @@ mlan_status moal_mfree_consistent(t_void *pmoal, t_u32 size, t_u8 *pbuf,
if (!pbuf || !card) if (!pbuf || !card)
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
#ifdef PCIEAW693
if (IS_PCIEAW693(handle->card_type))
buf_pa &= 0xffffffff;
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
dma_free_coherent(&card->dev->dev, size, pbuf, buf_pa); dma_free_coherent(&card->dev->dev, size, pbuf, buf_pa);
#else #else
@ -292,6 +300,10 @@ mlan_status moal_map_memory(t_void *pmoal, t_u8 *pbuf, t_u64 *pbuf_pa,
PRINTM(MERROR, "Tx ring: failed to dma_map_single\n"); PRINTM(MERROR, "Tx ring: failed to dma_map_single\n");
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
#ifdef PCIEAW693
if (IS_PCIEAW693(handle->card_type))
dma |= 0x100000000;
#endif
*pbuf_pa = dma; *pbuf_pa = dma;
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
@ -315,6 +327,10 @@ mlan_status moal_unmap_memory(t_void *pmoal, t_u8 *pbuf, t_u64 buf_pa,
if (!card) if (!card)
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
#ifdef PCIEAW693
if (IS_PCIEAW693(handle->card_type))
buf_pa &= 0xffffffff;
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0)
dma_unmap_single(&card->dev->dev, buf_pa, size, flag); dma_unmap_single(&card->dev->dev, buf_pa, size, flag);
#else #else
@ -1149,22 +1165,26 @@ mlan_status moal_send_packet_complete(t_void *pmoal, pmlan_buffer pmbuf,
priv->stats.tx_bytes += skb->len; priv->stats.tx_bytes += skb->len;
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (drvdbg & MDAT_D)
woal_packet_fate_monitor( woal_packet_fate_monitor(
priv, PACKET_TYPE_TX, priv, PACKET_TYPE_TX,
TX_PKT_FATE_SENT, TX_PKT_FATE_SENT,
FRAME_TYPE_ETHERNET_II, 0, 0, FRAME_TYPE_ETHERNET_II,
skb->data, skb->data_len); 0, 0, skb->data,
skb->data_len);
#endif #endif
#endif #endif
} else { } else {
priv->stats.tx_errors++; priv->stats.tx_errors++;
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (drvdbg & MDAT_D)
woal_packet_fate_monitor( woal_packet_fate_monitor(
priv, PACKET_TYPE_TX, priv, PACKET_TYPE_TX,
TX_PKT_FATE_DRV_DROP_OTHER, TX_PKT_FATE_DRV_DROP_OTHER,
FRAME_TYPE_ETHERNET_II, 0, 0, FRAME_TYPE_ETHERNET_II,
skb->data, skb->data_len); 0, 0, skb->data,
skb->data_len);
#endif #endif
#endif #endif
} }
@ -1901,7 +1921,8 @@ done:
* *
* @return binded net_device pointer or NULL if not found * @return binded net_device pointer or NULL if not found
*/ */
struct net_device *moal_get_netdev_from_stalist(moal_private *priv, t_u16 aid) static struct net_device *moal_get_netdev_from_stalist(moal_private *priv,
t_u16 aid)
{ {
station_node *sta_node = NULL; station_node *sta_node = NULL;
@ -1941,6 +1962,11 @@ mlan_status moal_recv_amsdu_packet(t_void *pmoal, pmlan_buffer pmbuf)
t_u8 drop = 0; t_u8 drop = 0;
t_u8 rfc1042_eth_hdr[MLAN_MAC_ADDR_LENGTH] = {0xaa, 0xaa, 0x03, t_u8 rfc1042_eth_hdr[MLAN_MAC_ADDR_LENGTH] = {0xaa, 0xaa, 0x03,
0x00, 0x00, 0x00}; 0x00, 0x00, 0x00};
#ifdef UAP_SUPPORT
#if defined(UAP_CFG80211) || defined(STA_CFG80211)
t_u16 aid = 0;
#endif
#endif
wifi_timeval t1, t2; wifi_timeval t1, t2;
t_s32 delay; t_s32 delay;
@ -1962,6 +1988,19 @@ mlan_status moal_recv_amsdu_packet(t_void *pmoal, pmlan_buffer pmbuf)
goto done; goto done;
} }
netdev = priv->netdev; netdev = priv->netdev;
#ifdef UAP_SUPPORT
#if defined(UAP_CFG80211) || defined(STA_CFG80211)
if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) {
aid = (pmbuf->priority & 0xFF000000) >> 24;
if (!priv->vlan_sta_list[(aid - 1) % MAX_STA_COUNT]->is_valid) {
priv->stats.rx_dropped++;
goto done;
}
if (aid != 0)
netdev = moal_get_netdev_from_stalist(priv, aid);
}
#endif
#endif
skb = (struct sk_buff *)pmbuf->pdesc; skb = (struct sk_buff *)pmbuf->pdesc;
if (!skb) if (!skb)
goto done; goto done;
@ -2210,10 +2249,12 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
priv->stats.rx_dropped++; priv->stats.rx_dropped++;
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (drvdbg & MDAT_D)
woal_packet_fate_monitor( woal_packet_fate_monitor(
priv, PACKET_TYPE_RX, priv, PACKET_TYPE_RX,
RX_PKT_FATE_DRV_DROP_NOBUFS, RX_PKT_FATE_DRV_DROP_NOBUFS,
FRAME_TYPE_ETHERNET_II, 0, 0, FRAME_TYPE_ETHERNET_II,
0, 0,
(t_u8 *)(pmbuf->pbuf + (t_u8 *)(pmbuf->pbuf +
pmbuf->data_offset), pmbuf->data_offset),
pmbuf->data_len); pmbuf->data_len);
@ -2266,6 +2307,22 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
} }
#endif #endif
#endif #endif
if (priv->multi_ap_flag &&
priv->bss_type == MLAN_BSS_TYPE_STA) {
t_u32 transaction_id;
transaction_id =
woal_get_dhcp_discover_transation_id(
skb);
if (transaction_id &&
woal_get_dhcp_discover_info(
priv, transaction_id)) {
PRINTM(MDATA,
"Drop dhcp pkt, transation_id=%x\n",
transaction_id);
dev_kfree_skb(skb);
goto done;
}
}
if (!netdev) if (!netdev)
netdev = priv->netdev; netdev = priv->netdev;
skb->dev = netdev; skb->dev = netdev;
@ -2315,11 +2372,12 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
priv->netdev->name); priv->netdev->name);
status = MLAN_STATUS_FAILURE; status = MLAN_STATUS_FAILURE;
priv->stats.rx_dropped++; priv->stats.rx_dropped++;
if (drvdbg & MDAT_D)
woal_packet_fate_monitor( woal_packet_fate_monitor(
priv, PACKET_TYPE_RX, priv, PACKET_TYPE_RX,
RX_PKT_FATE_DRV_DROP_FILTER, RX_PKT_FATE_DRV_DROP_FILTER,
FRAME_TYPE_ETHERNET_II, 0, 0, skb->data, FRAME_TYPE_ETHERNET_II, 0, 0,
skb->len); skb->data, skb->len);
dev_kfree_skb(skb); dev_kfree_skb(skb);
goto done; goto done;
} }
@ -2329,10 +2387,12 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf)
priv->stats.rx_packets++; priv->stats.rx_packets++;
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
if (drvdbg & MDAT_D)
woal_packet_fate_monitor(priv, PACKET_TYPE_RX, woal_packet_fate_monitor(priv, PACKET_TYPE_RX,
RX_PKT_FATE_SUCCESS, RX_PKT_FATE_SUCCESS,
FRAME_TYPE_ETHERNET_II, 0, 0, FRAME_TYPE_ETHERNET_II,
skb->data, skb->len); 0, 0, skb->data,
skb->len);
#endif #endif
#endif #endif
#ifdef ANDROID_KERNEL #ifdef ANDROID_KERNEL
@ -2433,22 +2493,18 @@ void woal_request_busfreq_pmqos_add(t_void *handle)
if (moal_extflg_isset(pmhandle, EXT_PMQOS)) { if (moal_extflg_isset(pmhandle, EXT_PMQOS)) {
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0) #if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
#ifdef IMX_SUPPORT
if (!pm_qos_request_active(&pmhandle->woal_pm_qos_req)) if (!pm_qos_request_active(&pmhandle->woal_pm_qos_req))
pm_qos_add_request(&pmhandle->woal_pm_qos_req, pm_qos_add_request(&pmhandle->woal_pm_qos_req,
PM_QOS_CPU_DMA_LATENCY, 0); PM_QOS_CPU_DMA_LATENCY, 0);
else else
PRINTM(MERROR, "PM-QOS request already active\n"); PRINTM(MERROR, "PM-QOS request already active\n");
#endif #endif
#endif
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)
#ifdef IMX_SUPPORT
if (!cpu_latency_qos_request_active(&pmhandle->woal_pm_qos_req)) if (!cpu_latency_qos_request_active(&pmhandle->woal_pm_qos_req))
cpu_latency_qos_add_request(&pmhandle->woal_pm_qos_req, cpu_latency_qos_add_request(&pmhandle->woal_pm_qos_req,
0); 0);
else else
PRINTM(MERROR, "PM-QOS request already active\n"); PRINTM(MERROR, "PM-QOS request already active\n");
#endif
#endif #endif
} }
return; return;
@ -2468,21 +2524,17 @@ void woal_release_busfreq_pmqos_remove(t_void *handle)
if (moal_extflg_isset(pmhandle, EXT_PMQOS)) { if (moal_extflg_isset(pmhandle, EXT_PMQOS)) {
#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0) #if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36)
#ifdef IMX_SUPPORT
if (pm_qos_request_active(&pmhandle->woal_pm_qos_req)) if (pm_qos_request_active(&pmhandle->woal_pm_qos_req))
pm_qos_remove_request(&pmhandle->woal_pm_qos_req); pm_qos_remove_request(&pmhandle->woal_pm_qos_req);
else else
PRINTM(MERROR, "PM-QOS request already removed\n"); PRINTM(MERROR, "PM-QOS request already removed\n");
#endif #endif
#endif
#elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0) #elif LINUX_VERSION_CODE >= KERNEL_VERSION(5, 7, 0)
#ifdef IMX_SUPPORT
if (cpu_latency_qos_request_active(&pmhandle->woal_pm_qos_req)) if (cpu_latency_qos_request_active(&pmhandle->woal_pm_qos_req))
cpu_latency_qos_remove_request( cpu_latency_qos_remove_request(
&pmhandle->woal_pm_qos_req); &pmhandle->woal_pm_qos_req);
else else
PRINTM(MERROR, "PM-QOS request already removed\n"); PRINTM(MERROR, "PM-QOS request already removed\n");
#endif
#endif #endif
} }
return; return;
@ -2582,7 +2634,7 @@ static void woal_rx_mgmt_pkt_event(moal_private *priv, t_u8 *pkt, t_u16 len)
* *
* @return N/A * @return N/A
*/ */
void woal_rgpower_key_mismatch_event(moal_private *priv) static void woal_rgpower_key_mismatch_event(moal_private *priv)
{ {
struct woal_event *evt; struct woal_event *evt;
unsigned long flags; unsigned long flags;
@ -2771,10 +2823,12 @@ t_void woal_process_event_tx_status(moal_private *priv,
} }
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
woal_packet_fate_monitor( if (drvdbg & MDAT_D)
priv, PACKET_TYPE_TX, woal_packet_fate_monitor(priv, PACKET_TYPE_TX,
ack ? TX_PKT_FATE_ACKED : TX_PKT_FATE_SENT, ack ? TX_PKT_FATE_ACKED :
FRAME_TYPE_80211_MGMT, 0, 0, skb->data, skb->len); TX_PKT_FATE_SENT,
FRAME_TYPE_80211_MGMT, 0, 0,
skb->data, skb->len);
#endif #endif
#endif #endif
#endif #endif
@ -4465,6 +4519,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
#endif #endif
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
// forward mgmt packet to kernel without (drvdbg
// & MDAT_D) because
// (few) userspace process needs this for
// processing disassoc/deauth event with reason
// code
woal_packet_fate_monitor( woal_packet_fate_monitor(
priv, PACKET_TYPE_RX, priv, PACKET_TYPE_RX,
RX_PKT_FATE_SUCCESS, RX_PKT_FATE_SUCCESS,
@ -4637,11 +4696,13 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
} }
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
woal_packet_fate_monitor(priv, PACKET_TYPE_TX, if (drvdbg & MDAT_D)
woal_packet_fate_monitor(
priv, PACKET_TYPE_TX,
ack ? TX_PKT_FATE_ACKED : ack ? TX_PKT_FATE_ACKED :
TX_PKT_FATE_SENT, TX_PKT_FATE_SENT,
FRAME_TYPE_80211_MGMT, 0, 0, FRAME_TYPE_80211_MGMT, 0, 0, skb->data,
skb->data, skb->len); skb->len);
#endif #endif
#endif #endif
#endif #endif

View file

@ -3,7 +3,7 @@
* @brief This file contains the functions for STA CFG80211. * @brief This file contains the functions for STA CFG80211.
* *
* *
* Copyright 2011-2023 NXP * Copyright 2011-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -25,7 +25,7 @@
#include "moal_sta_cfg80211.h" #include "moal_sta_cfg80211.h"
#include "moal_eth_ioctl.h" #include "moal_eth_ioctl.h"
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
#include "moal_uap.h" #include "moal_uap_cfg80211.h"
#endif #endif
#include <linux/sort.h> #include <linux/sort.h>
@ -315,13 +315,6 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
struct cfg80211_disassoc_request *req); struct cfg80211_disassoc_request *req);
#endif #endif
#ifdef UAP_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
int woal_cfg80211_set_radar_background(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef);
#endif
#endif
/** cfg80211 operations */ /** cfg80211 operations */
static struct cfg80211_ops woal_cfg80211_ops = { static struct cfg80211_ops woal_cfg80211_ops = {
.change_virtual_intf = woal_cfg80211_change_virtual_intf, .change_virtual_intf = woal_cfg80211_change_virtual_intf,
@ -2102,7 +2095,7 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING * @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING
* -- success, otherwise fail * -- success, otherwise fail
*/ */
mlan_status woal_request_set_host_mlme(moal_private *priv, t_u8 *bssid) static mlan_status woal_request_set_host_mlme(moal_private *priv, t_u8 *bssid)
{ {
mlan_ioctl_req *req = NULL; mlan_ioctl_req *req = NULL;
mlan_ds_bss *bss = NULL; mlan_ds_bss *bss = NULL;
@ -2610,7 +2603,11 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
struct cfg80211_bss *bss = NULL; struct cfg80211_bss *bss = NULL;
unsigned long flags; unsigned long flags;
u8 *assoc_req_buf = NULL; u8 *assoc_req_buf = NULL;
#if ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
struct cfg80211_rx_assoc_resp_data resp = {
.uapsd_queues = -1,
};
#elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0)) || IMX_ANDROID_14)
struct cfg80211_rx_assoc_resp resp = { struct cfg80211_rx_assoc_resp resp = {
.uapsd_queues = -1, .uapsd_queues = -1,
}; };
@ -2674,10 +2671,17 @@ void woal_host_mlme_process_assoc_resp(moal_private *priv,
resp.req_ies = assoc_req_buf; resp.req_ies = assoc_req_buf;
resp.req_ies_len = resp.req_ies_len =
assoc_info->assoc_req_len; assoc_info->assoc_req_len;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
wiphy_lock(priv->wdev->wiphy);
cfg80211_rx_assoc_resp(priv->netdev,
&resp);
wiphy_unlock(priv->wdev->wiphy);
#else
mutex_lock(&priv->wdev->mtx); mutex_lock(&priv->wdev->mtx);
cfg80211_rx_assoc_resp(priv->netdev, cfg80211_rx_assoc_resp(priv->netdev,
&resp); &resp);
mutex_unlock(&priv->wdev->mtx); mutex_unlock(&priv->wdev->mtx);
#endif
#else #else
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 1, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 1, 0)
mutex_lock(&priv->wdev->mtx); mutex_lock(&priv->wdev->mtx);
@ -2734,9 +2738,16 @@ static void woal_assoc_resp_event(moal_private *priv,
struct woal_event *evt; struct woal_event *evt;
unsigned long flags; unsigned long flags;
moal_handle *handle = priv->phandle; moal_handle *handle = priv->phandle;
mlan_ds_misc_assoc_req assoc_req; mlan_ds_misc_assoc_req *assoc_req = NULL;
memset(&assoc_req, 0, sizeof(mlan_ds_misc_assoc_req));
woal_get_assoc_req(priv, &assoc_req, MOAL_IOCTL_WAIT); assoc_req = kzalloc(sizeof(mlan_ds_misc_assoc_req), GFP_ATOMIC);
if (!assoc_req) {
PRINTM(MERROR,
"Fail to allocate mlan_ds_misc_assoc_req buffer\n");
return;
}
woal_get_assoc_req(priv, assoc_req, MOAL_IOCTL_WAIT);
evt = kzalloc(sizeof(struct woal_event), GFP_ATOMIC); evt = kzalloc(sizeof(struct woal_event), GFP_ATOMIC);
if (evt) { if (evt) {
@ -2748,10 +2759,10 @@ static void woal_assoc_resp_event(moal_private *priv,
evt->assoc_info.assoc_resp_len = evt->assoc_info.assoc_resp_len =
MIN(passoc_rsp->assoc_resp_len, ASSOC_RSP_BUF_SIZE); MIN(passoc_rsp->assoc_resp_len, ASSOC_RSP_BUF_SIZE);
moal_memcpy_ext(priv->phandle, evt->assoc_info.assoc_req_buf, moal_memcpy_ext(priv->phandle, evt->assoc_info.assoc_req_buf,
assoc_req.assoc_req_buf, assoc_req->assoc_req_buf,
assoc_req.assoc_req_len, ASSOC_RSP_BUF_SIZE); assoc_req->assoc_req_len, ASSOC_RSP_BUF_SIZE);
evt->assoc_info.assoc_req_len = evt->assoc_info.assoc_req_len =
MIN(assoc_req.assoc_req_len, ASSOC_RSP_BUF_SIZE); MIN(assoc_req->assoc_req_len, ASSOC_RSP_BUF_SIZE);
INIT_LIST_HEAD(&evt->link); INIT_LIST_HEAD(&evt->link);
spin_lock_irqsave(&handle->evt_lock, flags); spin_lock_irqsave(&handle->evt_lock, flags);
@ -2759,6 +2770,9 @@ static void woal_assoc_resp_event(moal_private *priv,
spin_unlock_irqrestore(&handle->evt_lock, flags); spin_unlock_irqrestore(&handle->evt_lock, flags);
queue_work(handle->evt_workqueue, &handle->evt_work); queue_work(handle->evt_workqueue, &handle->evt_work);
} }
kfree(assoc_req);
// coverity[leaked_storage:SUPPRESS]
return;
} }
/** /**
@ -3696,7 +3710,7 @@ static int compare(const void *lhs, const void *rhs)
* *
* @return N/A * @return N/A
*/ */
t_u32 woal_get_chan_rule_flags(mlan_ds_custom_reg_domain *custom_reg, static t_u32 woal_get_chan_rule_flags(mlan_ds_custom_reg_domain *custom_reg,
t_u8 channel) t_u8 channel)
{ {
t_u16 num_chan = 0; t_u16 num_chan = 0;
@ -4271,7 +4285,7 @@ static t_u8 woal_is_uap_scan_result_expired(moal_private *priv)
* *
* @return MTRUE/MFALSE; * @return MTRUE/MFALSE;
*/ */
t_u8 wlan_check_scan_table_ageout(moal_private *priv) static t_u8 wlan_check_scan_table_ageout(moal_private *priv)
{ {
mlan_scan_resp scan_resp; mlan_scan_resp scan_resp;
wifi_timeval t; wifi_timeval t;
@ -5141,7 +5155,7 @@ static int woal_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
unsigned long flags; unsigned long flags;
mlan_ds_misc_assoc_rsp *assoc_rsp = NULL; mlan_ds_misc_assoc_rsp *assoc_rsp = NULL;
IEEEtypes_AssocRsp_t *passoc_rsp = NULL; IEEEtypes_AssocRsp_t *passoc_rsp = NULL;
mlan_ds_misc_assoc_req assoc_req; mlan_ds_misc_assoc_req *assoc_req = NULL;
mlan_ssid_bssid *ssid_bssid = NULL; mlan_ssid_bssid *ssid_bssid = NULL;
moal_handle *handle = priv->phandle; moal_handle *handle = priv->phandle;
@ -5294,8 +5308,9 @@ static int woal_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
priv->ft_md = 0; priv->ft_md = 0;
priv->ft_cap = 0; priv->ft_cap = 0;
} }
memset(&assoc_req, 0, sizeof(mlan_ds_misc_assoc_req)); assoc_req = kzalloc(sizeof(mlan_ds_misc_assoc_req), GFP_ATOMIC);
woal_get_assoc_req(priv, &assoc_req, MOAL_IOCTL_WAIT); if (assoc_req)
woal_get_assoc_req(priv, assoc_req, MOAL_IOCTL_WAIT);
} }
spin_lock_irqsave(&priv->connect_lock, flags); spin_lock_irqsave(&priv->connect_lock, flags);
priv->cfg_connect = MFALSE; priv->cfg_connect = MFALSE;
@ -5305,8 +5320,8 @@ static int woal_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
MAC2STR(priv->cfg_bssid)); MAC2STR(priv->cfg_bssid));
spin_unlock_irqrestore(&priv->connect_lock, flags); spin_unlock_irqrestore(&priv->connect_lock, flags);
cfg80211_connect_result( cfg80211_connect_result(
priv->netdev, priv->cfg_bssid, assoc_req.assoc_req_buf, priv->netdev, priv->cfg_bssid, assoc_req->assoc_req_buf,
assoc_req.assoc_req_len, passoc_rsp->ie_buffer, assoc_req->assoc_req_len, passoc_rsp->ie_buffer,
assoc_rsp->assoc_resp_len - ASSOC_RESP_FIXED_SIZE, assoc_rsp->assoc_resp_len - ASSOC_RESP_FIXED_SIZE,
WLAN_STATUS_SUCCESS, GFP_KERNEL); WLAN_STATUS_SUCCESS, GFP_KERNEL);
} else { } else {
@ -5319,6 +5334,7 @@ static int woal_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
GFP_KERNEL); GFP_KERNEL);
} }
kfree(ssid_bssid); kfree(ssid_bssid);
kfree(assoc_req);
kfree(assoc_rsp); kfree(assoc_rsp);
assoc_rsp = NULL; assoc_rsp = NULL;
LEAVE(); LEAVE();
@ -5555,7 +5571,9 @@ static int woal_cfg80211_disassociate(struct wiphy *wiphy,
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
if (priv->host_mlme) { if (priv->host_mlme) {
priv->delay_deauth_notify = MTRUE; priv->delay_deauth_notify = MTRUE;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) #if (CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 0, 0) || \
(defined(ANDROID_SDK_VERSION) && ANDROID_SDK_VERSION >= 33 && \
CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 74)))
moal_memcpy_ext(priv->phandle, priv->bssid_notify, req->ap_addr, moal_memcpy_ext(priv->phandle, priv->bssid_notify, req->ap_addr,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
#else #else
@ -9657,7 +9675,11 @@ void woal_host_mlme_disconnect(moal_private *priv, u16 reason_code, u8 *sa)
} }
if (GET_BSS_ROLE(priv) != MLAN_BSS_ROLE_UAP) { if (GET_BSS_ROLE(priv) != MLAN_BSS_ROLE_UAP) {
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
wiphy_lock(priv->wdev->wiphy);
cfg80211_rx_mlme_mgmt(priv->netdev, frame_buf, 26);
wiphy_unlock(priv->wdev->wiphy);
#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 11, 0)
mutex_lock(&priv->wdev->mtx); mutex_lock(&priv->wdev->mtx);
cfg80211_rx_mlme_mgmt(priv->netdev, frame_buf, 26); cfg80211_rx_mlme_mgmt(priv->netdev, frame_buf, 26);
mutex_unlock(&priv->wdev->mtx); mutex_unlock(&priv->wdev->mtx);

View file

@ -4,7 +4,7 @@
* driver. * driver.
* *
* *
* Copyright 2008-2022 NXP * Copyright 2008-2022, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -2213,7 +2213,7 @@ static int woal_uap_get_dfs_chan(t_u8 pri_chan, t_u8 bw,
* *
* @return N/A * @return N/A
*/ */
void woal_set_channel_dfs_state(t_u8 channel, t_u8 dfs_state) static void woal_set_channel_dfs_state(t_u8 channel, t_u8 dfs_state)
{ {
int index; int index;
mlan_ds_11h_chan_dfs_state ch_dfs_state; mlan_ds_11h_chan_dfs_state ch_dfs_state;

View file

@ -3,7 +3,7 @@
* @brief This file contains the functions for uAP CFG80211. * @brief This file contains the functions for uAP CFG80211.
* *
* *
* Copyright 2011-2023 NXP * Copyright 2011-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -1791,8 +1791,12 @@ static int woal_cfg80211_add_vlan_vir_if(struct wiphy *wiphy,
sizeof(ndev->perm_addr)); sizeof(ndev->perm_addr));
moal_memcpy_ext(handle, ndev->perm_addr, priv->current_addr, ETH_ALEN, moal_memcpy_ext(handle, ndev->perm_addr, priv->current_addr, ETH_ALEN,
sizeof(ndev->perm_addr)); sizeof(ndev->perm_addr));
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 16, 0)
eth_hw_addr_set(ndev, priv->current_addr);
#else
moal_memcpy_ext(handle, (t_void *)ndev->dev_addr, ndev->perm_addr, moal_memcpy_ext(handle, (t_void *)ndev->dev_addr, ndev->perm_addr,
ETH_ALEN, MAX_ADDR_LEN); ETH_ALEN, MAX_ADDR_LEN);
#endif
SET_NETDEV_DEV(ndev, wiphy_dev(wiphy)); SET_NETDEV_DEV(ndev, wiphy_dev(wiphy));
ndev->watchdog_timeo = MRVDRV_DEFAULT_UAP_WATCHDOG_TIMEOUT; ndev->watchdog_timeo = MRVDRV_DEFAULT_UAP_WATCHDOG_TIMEOUT;
@ -1827,9 +1831,18 @@ static int woal_cfg80211_add_vlan_vir_if(struct wiphy *wiphy,
ndev->ieee80211_ptr->use_4addr = params->use_4addr; ndev->ieee80211_ptr->use_4addr = params->use_4addr;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
ret = cfg80211_register_netdevice(ndev);
#else
ret = register_netdevice(ndev); ret = register_netdevice(ndev);
#endif
if (ret) { if (ret) {
PRINTM(MFATAL, "register net_device failed, ret=%d\n", ret); PRINTM(MFATAL, "register net_device failed, ret=%d\n", ret);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
cfg80211_unregister_netdevice(ndev);
#else
unregister_netdevice(ndev);
#endif
free_netdev(ndev); free_netdev(ndev);
goto fail; goto fail;
} }
@ -1951,6 +1964,11 @@ moal_private *woal_alloc_virt_interface(moal_handle *handle, t_u8 bss_index,
INIT_LIST_HEAD(&priv->mcast_list); INIT_LIST_HEAD(&priv->mcast_list);
spin_lock_init(&priv->mcast_lock); spin_lock_init(&priv->mcast_lock);
#ifdef STA_CFG80211
INIT_LIST_HEAD(&priv->dhcp_discover_queue);
spin_lock_init(&priv->dhcp_discover_lock);
#endif
spin_lock_init(&priv->connect_lock); spin_lock_init(&priv->connect_lock);
#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24)
@ -2668,7 +2686,11 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy,
PRINTM(MCMND, "wlan: Easymesh del Vlan aid=%d\n", aid); PRINTM(MCMND, "wlan: Easymesh del Vlan aid=%d\n", aid);
vlan_priv->parent_priv->vlan_sta_list[(aid - 1) % MAX_STA_COUNT] vlan_priv->parent_priv->vlan_sta_list[(aid - 1) % MAX_STA_COUNT]
->is_valid = MFALSE; ->is_valid = MFALSE;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 12, 0)
cfg80211_unregister_netdevice(dev);
#else
unregister_netdevice(dev); unregister_netdevice(dev);
#endif
LEAVE(); LEAVE();
return ret; return ret;
} }
@ -2907,7 +2929,18 @@ done:
return ret; return ret;
} }
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
/**
* @brief set AP or GO parameter
*
* @param wiphy A pointer to wiphy structure
* @param dev A pointer to net_device structure
* @param info A pointer to cfg80211_ap_update structure
* @return 0 -- success, otherwise fail
*/
int woal_cfg80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
struct cfg80211_ap_update *info)
#elif CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0)
/** /**
* @brief set AP or GO parameter * @brief set AP or GO parameter
* *
@ -2932,6 +2965,9 @@ int woal_cfg80211_set_beacon(struct wiphy *wiphy, struct net_device *dev,
#endif #endif
{ {
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
struct cfg80211_beacon_data *params = &info->beacon;
#endif
int ret = 0; int ret = 0;
ENTER(); ENTER();
@ -3007,7 +3043,6 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
moal_private *pmpriv = NULL; moal_private *pmpriv = NULL;
#endif #endif
int i;
ENTER(); ENTER();
@ -3093,19 +3128,7 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
memset(priv->uap_wep_key, 0, sizeof(priv->uap_wep_key)); memset(priv->uap_wep_key, 0, sizeof(priv->uap_wep_key));
priv->channel = 0; priv->channel = 0;
priv->bandwidth = 0; priv->bandwidth = 0;
#ifdef UAP_SUPPORT
priv->multi_ap_flag = 0;
/* Clear the whole backhaul station list in moal */
for (i = 0; i < MAX_STA_COUNT; i++) {
if (priv->vlan_sta_list[i]) {
if (priv->vlan_sta_list[i]->is_valid)
unregister_netdevice(
priv->vlan_sta_list[i]->netdev);
kfree(priv->vlan_sta_list[i]);
}
priv->vlan_sta_list[i] = NULL;
}
#endif
PRINTM(MMSG, "wlan: %s AP stopped\n", dev->name); PRINTM(MMSG, "wlan: %s AP stopped\n", dev->name);
done: done:
LEAVE(); LEAVE();
@ -3234,6 +3257,11 @@ int woal_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
#endif #endif
u16 reason_code = REASON_CODE_DEAUTH_LEAVING; u16 reason_code = REASON_CODE_DEAUTH_LEAVING;
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
#ifdef UAP_SUPPORT
#if defined(UAP_CFG80211) || defined(STA_CFG80211)
int i;
#endif
#endif
ENTER(); ENTER();
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
@ -3265,6 +3293,25 @@ int woal_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
} else { } else {
PRINTM(MIOCTL, "del station\n"); PRINTM(MIOCTL, "del station\n");
} }
#ifdef UAP_SUPPORT
#if defined(UAP_CFG80211) || defined(STA_CFG80211)
if (mac_addr) {
for (i = 0; i < MAX_STA_COUNT; i++) {
if (priv->vlan_sta_list[i] &&
!moal_memcmp(priv->phandle,
priv->vlan_sta_list[i]->peer_mac,
(u8 *)mac_addr,
MLAN_MAC_ADDR_LENGTH)) {
kfree(priv->vlan_sta_list[i]);
priv->vlan_sta_list[i] = NULL;
break;
}
}
}
#endif
#endif
LEAVE(); LEAVE();
return 0; return 0;
} }
@ -3732,6 +3779,10 @@ void woal_cac_timer_func(void *context)
static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option) static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option)
{ {
chan_band_info uap_channel; chan_band_info uap_channel;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
struct cfg80211_ap_update *info = container_of(
&priv->beacon_after, struct cfg80211_ap_update, beacon);
#endif
t_u8 chan2Offset = SEC_CHAN_NONE; t_u8 chan2Offset = SEC_CHAN_NONE;
ENTER(); ENTER();
woal_clear_all_mgmt_ies(priv, MOAL_IOCTL_WAIT); woal_clear_all_mgmt_ies(priv, MOAL_IOCTL_WAIT);
@ -3739,8 +3790,13 @@ static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option)
PRINTM(MERROR, "%s: stop uap failed \n", __func__); PRINTM(MERROR, "%s: stop uap failed \n", __func__);
goto done; goto done;
} }
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
if (woal_cfg80211_set_beacon(priv->wdev->wiphy, priv->netdev, info)) {
#else
if (woal_cfg80211_set_beacon(priv->wdev->wiphy, priv->netdev, if (woal_cfg80211_set_beacon(priv->wdev->wiphy, priv->netdev,
&priv->beacon_after)) { &priv->beacon_after)) {
#endif
PRINTM(MERROR, "%s: set mgmt ies failed \n", __func__); PRINTM(MERROR, "%s: set mgmt ies failed \n", __func__);
goto done; goto done;
} }
@ -4035,6 +4091,10 @@ int woal_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
t_u32 chsw_msec; t_u32 chsw_msec;
mlan_uap_bss_param *bss_cfg = NULL; mlan_uap_bss_param *bss_cfg = NULL;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
struct cfg80211_ap_update *info = container_of(
&params->beacon_csa, struct cfg80211_ap_update, beacon);
#endif
ENTER(); ENTER();
@ -4070,7 +4130,11 @@ int woal_cfg80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
} }
woal_clear_all_mgmt_ies(priv, MOAL_IOCTL_WAIT); woal_clear_all_mgmt_ies(priv, MOAL_IOCTL_WAIT);
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 7, 0)
if (woal_cfg80211_set_beacon(wiphy, dev, info)) {
#else
if (woal_cfg80211_set_beacon(wiphy, dev, &params->beacon_csa)) { if (woal_cfg80211_set_beacon(wiphy, dev, &params->beacon_csa)) {
#endif
PRINTM(MERROR, "%s: setting csa mgmt ies failed\n", __func__); PRINTM(MERROR, "%s: setting csa mgmt ies failed\n", __func__);
goto done; goto done;
} }

View file

@ -3,7 +3,7 @@
* @brief This file contains the uAP CFG80211 specific defines. * @brief This file contains the uAP CFG80211 specific defines.
* *
* *
* Copyright 2011-2021 NXP * Copyright 2011-2021, 2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -27,4 +27,11 @@
mlan_status woal_register_uap_cfg80211(struct net_device *dev, t_u8 bss_type); mlan_status woal_register_uap_cfg80211(struct net_device *dev, t_u8 bss_type);
#ifdef UAP_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 17, 0)
int woal_cfg80211_set_radar_background(struct wiphy *wiphy,
struct cfg80211_chan_def *chandef);
#endif
#endif
#endif /* _MOAL_UAP_CFG80211_H_ */ #endif /* _MOAL_UAP_CFG80211_H_ */

View file

@ -3,7 +3,7 @@
* @brief This file contains wireless extension standard ioctl functions * @brief This file contains wireless extension standard ioctl functions
* *
* *
* Copyright 2008-2021 NXP * Copyright 2008-2024 NXP
* *
* This software file (the File) is distributed by NXP * This software file (the File) is distributed by NXP
* under the terms of the GNU General Public License Version 2, June 1991 * under the terms of the GNU General Public License Version 2, June 1991
@ -618,7 +618,7 @@ static int woal_set_wap(struct net_device *dev, struct iw_request_info *info,
const t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0, 0, 0, 0, 0, 0}; const t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0, 0, 0, 0, 0, 0};
moal_private *priv = (moal_private *)netdev_priv(dev); moal_private *priv = (moal_private *)netdev_priv(dev);
struct sockaddr *awrq = &wrqu->addr; struct sockaddr *awrq = &wrqu->addr;
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
mlan_bss_info bss_info; mlan_bss_info bss_info;
ENTER(); ENTER();
@ -650,29 +650,34 @@ static int woal_set_wap(struct net_device *dev, struct iw_request_info *info,
} }
/* Broadcast MAC means search for best network */ /* Broadcast MAC means search for best network */
memset(&ssid_bssid, 0, sizeof(mlan_ssid_bssid)); ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
ret = -ENOMEM;
goto done;
}
if (memcmp(bcast, awrq->sa_data, MLAN_MAC_ADDR_LENGTH)) { if (memcmp(bcast, awrq->sa_data, MLAN_MAC_ADDR_LENGTH)) {
/* Check if we are already assoicated to the AP */ /* Check if we are already assoicated to the AP */
if (bss_info.media_connected == MTRUE) { if (bss_info.media_connected == MTRUE) {
if (!memcmp(awrq->sa_data, &bss_info.bssid, ETH_ALEN)) if (!memcmp(awrq->sa_data, &bss_info.bssid, ETH_ALEN))
goto done; goto done;
} }
moal_memcpy_ext(priv->phandle, &ssid_bssid.bssid, awrq->sa_data, moal_memcpy_ext(priv->phandle, &ssid_bssid->bssid,
ETH_ALEN, sizeof(ssid_bssid.bssid)); awrq->sa_data, ETH_ALEN,
sizeof(ssid_bssid->bssid));
} }
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_find_best_network(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_find_best_network(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
PRINTM(MERROR, PRINTM(MERROR,
"ASSOC: WAP: MAC address not found in BSSID List\n"); "ASSOC: WAP: MAC address not found in BSSID List\n");
ret = -ENETUNREACH; ret = -ENETUNREACH;
goto done; goto done;
} }
/* Zero SSID implies use BSSID to connect */ /* Zero SSID implies use BSSID to connect */
memset(&ssid_bssid.ssid, 0, sizeof(mlan_802_11_ssid)); memset(&ssid_bssid->ssid, 0, sizeof(mlan_802_11_ssid));
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_bss_start(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_bss_start(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }
@ -693,7 +698,8 @@ static int woal_set_wap(struct net_device *dev, struct iw_request_info *info,
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
done: done:
if (ssid_bssid)
kfree(ssid_bssid);
LEAVE(); LEAVE();
return ret; return ret;
} }
@ -1176,6 +1182,13 @@ static int woal_get_encode(struct net_device *dev, struct iw_request_info *info,
dwrq->flags = IW_ENCODE_RESTRICTED; dwrq->flags = IW_ENCODE_RESTRICTED;
break; break;
case MLAN_AUTH_MODE_SAE:
dwrq->flags = IW_ENCODE_RESTRICTED;
break;
case MLAN_AUTH_MODE_OWE:
dwrq->flags = IW_ENCODE_OPEN;
break;
case MLAN_AUTH_MODE_AUTO: case MLAN_AUTH_MODE_AUTO:
dwrq->flags = IW_ENCODE_OPEN | IW_ENCODE_RESTRICTED; dwrq->flags = IW_ENCODE_OPEN | IW_ENCODE_RESTRICTED;
break; break;
@ -2654,7 +2667,7 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
moal_private *priv = (moal_private *)netdev_priv(dev); moal_private *priv = (moal_private *)netdev_priv(dev);
struct iw_point *dwrq = &wrqu->data; struct iw_point *dwrq = &wrqu->data;
mlan_802_11_ssid req_ssid; mlan_802_11_ssid req_ssid;
mlan_ssid_bssid ssid_bssid; mlan_ssid_bssid *ssid_bssid = NULL;
mlan_ssid_bssid *owe_ssid_bssid = NULL; mlan_ssid_bssid *owe_ssid_bssid = NULL;
#ifdef REASSOCIATION #ifdef REASSOCIATION
moal_handle *handle = priv->phandle; moal_handle *handle = priv->phandle;
@ -2684,7 +2697,12 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE); woal_set_scan_type(priv, MLAN_SCAN_TYPE_ACTIVE);
memset(&req_ssid, 0, sizeof(mlan_802_11_ssid)); memset(&req_ssid, 0, sizeof(mlan_802_11_ssid));
memset(&ssid_bssid, 0, sizeof(mlan_ssid_bssid)); ssid_bssid = kzalloc(sizeof(mlan_ssid_bssid), GFP_ATOMIC);
if (!ssid_bssid) {
PRINTM(MERROR, "Fail to allocate ssid_bssid buffer\n");
ret = -ENOMEM;
goto setessid_ret;
}
#if WIRELESS_EXT > 20 #if WIRELESS_EXT > 20
req_ssid.ssid_len = dwrq->length; req_ssid.ssid_len = dwrq->length;
@ -2725,10 +2743,10 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
PRINTM(MINFO, "Requested new SSID = %s\n", PRINTM(MINFO, "Requested new SSID = %s\n",
(char *)req_ssid.ssid); (char *)req_ssid.ssid);
moal_memcpy_ext(priv->phandle, &ssid_bssid.ssid, &req_ssid, moal_memcpy_ext(priv->phandle, &ssid_bssid->ssid, &req_ssid,
sizeof(mlan_802_11_ssid), sizeof(mlan_802_11_ssid),
sizeof(ssid_bssid.ssid)); sizeof(mlan_802_11_ssid));
if (MTRUE == woal_is_connected(priv, &ssid_bssid)) { if (MTRUE == woal_is_connected(priv, ssid_bssid)) {
PRINTM(MIOCTL, "Already connect to the network\n"); PRINTM(MIOCTL, "Already connect to the network\n");
goto setessid_ret; goto setessid_ret;
} }
@ -2767,7 +2785,7 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
if (dwrq->flags != 0xFFFF) { if (dwrq->flags != 0xFFFF) {
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_find_essid(priv, &ssid_bssid, woal_find_essid(priv, ssid_bssid,
MOAL_IOCTL_WAIT)) { MOAL_IOCTL_WAIT)) {
/* Do specific SSID scanning */ /* Do specific SSID scanning */
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
@ -2792,13 +2810,12 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
if (mode != IW_MODE_ADHOC) { if (mode != IW_MODE_ADHOC) {
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_find_best_network(priv, MOAL_IOCTL_WAIT, woal_find_best_network(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
&ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto setessid_ret; goto setessid_ret;
} }
if (ssid_bssid.trans_ssid.ssid_len && if (ssid_bssid->trans_ssid.ssid_len &&
(ssid_bssid.owe_transition_mode == OWE_TRANS_MODE_OPEN)) { (ssid_bssid->owe_transition_mode == OWE_TRANS_MODE_OPEN)) {
// We need scan for OWE AP // We need scan for OWE AP
owe_ssid_bssid = (mlan_ssid_bssid *)kmalloc( owe_ssid_bssid = (mlan_ssid_bssid *)kmalloc(
sizeof(mlan_ssid_bssid), GFP_KERNEL); sizeof(mlan_ssid_bssid), GFP_KERNEL);
@ -2807,34 +2824,34 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
ret = -ENOMEM; ret = -ENOMEM;
goto setessid_ret; goto setessid_ret;
} }
woal_owe_specific_scan(priv, &ssid_bssid); woal_owe_specific_scan(priv, ssid_bssid);
memset(owe_ssid_bssid, 0, sizeof(mlan_ssid_bssid)); memset(owe_ssid_bssid, 0, sizeof(mlan_ssid_bssid));
moal_memcpy_ext(priv->phandle, &owe_ssid_bssid->ssid, moal_memcpy_ext(priv->phandle, &owe_ssid_bssid->ssid,
&ssid_bssid.trans_ssid, &ssid_bssid->trans_ssid,
sizeof(mlan_802_11_ssid), sizeof(mlan_802_11_ssid),
sizeof(owe_ssid_bssid->ssid)); sizeof(owe_ssid_bssid->ssid));
moal_memcpy_ext(priv->phandle, &owe_ssid_bssid->bssid, moal_memcpy_ext(priv->phandle, &owe_ssid_bssid->bssid,
&ssid_bssid.trans_bssid, &ssid_bssid->trans_bssid,
sizeof(mlan_802_11_mac_addr), sizeof(mlan_802_11_mac_addr),
sizeof(owe_ssid_bssid->bssid)); sizeof(owe_ssid_bssid->bssid));
if (MLAN_STATUS_SUCCESS == if (MLAN_STATUS_SUCCESS ==
woal_find_essid(priv, owe_ssid_bssid, woal_find_essid(priv, owe_ssid_bssid,
MOAL_IOCTL_WAIT)) MOAL_IOCTL_WAIT))
moal_memcpy_ext(priv->phandle, &ssid_bssid, moal_memcpy_ext(priv->phandle, ssid_bssid,
owe_ssid_bssid, owe_ssid_bssid,
sizeof(mlan_ssid_bssid), sizeof(mlan_ssid_bssid),
sizeof(ssid_bssid)); sizeof(mlan_ssid_bssid));
} }
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_11d_check_ap_channel(priv, MOAL_IOCTL_WAIT, woal_11d_check_ap_channel(priv, MOAL_IOCTL_WAIT,
&ssid_bssid)) { ssid_bssid)) {
PRINTM(MERROR, PRINTM(MERROR,
"The AP's channel is invalid for current region\n"); "The AP's channel is invalid for current region\n");
ret = -EFAULT; ret = -EFAULT;
goto setessid_ret; goto setessid_ret;
} }
} else if (MLAN_STATUS_SUCCESS != } else if (MLAN_STATUS_SUCCESS !=
woal_find_best_network(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) woal_find_best_network(priv, MOAL_IOCTL_WAIT, ssid_bssid))
/* Adhoc start, Check the channel command */ /* Adhoc start, Check the channel command */
woal_11h_channel_check_ioctl(priv, MOAL_IOCTL_WAIT); woal_11h_channel_check_ioctl(priv, MOAL_IOCTL_WAIT);
@ -2849,10 +2866,10 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
/* Connect to BSS by ESSID */ /* Connect to BSS by ESSID */
memset(&ssid_bssid.bssid, 0, MLAN_MAC_ADDR_LENGTH); memset(&ssid_bssid->bssid, 0, MLAN_MAC_ADDR_LENGTH);
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_bss_start(priv, MOAL_IOCTL_WAIT, &ssid_bssid)) { woal_bss_start(priv, MOAL_IOCTL_WAIT, ssid_bssid)) {
ret = -EFAULT; ret = -EFAULT;
goto setessid_ret; goto setessid_ret;
} }
@ -2873,6 +2890,8 @@ static int woal_set_essid(struct net_device *dev, struct iw_request_info *info,
#endif /* REASSOCIATION */ #endif /* REASSOCIATION */
setessid_ret: setessid_ret:
if (ssid_bssid)
kfree(ssid_bssid);
if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE) if (priv->scan_type == MLAN_SCAN_TYPE_PASSIVE)
woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE); woal_set_scan_type(priv, MLAN_SCAN_TYPE_PASSIVE);
#ifdef REASSOCIATION #ifdef REASSOCIATION

View file

@ -9,6 +9,8 @@ ifconfig wfd0 down
ifconfig wfd1 down ifconfig wfd1 down
ifconfig mwfd0 down ifconfig mwfd0 down
ifconfig mwfd1 down ifconfig mwfd1 down
ifconfig nan0 down
ifconfig mnan0 down
for (( i = 0; i <= 30; i++ )) for (( i = 0; i <= 30; i++ ))
do do
rmmod moal 2> /dev/null rmmod moal 2> /dev/null