mxm_wifiex: update to mxm6x17423.p1 release

Corresponding firmware version:
SDIO-UART W8987 Firmware version 16.92.21.p99.2
PCIE-UART W8997 Firmware version 16.92.21.p84.4
SDIO-UART W8997 Firmware version 16.92.21.p84.4
SDIO-UART IW416 Firmware version 16.92.21.p84.128
SDIO_UART IW612 Firmware version 18.99.2.p66
SDIO-UART W8801 Firmware version 14.92.36.p186
SDIO-UART W9098 Firmware version 17.92.1.p136.131
PCIE-UART W9098 Firmware version 17.92.1.p136.131

Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
This commit is contained in:
Sherry Sun 2023-10-07 11:16:22 +08:00
parent defde68632
commit 983c0739ec
57 changed files with 4013 additions and 1141 deletions

View file

@ -91,10 +91,8 @@ CONFIG_BIG_ENDIAN=n
#ifdef SDIO_MMC
# SDIO suspend/resume # SDIO suspend/resume
CONFIG_SDIO_SUSPEND_RESUME=y CONFIG_SDIO_SUSPEND_RESUME=y
#endif
# DFS testing support # DFS testing support
CONFIG_DFS_TESTING_SUPPORT=y CONFIG_DFS_TESTING_SUPPORT=y
@ -106,6 +104,8 @@ CONFIG_MULTI_CHAN_SUPPORT=y
CONFIG_DUMP_TO_PROC=y CONFIG_DUMP_TO_PROC=y
CONFIG_TASKLET_SUPPORT=y
#32bit app over 64bit kernel support #32bit app over 64bit kernel support
CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT=n CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT=n
@ -197,11 +197,9 @@ ifeq ($(CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT),y)
ccflags-y += -DUSERSPACE_32BIT_OVER_KERNEL_64BIT ccflags-y += -DUSERSPACE_32BIT_OVER_KERNEL_64BIT
endif endif
#ifdef SDIO_MMC
ifeq ($(CONFIG_SDIO_SUSPEND_RESUME),y) ifeq ($(CONFIG_SDIO_SUSPEND_RESUME),y)
ccflags-y += -DSDIO_SUSPEND_RESUME ccflags-y += -DSDIO_SUSPEND_RESUME
endif endif
#endif
ifeq ($(CONFIG_MULTI_CHAN_SUPPORT),y) ifeq ($(CONFIG_MULTI_CHAN_SUPPORT),y)
ccflags-y += -DMULTI_CHAN_SUPPORT ccflags-y += -DMULTI_CHAN_SUPPORT
@ -221,6 +219,10 @@ ifeq ($(CONFIG_DUMP_TO_PROC), y)
ccflags-y += -DDUMP_TO_PROC ccflags-y += -DDUMP_TO_PROC
endif endif
ifeq ($(CONFIG_TASKLET_SUPPORT), y)
ccflags-y += -DTASKLET_SUPPORT
endif
ifeq ($(CONFIG_OPENWRT_SUPPORT), y) ifeq ($(CONFIG_OPENWRT_SUPPORT), y)
ccflags-y += -DOPENWRT ccflags-y += -DOPENWRT
endif endif
@ -327,12 +329,10 @@ ifeq ($(CONFIG_PCIEIW624),y)
CONFIG_PCIE=y CONFIG_PCIE=y
ccflags-y += -DPCIEIW624 ccflags-y += -DPCIEIW624
endif endif
#ifdef PCIEAW693_OPT
ifeq ($(CONFIG_PCIEAW693),y) ifeq ($(CONFIG_PCIEAW693),y)
CONFIG_PCIE=y CONFIG_PCIE=y
ccflags-y += -DPCIEAW693 ccflags-y += -DPCIEAW693
endif endif
#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.3.0. The driver code supports Linux kernel from 2.6.32 to 6.4.7.
2) FOR DRIVER INSTALL 2) FOR DRIVER INSTALL

View file

@ -214,8 +214,12 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
t_u32 cfg_value = 0; t_u32 cfg_value = 0;
t_u32 hw_value = 0; t_u32 hw_value = 0;
t_u8 nss = 0; t_u8 nss = 0;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
ENTER(); ENTER();
@ -294,9 +298,13 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
/** update the RX MCS map */ /** update the RX MCS map */
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmadapter->card_type)) {
if (cfg->param.vht_cfg.band == BAND_SELECT_A) { if (cfg->param.vht_cfg.band == BAND_SELECT_A) {
rx_nss = GET_RXMCSSUPP( rx_nss = GET_RXMCSSUPP(
pmadapter->user_htstream >> 8); pmadapter->user_htstream >> 8);
@ -314,6 +322,7 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
0x0f; 0x0f;
} }
} }
#endif
/* use the previous user value */ /* use the previous user value */
if (cfg->param.vht_cfg.vht_rx_mcs == 0xffffffff) if (cfg->param.vht_cfg.vht_rx_mcs == 0xffffffff)
cfg->param.vht_cfg.vht_rx_mcs = GET_VHTMCS( cfg->param.vht_cfg.vht_rx_mcs = GET_VHTMCS(
@ -324,8 +333,12 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
hw_value = GET_DEVNSSRXMCS( hw_value = GET_DEVNSSRXMCS(
pmadapter->hw_dot_11ac_mcs_support, pmadapter->hw_dot_11ac_mcs_support,
nss); nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((hw_value == NO_NSS_SUPPORT) || if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT)) (cfg_value == NO_NSS_SUPPORT))
SET_VHTNSSMCS( SET_VHTNSSMCS(
@ -348,8 +361,12 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
hw_value = GET_DEVNSSTXMCS( hw_value = GET_DEVNSSTXMCS(
pmadapter->hw_dot_11ac_mcs_support, pmadapter->hw_dot_11ac_mcs_support,
nss); nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((hw_value == NO_NSS_SUPPORT) || if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT)) (cfg_value == NO_NSS_SUPPORT))
SET_VHTNSSMCS( SET_VHTNSSMCS(
@ -770,7 +787,11 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
t_u16 mcs_user = 0; t_u16 mcs_user = 0;
t_u16 mcs_resp = 0; t_u16 mcs_resp = 0;
t_u16 nss; t_u16 nss;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
#endif
ENTER(); ENTER();
/* Fill VHT cap info */ /* Fill VHT cap info */
@ -788,9 +809,13 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
if (flag) if (flag)
mcs_map_resp = mcs_map_resp =
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(priv->adapter->card_type)) {
if (bands & BAND_A) { if (bands & BAND_A) {
rx_nss = GET_RXMCSSUPP(priv->adapter->user_htstream >> rx_nss = GET_RXMCSSUPP(priv->adapter->user_htstream >>
8); 8);
@ -806,12 +831,17 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
if (bw_80p80) if (bw_80p80)
rx_nss = tx_nss = 1; rx_nss = tx_nss = 1;
} }
#endif
mcs_map_result = 0; mcs_map_result = 0;
for (nss = 1; nss <= 8; nss++) { for (nss = 1; nss <= 8; nss++) {
mcs_user = GET_VHTNSSMCS(mcs_map_user, nss); mcs_user = GET_VHTNSSMCS(mcs_map_user, nss);
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss); mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((mcs_user == NO_NSS_SUPPORT) || if ((mcs_user == NO_NSS_SUPPORT) ||
(mcs_resp == NO_NSS_SUPPORT)) (mcs_resp == NO_NSS_SUPPORT))
SET_VHTNSSMCS(mcs_map_result, nss, NO_NSS_SUPPORT); SET_VHTNSSMCS(mcs_map_result, nss, NO_NSS_SUPPORT);
@ -839,8 +869,12 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
for (nss = 1; nss <= 8; nss++) { for (nss = 1; nss <= 8; nss++) {
mcs_user = GET_VHTNSSMCS(mcs_map_user, nss); mcs_user = GET_VHTNSSMCS(mcs_map_user, nss);
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss); mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((mcs_user == NO_NSS_SUPPORT) || if ((mcs_user == NO_NSS_SUPPORT) ||
(mcs_resp == NO_NSS_SUPPORT)) (mcs_resp == NO_NSS_SUPPORT))
SET_VHTNSSMCS(mcs_map_result, nss, NO_NSS_SUPPORT); SET_VHTNSSMCS(mcs_map_result, nss, NO_NSS_SUPPORT);
@ -1052,16 +1086,24 @@ void wlan_fill_tdls_vht_oprat_ie(mlan_private *priv,
t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc) 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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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;
IEEEtypes_HECap_t *pBsshecap = MNULL; IEEEtypes_HECap_t *pBsshecap = MNULL;
#endif
ENTER(); ENTER();
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) &&
!IS_CARDAW693(pmpriv->adapter->card_type))
return ret; return ret;
/** check band A */ /** check band A */
if (!(pbss_desc->bss_band & BAND_A)) if (!(pbss_desc->bss_band & BAND_A))
@ -1087,6 +1129,7 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc)
else else
ret = MFALSE; ret = MFALSE;
} }
#endif
LEAVE(); LEAVE();
return ret; return ret;
} }
@ -1110,7 +1153,11 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
t_u16 nss; t_u16 nss;
int ret_len = 0; int ret_len = 0;
t_u8 bw_80p80 = MFALSE; t_u8 bw_80p80 = MFALSE;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0; t_u16 rx_nss = 0;
#endif
ENTER(); ENTER();
@ -1178,9 +1225,13 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
} else { } else {
/** set default bandwidth:80M*/ /** set default bandwidth:80M*/
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmadapter->card_type)) {
if (pbss_desc->bss_band & BAND_A) if (pbss_desc->bss_band & BAND_A)
rx_nss = GET_RXMCSSUPP( rx_nss = GET_RXMCSSUPP(
pmadapter->user_htstream >> 8); pmadapter->user_htstream >> 8);
@ -1188,16 +1239,22 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
rx_nss = rx_nss =
GET_RXMCSSUPP(pmadapter->user_htstream); GET_RXMCSSUPP(pmadapter->user_htstream);
} }
#endif
mcs_map_user = mcs_map_user =
GET_DEVRXMCSMAP(pmpriv->usr_dot_11ac_mcs_support); GET_DEVRXMCSMAP(pmpriv->usr_dot_11ac_mcs_support);
nss = wlan_get_nss_num_vht_mcs(mcs_map_user); nss = wlan_get_nss_num_vht_mcs(mcs_map_user);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmadapter->card_type)) {
PRINTM(MCMND, "rx_nss=%d nss=%d\n", rx_nss, nss); PRINTM(MCMND, "rx_nss=%d nss=%d\n", rx_nss, nss);
nss = MIN(rx_nss, nss); nss = MIN(rx_nss, nss);
} }
#endif
pmrvl_oper_mode->oper_mode |= (nss - 1) << 4; pmrvl_oper_mode->oper_mode |= (nss - 1) << 4;

View file

@ -295,7 +295,11 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
{ {
pmlan_adapter pmadapter = pmpriv->adapter; pmlan_adapter pmadapter = pmpriv->adapter;
t_u16 len = 0; t_u16 len = 0;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
#endif
MrvlIEtypes_He_cap_t *phecap = MNULL; MrvlIEtypes_He_cap_t *phecap = MNULL;
t_u8 nss = 0; t_u8 nss = 0;
t_u16 cfg_value = 0; t_u16 cfg_value = 0;
@ -321,8 +325,12 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
} }
phe_cap->type = wlan_cpu_to_le16(phe_cap->type); phe_cap->type = wlan_cpu_to_le16(phe_cap->type);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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)) {
if (band & BAND_AAX) { if (band & BAND_AAX) {
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >> rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
8); 8);
@ -335,12 +343,17 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
0x0f; 0x0f;
} }
} }
#endif
phecap = (MrvlIEtypes_He_cap_t *)phe_cap; phecap = (MrvlIEtypes_He_cap_t *)phe_cap;
for (nss = 1; nss <= 8; nss++) { for (nss = 1; nss <= 8; nss++) {
cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss); cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((hw_value == NO_NSS_SUPPORT) || if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT)) (cfg_value == NO_NSS_SUPPORT))
SET_HE_NSSMCS(phecap->rx_mcs_80, nss, NO_NSS_SUPPORT); SET_HE_NSSMCS(phecap->rx_mcs_80, nss, NO_NSS_SUPPORT);
@ -351,8 +364,12 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
for (nss = 1; nss <= 8; nss++) { for (nss = 1; nss <= 8; nss++) {
cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss); cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((hw_value == NO_NSS_SUPPORT) || if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT)) (cfg_value == NO_NSS_SUPPORT))
SET_HE_NSSMCS(phecap->tx_mcs_80, nss, NO_NSS_SUPPORT); SET_HE_NSSMCS(phecap->tx_mcs_80, nss, NO_NSS_SUPPORT);
@ -384,7 +401,11 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
MrvlIEtypes_He_cap_t *phecap = MNULL; MrvlIEtypes_He_cap_t *phecap = MNULL;
int len = 0; int len = 0;
t_u8 bw_80p80 = MFALSE; t_u8 bw_80p80 = MFALSE;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
t_u16 rx_nss = 0, tx_nss = 0; t_u16 rx_nss = 0, tx_nss = 0;
#endif
t_u8 nss = 0; t_u8 nss = 0;
t_u16 cfg_value = 0; t_u16 cfg_value = 0;
t_u16 hw_value = 0; t_u16 hw_value = 0;
@ -425,9 +446,13 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
} }
phecap->type = wlan_cpu_to_le16(phecap->type); phecap->type = wlan_cpu_to_le16(phecap->type);
phecap->len = wlan_cpu_to_le16(phecap->len); phecap->len = wlan_cpu_to_le16(phecap->len);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmpriv->adapter->card_type)) {
if (pbss_desc->bss_band & band_selected) { if (pbss_desc->bss_band & band_selected) {
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >> rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
8); 8);
@ -443,11 +468,16 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
if (bw_80p80) if (bw_80p80)
rx_nss = tx_nss = 1; rx_nss = tx_nss = 1;
} }
#endif
for (nss = 1; nss <= 8; nss++) { for (nss = 1; nss <= 8; nss++) {
cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss); cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((hw_value == NO_NSS_SUPPORT) || if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT)) (cfg_value == NO_NSS_SUPPORT))
SET_HE_NSSMCS(phecap->rx_mcs_80, nss, NO_NSS_SUPPORT); SET_HE_NSSMCS(phecap->rx_mcs_80, nss, NO_NSS_SUPPORT);
@ -458,8 +488,12 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
for (nss = 1; nss <= 8; nss++) { for (nss = 1; nss <= 8; nss++) {
cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss); cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
if ((hw_value == NO_NSS_SUPPORT) || if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT)) (cfg_value == NO_NSS_SUPPORT))
SET_HE_NSSMCS(phecap->tx_mcs_80, nss, NO_NSS_SUPPORT); SET_HE_NSSMCS(phecap->tx_mcs_80, nss, NO_NSS_SUPPORT);

View file

@ -853,6 +853,8 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
MrvlIEtypes_DomainParamSet_t *domain = &pdomain_info->domain; MrvlIEtypes_DomainParamSet_t *domain = &pdomain_info->domain;
t_u8 no_of_sub_band = pmadapter->domain_reg.no_of_sub_band; t_u8 no_of_sub_band = pmadapter->domain_reg.no_of_sub_band;
MrvlIEtypes_Rgn_dom_code_t *rgn = MNULL; MrvlIEtypes_Rgn_dom_code_t *rgn = MNULL;
t_u8 *tlv = MNULL;
t_u8 i; t_u8 i;
ENTER(); ENTER();
@ -881,7 +883,10 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
tlv = (t_u8 *)&pdomain_info->domain;
/* Set domain info fields */ /* Set domain info fields */
domain = (MrvlIEtypes_DomainParamSet_t *)tlv;
domain->header.type = wlan_cpu_to_le16(TLV_TYPE_DOMAIN); domain->header.type = wlan_cpu_to_le16(TLV_TYPE_DOMAIN);
memcpy_ext(pmadapter, domain->country_code, memcpy_ext(pmadapter, domain->country_code,
pmadapter->domain_reg.country_code, pmadapter->domain_reg.country_code,
@ -898,20 +903,22 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
MRVDRV_MAX_SUBBAND_802_11D * MRVDRV_MAX_SUBBAND_802_11D *
sizeof(IEEEtypes_SubbandSet_t)); sizeof(IEEEtypes_SubbandSet_t));
pcmd->size = sizeof(pdomain_info->action) + domain->header.len + pcmd->size += sizeof(pdomain_info->action) +
sizeof(MrvlIEtypesHeader_t) + S_DS_GEN; domain->header.len + sizeof(MrvlIEtypesHeader_t) +
S_DS_GEN;
tlv += domain->header.len + sizeof(MrvlIEtypesHeader_t);
if (pmadapter->domain_reg.dfs_region != NXP_DFS_UNKNOWN) { if (pmadapter->domain_reg.dfs_region != NXP_DFS_UNKNOWN) {
rgn = (MrvlIEtypes_Rgn_dom_code_t rgn = (MrvlIEtypes_Rgn_dom_code_t *)tlv;
*)((t_u8 *)&pdomain_info->domain +
domain->header.len +
sizeof(MrvlIEtypesHeader_t));
rgn->header.type = rgn->header.type =
wlan_cpu_to_le16(TLV_TYPE_REGION_DOMAIN_CODE); wlan_cpu_to_le16(TLV_TYPE_REGION_DOMAIN_CODE);
rgn->header.len = 2; rgn->header.len = 2;
rgn->domain_code = pmadapter->domain_reg.dfs_region; rgn->domain_code = pmadapter->domain_reg.dfs_region;
pcmd->size += sizeof(MrvlIEtypes_Rgn_dom_code_t); pcmd->size += sizeof(MrvlIEtypes_Rgn_dom_code_t);
tlv += sizeof(MrvlIEtypes_Rgn_dom_code_t);
} }
} else { } else {
pcmd->size = sizeof(pdomain_info->action) + S_DS_GEN; pcmd->size = sizeof(pdomain_info->action) + S_DS_GEN;
} }

View file

@ -197,7 +197,7 @@ static t_u32 wlan_11h_convert_ieee_to_mrvl_ie(mlan_adapter *pmadapter,
LEAVE(); LEAVE();
/* Return the number of bytes appended to pout_buf */ /* Return the number of bytes appended to pout_buf */
return sizeof(mrvl_ie_hdr) + pin_ie[1]; return (t_u32)(sizeof(mrvl_ie_hdr) + pin_ie[1]);
} }
/** /**
@ -3530,6 +3530,12 @@ mlan_status wlan_11h_ioctl_chan_dfs_state(pmlan_adapter pmadapter,
priv, BAND_A, priv, BAND_A,
ds_11hcfg->param.ch_dfs_state.channel); ds_11hcfg->param.ch_dfs_state.channel);
} else { } else {
if (ds_11hcfg->param.ch_dfs_state.dfs_state ==
DFS_UNAVAILABLE) {
wlan_11h_add_dfs_timestamp(
pmadapter, DFS_TS_REPR_NOP_START,
ds_11hcfg->param.ch_dfs_state.channel);
}
wlan_set_chan_dfs_state( wlan_set_chan_dfs_state(
priv, BAND_A, priv, BAND_A,
ds_11hcfg->param.ch_dfs_state.channel, ds_11hcfg->param.ch_dfs_state.channel,

View file

@ -1536,9 +1536,13 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap,
pmadapter->hw_mpdu_density); pmadapter->hw_mpdu_density);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmadapter->card_type)) {
if (bands & BAND_A) if (bands & BAND_A)
rx_mcs_supp = MIN( rx_mcs_supp = MIN(
rx_mcs_supp, rx_mcs_supp,
@ -1548,6 +1552,7 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap,
MIN(rx_mcs_supp, MIN(rx_mcs_supp,
GET_RXMCSSUPP(pmadapter->user_htstream)); GET_RXMCSSUPP(pmadapter->user_htstream));
} }
#endif
memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff, memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff,
rx_mcs_supp); rx_mcs_supp);
/* Clear all the other values to get the minimum mcs set btw STA and AP /* Clear all the other values to get the minimum mcs set btw STA and AP
@ -1609,9 +1614,13 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap,
SETAMPDU_SPACING(pht_cap->ht_cap.ampdu_param, 0); SETAMPDU_SPACING(pht_cap->ht_cap.ampdu_param, 0);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmadapter->card_type)) {
if (bands & BAND_A) if (bands & BAND_A)
rx_mcs_supp = MIN( rx_mcs_supp = MIN(
rx_mcs_supp, rx_mcs_supp,
@ -1621,6 +1630,7 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap,
MIN(rx_mcs_supp, MIN(rx_mcs_supp,
GET_RXMCSSUPP(pmadapter->user_htstream)); GET_RXMCSSUPP(pmadapter->user_htstream));
} }
#endif
memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff, memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff,
rx_mcs_supp); rx_mcs_supp);
/* Clear all the other values to get the minimum mcs set btw STA and AP /* Clear all the other values to get the minimum mcs set btw STA and AP

View file

@ -209,7 +209,11 @@ static mlan_status wlan_11n_dispatch_pkt_until_start_win(
} }
/* clear the bits of reorder bitmap that has been dispatched */ /* clear the bits of reorder bitmap that has been dispatched */
rx_reor_tbl_ptr->bitmap = rx_reor_tbl_ptr->bitmap >> no_pkt_to_send; if (no_pkt_to_send < (8 * (sizeof(rx_reor_tbl_ptr->bitmap))))
rx_reor_tbl_ptr->bitmap =
rx_reor_tbl_ptr->bitmap >> no_pkt_to_send;
else
rx_reor_tbl_ptr->bitmap = 0;
rx_reor_tbl_ptr->start_win = start_win; rx_reor_tbl_ptr->start_win = start_win;
pmpriv->adapter->callbacks.moal_spin_unlock( pmpriv->adapter->callbacks.moal_spin_unlock(
@ -290,7 +294,10 @@ static mlan_status wlan_11n_scan_and_dispatch(t_void *priv,
} }
/* clear the bits of reorder bitmap that has been dispatched */ /* clear the bits of reorder bitmap that has been dispatched */
if (i < (8 * sizeof(rx_reor_tbl_ptr->bitmap)))
rx_reor_tbl_ptr->bitmap = rx_reor_tbl_ptr->bitmap >> i; rx_reor_tbl_ptr->bitmap = rx_reor_tbl_ptr->bitmap >> i;
else
rx_reor_tbl_ptr->bitmap = 0;
rx_reor_tbl_ptr->start_win = rx_reor_tbl_ptr->start_win =
(rx_reor_tbl_ptr->start_win + i) & (MAX_TID_VALUE - 1); (rx_reor_tbl_ptr->start_win + i) & (MAX_TID_VALUE - 1);
@ -1531,6 +1538,9 @@ static void wlan_update_ampdu_rxwinsize(pmlan_adapter pmadapter, t_u8 coex_flag)
priv->add_ba_param.rx_win_size = priv->add_ba_param.rx_win_size =
MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE; MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE;
#endif #endif
if (priv->bss_type == MLAN_BSS_TYPE_NAN)
priv->add_ba_param.rx_win_size =
MLAN_NAN_COEX_AMPDU_DEF_RXWINSIZE;
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
if (priv->bss_type == MLAN_BSS_TYPE_UAP) if (priv->bss_type == MLAN_BSS_TYPE_UAP)
priv->add_ba_param.rx_win_size = priv->add_ba_param.rx_win_size =

View file

@ -1509,19 +1509,7 @@ static mlan_status wlan_dnld_sleep_confirm_cmd(mlan_adapter *pmadapter)
cmd_len + pmadapter->ops.intf_header_len; cmd_len + pmadapter->ops.intf_header_len;
#endif #endif
if (pmbuf) if (pmbuf) {
ret = pmadapter->ops.host_to_card(pmpriv, MLAN_TYPE_CMD, pmbuf,
MNULL);
#ifdef USB
if (IS_USB(pmadapter->card_type) && (ret != MLAN_STATUS_PENDING))
wlan_free_mlan_buffer(pmadapter, pmbuf);
#endif
if (ret == MLAN_STATUS_FAILURE) {
PRINTM(MERROR, "SLEEP_CFM: failed\n");
pmadapter->dbg.num_cmd_sleep_cfm_host_to_card_failure++;
goto done;
} else {
if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP) if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP)
pmadapter->ps_state = PS_STATE_SLEEP_CFM; pmadapter->ps_state = PS_STATE_SLEEP_CFM;
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
@ -1558,8 +1546,19 @@ static mlan_status wlan_dnld_sleep_confirm_cmd(mlan_adapter *pmadapter)
else else
PRINTM(MEVENT, "+"); PRINTM(MEVENT, "+");
} }
}
ret = pmadapter->ops.host_to_card(pmpriv, MLAN_TYPE_CMD, pmbuf,
MNULL);
}
#ifdef USB
if (IS_USB(pmadapter->card_type) && (ret != MLAN_STATUS_PENDING))
wlan_free_mlan_buffer(pmadapter, pmbuf);
#endif
if (ret == MLAN_STATUS_FAILURE) {
PRINTM(MERROR, "SLEEP_CFM: failed\n");
pmadapter->dbg.num_cmd_sleep_cfm_host_to_card_failure++;
goto done;
}
done: done:
LEAVE(); LEAVE();
return ret; return ret;
@ -2373,6 +2372,16 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter)
goto done; goto done;
} }
if (cmdresp_result == HostCmd_RESULT_RGPWR_KEY_MISMATCH) {
PRINTM(MERROR,
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
PRINTM(MERROR, " Security Key Mismatch for rgpower_XX.bin \n");
PRINTM(MERROR,
"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH,
MNULL);
}
if (pmadapter->curr_cmd->cmd_flag & CMD_F_HOSTCMD) { if (pmadapter->curr_cmd->cmd_flag & CMD_F_HOSTCMD) {
if (pmadapter->curr_cmd && if (pmadapter->curr_cmd &&
cmdresp_result == HostCmd_RESULT_PRE_ASLEEP) { cmdresp_result == HostCmd_RESULT_PRE_ASLEEP) {
@ -2429,7 +2438,9 @@ 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 (pmadapter->pcard_pcie->reg->use_adma) if (pmadapter->pcard_pcie->reg->use_adma)
#endif
wlan_pcie_init_fw(pmadapter); wlan_pcie_init_fw(pmadapter);
} }
#endif #endif
@ -3537,14 +3548,16 @@ t_void wlan_check_ps_cond(mlan_adapter *pmadapter)
if (!pmadapter->cmd_sent && !pmadapter->curr_cmd && if (!pmadapter->cmd_sent && !pmadapter->curr_cmd &&
!pmadapter->keep_wakeup && !wlan_is_tx_pending(pmadapter) && !pmadapter->keep_wakeup && !wlan_is_tx_pending(pmadapter) &&
!pmadapter->event_cause && !IS_CARD_RX_RCVD(pmadapter)) { !wlan_is_rx_pending(pmadapter) && !pmadapter->event_cause &&
!IS_CARD_RX_RCVD(pmadapter)) {
wlan_dnld_sleep_confirm_cmd(pmadapter); wlan_dnld_sleep_confirm_cmd(pmadapter);
} else { } else {
PRINTM(MCMND, "Delay Sleep Confirm (%s%s%s%s)\n", PRINTM(MCMND, "Delay Sleep Confirm (%s%s%s%s%s%s)\n",
(pmadapter->cmd_sent) ? "D" : "", (pmadapter->cmd_sent) ? "D" : "",
(pmadapter->curr_cmd) ? "C" : "", (pmadapter->curr_cmd) ? "C" : "",
(pmadapter->event_cause) ? "V" : "", (pmadapter->event_cause) ? "V" : "",
(wlan_is_tx_pending(pmadapter)) ? "T" : "", (wlan_is_tx_pending(pmadapter)) ? "T" : "",
(wlan_is_rx_pending(pmadapter)) ? "P" : "",
(IS_CARD_RX_RCVD(pmadapter)) ? "R" : ""); (IS_CARD_RX_RCVD(pmadapter)) ? "R" : "");
} }
@ -4916,16 +4929,6 @@ mlan_status wlan_adapter_get_hw_spec(pmlan_adapter pmadapter)
pmadapter->ptxpwr_data = MNULL; pmadapter->ptxpwr_data = MNULL;
pmadapter->txpwr_data_len = 0; pmadapter->txpwr_data_len = 0;
} }
if (!pmadapter->pdpd_data &&
(pmadapter->dpd_data_len == UNKNOW_DPD_LENGTH)) {
ret = wlan_prepare_cmd(priv, HostCmd_CMD_CFG_DATA,
HostCmd_ACT_GEN_GET, OID_TYPE_DPD, MNULL,
MNULL);
if (ret) {
ret = MLAN_STATUS_FAILURE;
goto done;
}
}
/** Cal data dnld cmd prepare */ /** Cal data dnld cmd prepare */
if ((pmadapter->pcal_data) && (pmadapter->cal_data_len > 0)) { if ((pmadapter->pcal_data) && (pmadapter->cal_data_len > 0)) {
ret = wlan_prepare_cmd(priv, HostCmd_CMD_CFG_DATA, ret = wlan_prepare_cmd(priv, HostCmd_CMD_CFG_DATA,
@ -5305,8 +5308,10 @@ mlan_status wlan_process_vdll_event(pmlan_private pmpriv, pmlan_buffer pevent)
case VDLL_IND_TYPE_REQ: case VDLL_IND_TYPE_REQ:
offset = wlan_le32_to_cpu(ind->offset); offset = wlan_le32_to_cpu(ind->offset);
block_len = wlan_le16_to_cpu(ind->block_len); block_len = wlan_le16_to_cpu(ind->block_len);
PRINTM(MEVENT, "VDLL_IND: type=%d offset = 0x%x, len = %d\n", PRINTM(MEVENT,
wlan_le16_to_cpu(ind->type), offset, block_len); "VDLL_IND: type=%d ID=%d offset = 0x%x len = %d\n",
wlan_le16_to_cpu(ind->type),
wlan_le16_to_cpu(ind->vdllId), offset, block_len);
if (offset <= ctrl->vdll_len) { if (offset <= ctrl->vdll_len) {
block_len = MIN(block_len, ctrl->vdll_len - offset); block_len = MIN(block_len, ctrl->vdll_len - offset);
if (!pmadapter->cmd_sent) { if (!pmadapter->cmd_sent) {
@ -5340,6 +5345,9 @@ mlan_status wlan_process_vdll_event(pmlan_private pmpriv, pmlan_buffer pevent)
case VDLL_IND_TYPE_ERR_ID: case VDLL_IND_TYPE_ERR_ID:
PRINTM(MERROR, "VDLL_IND (ID ERR).\n"); PRINTM(MERROR, "VDLL_IND (ID ERR).\n");
break; break;
case VDLL_IND_TYPE_SEC_ERR_ID:
PRINTM(MERROR, "VDLL_IND (SECURE ERR).\n");
break;
default: default:
PRINTM(MERROR, "unknow vdll ind type=%d\n", ind->type); PRINTM(MERROR, "unknow vdll ind type=%d\n", ind->type);
break; break;
@ -5524,6 +5532,7 @@ mlan_status wlan_handle_event_multi_chan_info(pmlan_private pmpriv,
#ifdef USB #ifdef USB
if (IS_USB(pmadapter->card_type)) { if (IS_USB(pmadapter->card_type)) {
wlan_resync_usb_port(pmadapter);
} }
#endif #endif
@ -6156,12 +6165,16 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
wlan_show_dot11ndevcap(pmadapter, pmadapter->hw_dot_11n_dev_cap); wlan_show_dot11ndevcap(pmadapter, pmadapter->hw_dot_11n_dev_cap);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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*/
if (pmadapter->fw_bands & BAND_A) if (pmadapter->fw_bands & BAND_A)
pmadapter->user_htstream |= (pmadapter->user_htstream << 8); pmadapter->user_htstream |= (pmadapter->user_htstream << 8);
PRINTM(MCMND, "user_htstream=0x%x\n", pmadapter->user_htstream); PRINTM(MCMND, "user_htstream=0x%x\n", pmadapter->user_htstream);
#endif
if (ISSUPP_BEAMFORMING(pmadapter->hw_dot_11n_dev_cap)) { if (ISSUPP_BEAMFORMING(pmadapter->hw_dot_11n_dev_cap)) {
PRINTM(MCMND, "Enable Beamforming\n"); PRINTM(MCMND, "Enable Beamforming\n");
@ -7217,75 +7230,6 @@ mlan_status wlan_ret_tx_rx_pkt_stats(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
/*
* @brief This function prepares command of cwmode control.
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action The action: GET or SET
* @param pdata_buf A pointer to data buffer
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_cw_mode_ctrl(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf)
{
HostCmd_DS_CW_MODE_CTRL *cwmode_ctrl = &cmd->params.cwmode;
mlan_ds_cw_mode_ctrl *cw_mode = (mlan_ds_cw_mode_ctrl *)pdata_buf;
ENTER();
cmd->size =
wlan_cpu_to_le16((sizeof(HostCmd_DS_CW_MODE_CTRL)) + S_DS_GEN);
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CW_MODE_CTRL);
cwmode_ctrl->action = wlan_cpu_to_le16(cmd_action);
if (cmd_action == HostCmd_ACT_GEN_SET) {
cwmode_ctrl->mode = cw_mode->mode;
cwmode_ctrl->channel = cw_mode->channel;
cwmode_ctrl->chanInfo = cw_mode->chanInfo;
cwmode_ctrl->txPower = wlan_cpu_to_le16(cw_mode->txPower);
cwmode_ctrl->rateInfo = wlan_cpu_to_le32(cw_mode->rateInfo);
cwmode_ctrl->pktLength = wlan_cpu_to_le16(cw_mode->pktLength);
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/*
* @brief This function handles the command response of cwmode_ctrl
*
* @param pmpriv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
* @param pioctl_buf A pointer to mlan_ioctl_req structure
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_ret_cw_mode_ctrl(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf)
{
HostCmd_DS_CW_MODE_CTRL *cwmode_resp = &resp->params.cwmode;
mlan_ds_misc_cfg *misc = MNULL;
ENTER();
if (pioctl_buf) {
misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
misc->param.cwmode.mode = cwmode_resp->mode;
misc->param.cwmode.channel = cwmode_resp->channel;
misc->param.cwmode.chanInfo = cwmode_resp->chanInfo;
misc->param.cwmode.txPower =
wlan_le16_to_cpu(cwmode_resp->txPower);
misc->param.cwmode.rateInfo =
wlan_le32_to_cpu(cwmode_resp->rateInfo);
;
misc->param.cwmode.pktLength =
wlan_le16_to_cpu(cwmode_resp->pktLength);
;
pioctl_buf->data_read_written = sizeof(mlan_ds_misc_cfg);
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/** /**
* @brief This function prepares command of rf_antenna. * @brief This function prepares command of rf_antenna.
* *
@ -7374,7 +7318,11 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
HostCmd_DS_802_11_RF_ANTENNA *pantenna = &resp->params.antenna; HostCmd_DS_802_11_RF_ANTENNA *pantenna = &resp->params.antenna;
t_u16 tx_ant_mode = wlan_le16_to_cpu(pantenna->tx_antenna_mode); t_u16 tx_ant_mode = wlan_le16_to_cpu(pantenna->tx_antenna_mode);
t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode); t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
mlan_adapter *pmadapter = pmpriv->adapter; mlan_adapter *pmadapter = pmpriv->adapter;
#endif
typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 { typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 {
/** Action */ /** Action */
t_u16 action; t_u16 action;
@ -7400,6 +7348,9 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
" Rx action = 0x%x, Rx Mode = 0x%04x\n", " Rx action = 0x%x, Rx Mode = 0x%04x\n",
wlan_le16_to_cpu(pantenna->action_tx), tx_ant_mode, wlan_le16_to_cpu(pantenna->action_tx), tx_ant_mode,
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) || \
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
defined(SDIW624) || 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) ||
@ -7435,6 +7386,7 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv,
pmadapter->user_htstream, tx_ant_mode, pmadapter->user_htstream, tx_ant_mode,
rx_ant_mode); rx_ant_mode);
} }
#endif
} else } else
PRINTM(MINFO, PRINTM(MINFO,
"RF_ANT_RESP: action = 0x%x, Mode = 0x%04x, Evaluate time = %d, Current antenna = %d\n", "RF_ANT_RESP: action = 0x%x, Mode = 0x%04x, Evaluate time = %d, Current antenna = %d\n",
@ -7471,8 +7423,12 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf) t_u16 cmd_action, t_void *pdata_buf)
{ {
mlan_ds_reg_rw *reg_rw; mlan_ds_reg_rw *reg_rw;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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
ENTER(); ENTER();
@ -7486,6 +7442,9 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
mac_reg->action = wlan_cpu_to_le16(cmd_action); mac_reg->action = wlan_cpu_to_le16(cmd_action);
mac_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); mac_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
@ -7503,6 +7462,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
sizeof(HostCmd_DS_MAC_REG_ACCESS) + S_DS_GEN + sizeof(HostCmd_DS_MAC_REG_ACCESS) + S_DS_GEN +
sizeof(MrvlIEtypes_Reg_type_t)); sizeof(MrvlIEtypes_Reg_type_t));
} }
#endif
break; break;
} }
case HostCmd_CMD_REG_ACCESS: { case HostCmd_CMD_REG_ACCESS: {
@ -7524,6 +7484,9 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
bbp_reg->action = wlan_cpu_to_le16(cmd_action); bbp_reg->action = wlan_cpu_to_le16(cmd_action);
bbp_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); bbp_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
bbp_reg->value = (t_u8)reg_rw->value; bbp_reg->value = (t_u8)reg_rw->value;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
@ -7541,6 +7504,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
sizeof(HostCmd_DS_BBP_REG_ACCESS) + S_DS_GEN + sizeof(HostCmd_DS_BBP_REG_ACCESS) + S_DS_GEN +
sizeof(MrvlIEtypes_Reg_type_t)); sizeof(MrvlIEtypes_Reg_type_t));
} }
#endif
break; break;
} }
case HostCmd_CMD_RF_REG_ACCESS: { case HostCmd_CMD_RF_REG_ACCESS: {
@ -7551,6 +7515,9 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
rf_reg->action = wlan_cpu_to_le16(cmd_action); rf_reg->action = wlan_cpu_to_le16(cmd_action);
rf_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); rf_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
rf_reg->value = (t_u8)reg_rw->value; rf_reg->value = (t_u8)reg_rw->value;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
@ -7568,6 +7535,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
sizeof(HostCmd_DS_RF_REG_ACCESS) + S_DS_GEN + sizeof(HostCmd_DS_RF_REG_ACCESS) + S_DS_GEN +
sizeof(MrvlIEtypes_Reg_type_t)); sizeof(MrvlIEtypes_Reg_type_t));
} }
#endif
break; break;
} }
case HostCmd_CMD_CAU_REG_ACCESS: { case HostCmd_CMD_CAU_REG_ACCESS: {
@ -7613,6 +7581,9 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
bca_reg->action = wlan_cpu_to_le16(cmd_action); bca_reg->action = wlan_cpu_to_le16(cmd_action);
bca_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset); bca_reg->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
@ -7630,6 +7601,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
sizeof(HostCmd_DS_BCA_REG_ACCESS) + S_DS_GEN + sizeof(HostCmd_DS_BCA_REG_ACCESS) + S_DS_GEN +
sizeof(MrvlIEtypes_Reg_type_t)); sizeof(MrvlIEtypes_Reg_type_t));
} }
#endif
break; break;
} }
default: default:
@ -7814,6 +7786,69 @@ mlan_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
/**
* @brief This function prepares command of gpio_cfg.
*
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action the action: GET or SET
* @param pdata_buf A pointer to data buffer
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_gpio_cfg_ops(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
t_void *pdata_buf)
{
mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pdata_buf;
HostCmd_gpio_cfg_ops *gpio_cfg =
(HostCmd_gpio_cfg_ops *)&cmd->params.gpio_cfg_ops;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_GPIO_CFG);
cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_gpio_cfg_ops) + S_DS_GEN);
gpio_cfg->action = (t_u8)cmd_action;
gpio_cfg->opsType = misc->param.gpio_cfg_ops.opsType;
gpio_cfg->pin_num = misc->param.gpio_cfg_ops.pin_num;
gpio_cfg->value = misc->param.gpio_cfg_ops.value;
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/**
* @brief This function handles the command response of gpio_cfg
*
* @param pmpriv A pointer to mlan_private structure
* @param resp A pointer to HostCmd_DS_COMMAND
* @param pioctl_buf A pointer to command buffer
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_ret_gpio_cfg_ops(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf)
{
mlan_ds_misc_cfg *misc = MNULL;
mlan_ds_gpio_cfg_ops *gpio_cfg = MNULL;
HostCmd_gpio_cfg_ops *gpio =
(HostCmd_gpio_cfg_ops *)&resp->params.gpio_cfg_ops;
ENTER();
if (pioctl_buf) {
misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf;
gpio_cfg = &misc->param.gpio_cfg_ops;
gpio_cfg->action = gpio->action;
gpio_cfg->opsType = gpio->opsType;
gpio_cfg->pin_num = gpio->pin_num;
gpio_cfg->value = gpio->value;
}
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/** /**
* *
* @brief This function handles coex events generated by firmware * @brief This function handles coex events generated by firmware
@ -8511,6 +8546,7 @@ mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv,
/* Add FW cfp tables and region info */ /* Add FW cfp tables and region info */
wlan_add_fw_cfp_tables(pmpriv, tlv_buf, tlv_buf_left); wlan_add_fw_cfp_tables(pmpriv, tlv_buf, tlv_buf_left);
if (pmadapter->otp_region) { if (pmadapter->otp_region) {
if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code, if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code,
pmadapter->fw_bands)) { pmadapter->fw_bands)) {
@ -10310,6 +10346,74 @@ mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
/**
* @brief This function prepares command of TX_FRAME
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action the action: GET or SET
* @param pdata_buf A pointer to data buffer
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_tx_frame(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf)
{
t_u16 cmd_size = 0;
HostCmd_DS_80211_TX_FRAME *tx_frame_cmd = &cmd->params.tx_frame;
mlan_ds_misc_tx_frame *tx_frame = (mlan_ds_misc_tx_frame *)pdata_buf;
TxPD *plocal_tx_pd = (TxPD *)tx_frame_cmd->buffer;
t_u32 pkt_type;
t_u32 tx_control;
t_u8 *pdata = tx_frame->tx_buf;
t_u16 data_len = tx_frame->data_len;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_TX_FRAME);
cmd_size = sizeof(HostCmd_DS_80211_TX_FRAME) + S_DS_GEN;
tx_frame_cmd->action = 0;
tx_frame_cmd->status = 0;
memcpy_ext(pmpriv->adapter, &tx_frame_cmd->band_config,
(t_u8 *)&tx_frame->bandcfg, sizeof(t_u8), sizeof(t_u8));
tx_frame_cmd->channel = tx_frame->channel;
if (tx_frame->buf_type == MLAN_BUF_TYPE_RAW_DATA) {
memcpy_ext(pmpriv->adapter, &pkt_type, tx_frame->tx_buf,
sizeof(pkt_type), sizeof(pkt_type));
memcpy_ext(pmpriv->adapter, &tx_control,
tx_frame->tx_buf + sizeof(pkt_type),
sizeof(tx_control), sizeof(tx_control));
data_len -= sizeof(pkt_type) + sizeof(tx_control);
pdata += sizeof(pkt_type) + sizeof(tx_control);
}
memcpy_ext(pmpriv->adapter, tx_frame_cmd->buffer + sizeof(TxPD), pdata,
data_len, data_len);
memset(pmpriv->adapter, plocal_tx_pd, 0, sizeof(TxPD));
plocal_tx_pd->bss_num = GET_BSS_NUM(pmpriv);
plocal_tx_pd->bss_type = pmpriv->bss_type;
plocal_tx_pd->tx_pkt_length = (t_u16)data_len;
plocal_tx_pd->priority = (t_u8)tx_frame->priority;
plocal_tx_pd->tx_pkt_offset = sizeof(TxPD);
plocal_tx_pd->pkt_delay_2ms = 0xff;
if (tx_frame->buf_type == MLAN_BUF_TYPE_RAW_DATA) {
plocal_tx_pd->tx_pkt_type = (t_u16)pkt_type;
plocal_tx_pd->tx_control = tx_control;
}
if (tx_frame->flags & MLAN_BUF_FLAG_TX_STATUS) {
plocal_tx_pd->tx_control_1 |= tx_frame->tx_seq_num << 8;
plocal_tx_pd->flags |= MRVDRV_TxPD_FLAGS_TX_PACKET_STATUS;
}
endian_convert_TxPD(plocal_tx_pd);
cmd_size += sizeof(TxPD) + data_len;
cmd->size = wlan_cpu_to_le16(cmd_size);
LEAVE();
return MLAN_STATUS_SUCCESS;
}
/** /**
* @brief This function prepares command of get_sensor_temp * @brief This function prepares command of get_sensor_temp
* *
@ -10365,3 +10469,35 @@ mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
LEAVE(); LEAVE();
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
/**
* @brief This function prepares command to configure edmac
*
* @param pmpriv A pointer to mlan_private structure
* @param cmd A pointer to HostCmd_DS_COMMAND structure
* @param cmd_action Action: GET or SET
* @param pdata_buf A pointer to data buffer
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_cmd_edmac_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf)
{
HostCmd_DS_EDMAC_CFG *edmac_cmd = &cmd->params.ed_mac_cfg;
mlan_ds_ed_mac_cfg *edmac_cfg = (mlan_ds_ed_mac_cfg *)pdata_buf;
ENTER();
cmd->command = wlan_cpu_to_le16(HostCmd_CMD_EDMAC_CFG);
cmd->size = wlan_cpu_to_le16(sizeof(mlan_ds_ed_mac_cfg) + S_DS_GEN);
edmac_cmd->ed_ctrl_2g = wlan_cpu_to_le16(edmac_cfg->ed_ctrl_2g);
edmac_cmd->ed_offset_2g = wlan_cpu_to_le16(edmac_cfg->ed_offset_2g);
edmac_cmd->ed_ctrl_5g = wlan_cpu_to_le16(edmac_cfg->ed_ctrl_5g);
edmac_cmd->ed_offset_5g = wlan_cpu_to_le16(edmac_cfg->ed_offset_5g);
edmac_cmd->ed_bitmap_txq_lock =
wlan_cpu_to_le32(edmac_cfg->ed_bitmap_txq_lock);
LEAVE();
return MLAN_STATUS_SUCCESS;
}

View file

@ -24,7 +24,7 @@
#define _MLAN_DECL_H_ #define _MLAN_DECL_H_
/** MLAN release version */ /** MLAN release version */
#define MLAN_RELEASE_VERSION "408.p2" #define MLAN_RELEASE_VERSION "423.p1"
/** Re-define generic data types for MLAN/MOAL */ /** Re-define generic data types for MLAN/MOAL */
/** Signed char (1-byte) */ /** Signed char (1-byte) */
@ -157,10 +157,6 @@ typedef t_s32 t_sval;
/** This is current limit on Maximum Rx AMPDU allowed */ /** This is current limit on Maximum Rx AMPDU allowed */
#define MLAN_MAX_RX_BASTREAM_SUPPORTED 16 #define MLAN_MAX_RX_BASTREAM_SUPPORTED 16
#ifndef UINT_MAX
#define UINT_MAX (~0U)
#endif
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
/** Default Win size attached during ADDBA request */ /** Default Win size attached during ADDBA request */
#define MLAN_STA_AMPDU_DEF_TXWINSIZE 64 #define MLAN_STA_AMPDU_DEF_TXWINSIZE 64
@ -185,6 +181,11 @@ typedef t_s32 t_sval;
#define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16 #define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16
#endif #endif
/** NAN use the same window size for tx/rx */
#define MLAN_NAN_AMPDU_DEF_TXRXWINSIZE 16
/** RX winsize for COEX */
#define MLAN_NAN_COEX_AMPDU_DEF_RXWINSIZE 16
/** Block ack timeout value */ /** Block ack timeout value */
#define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff #define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff
/** Maximum Tx Win size configured for ADDBA request [10 bits] */ /** Maximum Tx Win size configured for ADDBA request [10 bits] */
@ -273,9 +274,14 @@ typedef t_s32 t_sval;
/** pcie inband reset */ /** pcie inband reset */
#define FW_RELOAD_PCIE_INBAND_RESET 6 #define FW_RELOAD_PCIE_INBAND_RESET 6
/** auto fw reload enable */
#define AUTO_FW_RELOAD_ENABLE MBIT(0)
/** auto fw reload enable pcie inband reset */
#define AUTO_FW_RELOAD_PCIE_INBAND_RESET MBIT(1)
#ifdef PCIE #ifdef PCIE
/* Interrupt type */ /* Interrupt type */
enum { RX_DATA, RX_EVENT, TX_COMPLETE, RX_CMD_RESP }; enum { RX_DATA, RX_EVENT, TX_COMPLETE, RX_CMD_RESP, RX_CMD_DNLD };
#endif #endif
#ifdef USB #ifdef USB
#define MLAN_USB_BLOCK_SIZE (512) #define MLAN_USB_BLOCK_SIZE (512)
@ -747,6 +753,7 @@ typedef enum _mlan_bss_type {
#ifdef WIFI_DIRECT_SUPPORT #ifdef WIFI_DIRECT_SUPPORT
MLAN_BSS_TYPE_WIFIDIRECT = 2, MLAN_BSS_TYPE_WIFIDIRECT = 2,
#endif #endif
MLAN_BSS_TYPE_NAN = 4,
MLAN_BSS_TYPE_DFS = 8, MLAN_BSS_TYPE_DFS = 8,
MLAN_BSS_TYPE_ANY = 0xff, MLAN_BSS_TYPE_ANY = 0xff,
} mlan_bss_type; } mlan_bss_type;
@ -803,6 +810,8 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024, MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025, MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026, MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026,
MLAN_EVENT_ID_FW_IBSS_CONNECT = 0x00000028,
MLAN_EVENT_ID_FW_IBSS_DISCONNECT = 0x00000029,
MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B, MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B,
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
@ -845,6 +854,7 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020, MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
#endif #endif
MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023, MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023,
MLAN_EVENT_ID_NAN_STARTED = 0x80000024,
MLAN_EVENT_ID_DRV_RTT_RESULT = 0x80000025, MLAN_EVENT_ID_DRV_RTT_RESULT = 0x80000025,
MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026, MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026,
MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027, MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027,
@ -857,7 +867,9 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_DRV_DEFER_RX_EVENT = 0x80000033, MLAN_EVENT_ID_DRV_DEFER_RX_EVENT = 0x80000033,
MLAN_EVENT_ID_DRV_DEFER_CMDRESP = 0x80000034, MLAN_EVENT_ID_DRV_DEFER_CMDRESP = 0x80000034,
MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035, MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035,
MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE = 0x80000036,
#endif #endif
MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH = 0x80000037,
} mlan_event_id; } mlan_event_id;
/** Data Structures */ /** Data Structures */
@ -907,7 +919,9 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t {
#define OID_TYPE_CAL 0x2 #define OID_TYPE_CAL 0x2
#define OID_TYPE_DPD 0xa #define OID_TYPE_DPD 0xa
#define NONE_TYPE_DPD 0xb
#define UNKNOW_DPD_LENGTH 0xffffffff #define UNKNOW_DPD_LENGTH 0xffffffff
#define NONE_DPD_LENGTH 0xfafafafa
/** Custom data structure */ /** Custom data structure */
typedef struct _mlan_init_param { typedef struct _mlan_init_param {
@ -1291,7 +1305,19 @@ typedef MLAN_PACK_START struct _mc_txcontrol {
/** mc_pkt_flags */ /** mc_pkt_flags */
t_u8 mc_pkt_flags; t_u8 mc_pkt_flags;
} MLAN_PACK_END mc_txcontrol, *pmc_txcontrol; } MLAN_PACK_END mc_txcontrol, *pmc_txcontrol;
typedef MLAN_PACK_START struct MAPP_Stats_Mcast_drv {
t_u32 cycle_recv_under_2300usec;
t_u32 cycle_recv_in_time;
t_u32 cycle_recv_over_2900usec;
t_u32 cycle_recv_over_3500usec;
t_u32 cycle_recv_over_5000usec;
t_u32 cycle_recv_over_10000usec;
t_u32 cycle_recv_over_15000usec;
t_u32 spent_time_under_1000usec;
t_u32 spent_time_over_1000usec;
t_u32 spent_time_over_2000usec;
t_u32 spent_time_over_3000usec;
} MLAN_PACK_END Stats_mcast_drv_t, *pStats_mcast_drv_t;
/** mlan_buffer data structure */ /** mlan_buffer data structure */
typedef struct _mlan_buffer { typedef struct _mlan_buffer {
/** Pointer to previous mlan_buffer */ /** Pointer to previous mlan_buffer */
@ -2782,4 +2808,97 @@ MLAN_API void mlan_process_pcie_interrupt_cb(t_void *pmadapter, int type);
#define CSI_SIGNATURE 0xABCD #define CSI_SIGNATURE 0xABCD
/** secure add/sub **/
#ifndef SINT8_MAX
#define SINT8_MAX 0x7f
#endif
#ifndef SINT8_MIN
#define SINT8_MIN 0x80
#endif
#ifndef UINT8_MAX
#define UINT8_MAX 0xff
#endif
#ifndef SINT16_MAX
#define SINT16_MAX 0x7fff
#endif
#ifndef SINT16_MIN
#define SINT16_MIN 0x8000
#endif
#ifndef UINT16_MAX
#define UINT16_MAX 0xffff
#endif
#ifndef SINT32_MAX
#define SINT32_MAX 0x7fffffff
#endif
#ifndef SINT32_MIN
#define SINT32_MIN 0x80000000
#endif
#ifndef UINT32_MAX
#define UINT32_MAX 0xffffffff
#endif
#ifndef SINT64_MAX
#define SINT64_MAX 0x7fffffffffffffff
#endif
#ifndef SINT64_MIN
#define SINT64_MIN 0x8000000000000000
#endif
#ifndef UINT64_MAX
#define UINT64_MAX 0xffffffffffffffff
#endif
#ifndef PTR_MAX
#ifdef MLAN_64BIT
#define PTR_MAX UINT64_MAX
#else
#define PTR_MAX UINT32_MAX
#endif
#endif
#ifndef SINT_MAX
#ifdef MLAN_64BIT
#define SINT_MAX SINT64_MAX
#else
#define SINT_MAX SINT32_MAX
#endif
#endif
#ifndef SINT_MIN
#ifdef MLAN_64BIT
#define SINT_MIN SINT64_MIN
#else
#define SINT_MIN SINT32_MIN
#endif
#endif
#ifndef UINT_MAX
#ifdef MLAN_64BIT
#define UINT_MAX UINT64_MAX
#else
#define UINT_MAX UINT32_MAX
#endif
#endif
typedef enum {
TYPE_SINT8,
TYPE_UINT8,
TYPE_SINT16,
TYPE_UINT16,
TYPE_SINT32,
TYPE_UINT32,
TYPE_SINT64,
TYPE_UINT64,
TYPE_PTR,
} data_type;
#endif /* !_MLAN_DECL_H_ */ #endif /* !_MLAN_DECL_H_ */

View file

@ -189,6 +189,8 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
/** Event ID: Tx status */ /** Event ID: Tx status */
ENUM_ELEMENT(EVENT_TX_STATUS_REPORT, 0x0074), ENUM_ELEMENT(EVENT_TX_STATUS_REPORT, 0x0074),
ENUM_ELEMENT(EVENT_NAN_GENERIC, 0x0075),
ENUM_ELEMENT(EVENT_BT_COEX_WLAN_PARA_CHANGE, 0x0076), ENUM_ELEMENT(EVENT_BT_COEX_WLAN_PARA_CHANGE, 0x0076),
ENUM_ELEMENT(EVENT_VDLL_IND, 0x0081), ENUM_ELEMENT(EVENT_VDLL_IND, 0x0081),
@ -205,6 +207,7 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
ENUM_ELEMENT(EVENT_CSI, 0x008D), ENUM_ELEMENT(EVENT_CSI, 0x008D),
ENUM_ELEMENT(EVENT_FW_HANG_REPORT, 0x008F), ENUM_ELEMENT(EVENT_FW_HANG_REPORT, 0x008F),
ENUM_ELEMENT(EVENT_DPD_LOG, 0x0091),
/** Card Event definition : RESET PN */ /** Card Event definition : RESET PN */
ENUM_ELEMENT(EVENT_ASSOC_REQ_IE, 0x0095), ENUM_ELEMENT(EVENT_ASSOC_REQ_IE, 0x0095),
@ -215,3 +218,4 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
ENUM_ELEMENT(EVENT_IMD3_CAL_END, 0x00A1), ENUM_ELEMENT(EVENT_IMD3_CAL_END, 0x00A1),
/* Always keep this last */ /* Always keep this last */
ENUM_ELEMENT_LAST(__HostEvent_Last)

View file

@ -1219,6 +1219,10 @@ enum host_cmd_id {
#define FW_CAPINFO_EXT_CHAN_TRACK MBIT(13) #define FW_CAPINFO_EXT_CHAN_TRACK MBIT(13)
/** FW cap info bit 14: 6G Support */ /** FW cap info bit 14: 6G Support */
#define FW_CAPINFO_EXT_6G MBIT(14) #define FW_CAPINFO_EXT_6G MBIT(14)
/** FW cap info bit 16: 6G Support */
#define FW_CAPINFO_EXT_CMD_TX_DATA MBIT(16)
/** FW cap info bit 19: security rgpower table */
#define FW_CAPINFO_EXT_SEC_RG_POWER MBIT(19)
/** Check if 5G 1x1 only is supported by firmware */ /** Check if 5G 1x1 only is supported by firmware */
#define IS_FW_SUPPORT_5G_1X1_ONLY(_adapter) \ #define IS_FW_SUPPORT_5G_1X1_ONLY(_adapter) \
@ -1257,6 +1261,10 @@ enum host_cmd_id {
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_CHAN_TRACK) (_adapter->fw_cap_ext & FW_CAPINFO_EXT_CHAN_TRACK)
/** Check if 6G supported by firmware */ /** Check if 6G supported by firmware */
#define IS_FW_SUPPORT_6G(_adapter) (_adapter->fw_cap_ext & FW_CAPINFO_EXT_6G) #define IS_FW_SUPPORT_6G(_adapter) (_adapter->fw_cap_ext & FW_CAPINFO_EXT_6G)
#define IS_FW_SUPPORT_CMD_TX_DATA(_adapter) \
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_CMD_TX_DATA)
#define IS_FW_SUPPORT_SEC_RG_POWER(_adapter) \
(_adapter->fw_cap_ext & FW_CAPINFO_EXT_SEC_RG_POWER)
/** MrvlIEtypes_PrevBssid_t */ /** MrvlIEtypes_PrevBssid_t */
typedef MLAN_PACK_START struct _MrvlIEtypes_PrevBssid_t { typedef MLAN_PACK_START struct _MrvlIEtypes_PrevBssid_t {
@ -1348,6 +1356,9 @@ 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) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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*/
@ -1357,6 +1368,7 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Reg_type_t {
/** type: 0x81/0x82/0x83 */ /** type: 0x81/0x82/0x83 */
t_u8 type; t_u8 type;
} MLAN_PACK_END MrvlIEtypes_Reg_type_t; } MLAN_PACK_END MrvlIEtypes_Reg_type_t;
#endif
/* mod_grp */ /* mod_grp */
typedef enum _mod_grp { typedef enum _mod_grp {
@ -1445,7 +1457,6 @@ typedef enum _ENH_PS_MODES {
#define HostCmd_ACT_GEN_REMOVE 0x0004 #define HostCmd_ACT_GEN_REMOVE 0x0004
/** General purpose action : Reset */ /** General purpose action : Reset */
#define HostCmd_ACT_GEN_RESET 0x0005 #define HostCmd_ACT_GEN_RESET 0x0005
/** Host command action : Set Rx */ /** Host command action : Set Rx */
#define HostCmd_ACT_SET_RX 0x0001 #define HostCmd_ACT_SET_RX 0x0001
/** Host command action : Set Tx */ /** Host command action : Set Tx */
@ -1476,6 +1487,8 @@ typedef enum _ENH_PS_MODES {
#define HostCmd_RESULT_BLOCK 0x0006 #define HostCmd_RESULT_BLOCK 0x0006
/** cmd is blocked by pre_asleep */ /** cmd is blocked by pre_asleep */
#define HostCmd_RESULT_PRE_ASLEEP 0x0007 #define HostCmd_RESULT_PRE_ASLEEP 0x0007
/** rgpower_XX.bin download failed with security key mismatch */
#define HostCmd_RESULT_RGPWR_KEY_MISMATCH 0x0008
/* Define action or option for HostCmd_CMD_MAC_CONTROL */ /* Define action or option for HostCmd_CMD_MAC_CONTROL */
/** MAC action : Rx on */ /** MAC action : Rx on */
@ -1564,6 +1577,12 @@ enum host_fw_event_id {
#undef ENUM_ELEMENT #undef ENUM_ELEMENT
#undef ENUM_ELEMENT_LAST #undef ENUM_ELEMENT_LAST
enum nan_event_subtype {
NAN_EVT_SUBTYPE_SD_EVENT = 0,
NAN_EVT_SUBTYPE_NAN_STARTED = 1,
NAN_EVT_SUBTYPE_SDF_TX_DONE = 2,
};
enum wls_event_subtype { enum wls_event_subtype {
WLS_SUB_EVENT_FTM_COMPLETE = 0, WLS_SUB_EVENT_FTM_COMPLETE = 0,
WLS_SUB_EVENT_RADIO_RECEIVED = 1, WLS_SUB_EVENT_RADIO_RECEIVED = 1,
@ -1656,6 +1675,12 @@ typedef enum _tdls_error_code_e {
TDLS_PEER_STA_UNREACHABLE = 25, TDLS_PEER_STA_UNREACHABLE = 25,
} tdls_error_code_e; } tdls_error_code_e;
/** Event structure for generic events from NAN FW */
typedef MLAN_PACK_START struct _event_nan_generic {
/** NAN Event SubType */
t_u16 event_sub_type;
} MLAN_PACK_END event_nan_generic;
#define RXPD_FLAG_EXTRA_HEADER (1 << 1) #define RXPD_FLAG_EXTRA_HEADER (1 << 1)
#define RXPD_FLAG_UCAST_PKT (1 << 3) #define RXPD_FLAG_UCAST_PKT (1 << 3)
@ -5461,24 +5486,11 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CHAN_REGION_CFG {
t_u16 action; t_u16 action;
} MLAN_PACK_END HostCmd_DS_CHAN_REGION_CFG; } MLAN_PACK_END HostCmd_DS_CHAN_REGION_CFG;
/** HostCmd_CMD_CW_MODE_CTRL */ /** HostCmd_DS_REGION_POWER_CFG */
typedef MLAN_PACK_START struct _HostCmd_DS_CW_MODE_CTRL { typedef MLAN_PACK_START struct _HostCmd_DS_REGION_POWER_CFG {
/** Action for CW Tone Control */ /** Action */
t_u16 action; t_u16 action;
/** Mode of Operation 0: Disbale 1: Tx Continuous Packet 2: Tx } MLAN_PACK_END HostCmd_DS_REGION_POWER_CFG;
* Continuous Wave */
t_u8 mode;
/** channel */
t_u8 channel;
/** channel info*/
t_u8 chanInfo;
/** Tx Power level in dBm */
t_u16 txPower;
/** Packet Length */
t_u16 pktLength;
/** bit rate Info */
t_u32 rateInfo;
} MLAN_PACK_END HostCmd_DS_CW_MODE_CTRL;
/** HostCmd_CMD_802_11_RF_ANTENNA */ /** HostCmd_CMD_802_11_RF_ANTENNA */
typedef MLAN_PACK_START struct _HostCmd_DS_802_11_RF_ANTENNA { typedef MLAN_PACK_START struct _HostCmd_DS_802_11_RF_ANTENNA {
@ -5621,6 +5633,18 @@ typedef MLAN_PACK_START struct _HostCmd_DS_REG_ACCESS {
t_u32 value; t_u32 value;
} MLAN_PACK_END HostCmd_DS_REG_ACCESS; } MLAN_PACK_END HostCmd_DS_REG_ACCESS;
/** Type defination of HostCmd_gpio_cfg_ops */
typedef MLAN_PACK_START struct _HostCmd_gpio_cfg_ops {
/** Get or Set action */
t_u8 action;
/** Operation type */
t_u8 opsType;
/** pin number */
t_u8 pin_num;
/** pin value */
t_u8 value;
} MLAN_PACK_END HostCmd_gpio_cfg_ops;
/** HostCmd_DS_TARGET_ACCESS */ /** HostCmd_DS_TARGET_ACCESS */
typedef MLAN_PACK_START struct _HostCmd_DS_TARGET_ACCESS { typedef MLAN_PACK_START struct _HostCmd_DS_TARGET_ACCESS {
/** Action */ /** Action */
@ -5887,23 +5911,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_MacAddr_t {
t_u8 mac[MLAN_MAC_ADDR_LENGTH]; t_u8 mac[MLAN_MAC_ADDR_LENGTH];
} MLAN_PACK_END MrvlIEtypes_MacAddr_t; } MLAN_PACK_END MrvlIEtypes_MacAddr_t;
/** Assoc Request */
#define SUBTYPE_ASSOC_REQUEST 0
/** ReAssoc Request */
#define SUBTYPE_REASSOC_REQUEST 2
/** Probe Resp */
#define SUBTYPE_PROBE_RESP 5
/** Disassoc Request */
#define SUBTYPE_DISASSOC 10
/** Auth Request */
#define SUBTYPE_AUTH 11
/** Deauth Request */
#define SUBTYPE_DEAUTH 12
/** Action frame */
#define SUBTYPE_ACTION 13
/** beacon */
#define SUBTYPE_BEACON 8
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
/** TLV type : AP Channel band Config */ /** TLV type : AP Channel band Config */
#define TLV_TYPE_UAP_CHAN_BAND_CONFIG \ #define TLV_TYPE_UAP_CHAN_BAND_CONFIG \
@ -7753,6 +7760,36 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_CCK_DESENSE_CFG {
t_u8 num_off_intervals; t_u8 num_off_intervals;
} MLAN_PACK_END HostCmd_DS_CMD_CCK_DESENSE_CFG; } MLAN_PACK_END HostCmd_DS_CMD_CCK_DESENSE_CFG;
/** HostCmd_DS_80211_TX_FRAME */
typedef MLAN_PACK_START struct _HostCmd_DS_80211_TX_FRAME {
/** Action Set or get */
t_u16 action;
/** status */
t_u16 status;
/** BandConfig */
t_u8 band_config;
/** channel */
t_u8 channel;
/** reserved */
t_u32 reserved;
/** buffer include TxPD and full Tx packet */
t_u8 buffer[];
} MLAN_PACK_END HostCmd_DS_80211_TX_FRAME;
/* edmac configuration: HostCmd_DS_EDMAC_CFG*/
typedef MLAN_PACK_START struct _HostCmd_DS_EDMAC_CFG {
/** EU adaptivity for 2.4ghz band */
t_u16 ed_ctrl_2g;
/** Energy detect threshold offset for 2.4ghz */
t_s16 ed_offset_2g;
/** EU adaptivity for 5ghz band */
t_u16 ed_ctrl_5g;
/** Energy detect threshold offset for 5ghz */
t_s16 ed_offset_5g;
t_u32 ed_bitmap_txq_lock;
} MLAN_PACK_END HostCmd_DS_EDMAC_CFG;
/** HostCmd_DS_COMMAND */ /** HostCmd_DS_COMMAND */
typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
/** Command Header : Command */ /** Command Header : Command */
@ -7809,8 +7846,6 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
/** RF antenna */ /** RF antenna */
HostCmd_DS_802_11_RF_ANTENNA antenna; HostCmd_DS_802_11_RF_ANTENNA antenna;
/** CW Mode: Tx CW Level control */
HostCmd_DS_CW_MODE_CTRL cwmode;
/** Enhanced power save command */ /** Enhanced power save command */
HostCmd_DS_802_11_PS_MODE_ENH psmode_enh; HostCmd_DS_802_11_PS_MODE_ENH psmode_enh;
HostCmd_DS_802_11_HS_CFG_ENH opt_hs_cfg; HostCmd_DS_802_11_HS_CFG_ENH opt_hs_cfg;
@ -7988,6 +8023,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
HostCmd_DS_802_11_PS_INACTIVITY_TIMEOUT ps_inact_tmo; HostCmd_DS_802_11_PS_INACTIVITY_TIMEOUT ps_inact_tmo;
HostCmd_DS_ROAM_OFFLOAD roam_offload; HostCmd_DS_ROAM_OFFLOAD roam_offload;
HostCmd_DS_CHAN_REGION_CFG reg_cfg; HostCmd_DS_CHAN_REGION_CFG reg_cfg;
HostCmd_DS_REGION_POWER_CFG rg_power_cfg;
HostCmd_DS_AUTO_TX auto_tx; HostCmd_DS_AUTO_TX auto_tx;
HostCmd_DS_FTM_CONFIG_SESSION_PARAMS ftm_config; HostCmd_DS_FTM_CONFIG_SESSION_PARAMS ftm_config;
HostCmd_DS_FTM_CONFIG_RESPONDER ftm_rtt_responder; HostCmd_DS_FTM_CONFIG_RESPONDER ftm_rtt_responder;
@ -8038,6 +8074,10 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
HostCmd_DS_STATS stats; HostCmd_DS_STATS stats;
HostCmd_DS_GET_CH_LOAD ch_load; HostCmd_DS_GET_CH_LOAD ch_load;
HostCmd_DS_CROSS_CHIP_SYNCH cross_chip_synch; HostCmd_DS_CROSS_CHIP_SYNCH cross_chip_synch;
HostCmd_DS_80211_TX_FRAME tx_frame;
HostCmd_DS_EDMAC_CFG ed_mac_cfg;
HostCmd_gpio_cfg_ops gpio_cfg_ops;
} params; } params;
} MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND; } MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND;
@ -8082,13 +8122,15 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Secure_Boot_Uuid_t {
#define VDLL_IND_TYPE_ERR_SIG 2 #define VDLL_IND_TYPE_ERR_SIG 2
/** notify vdll download error: ID error */ /** notify vdll download error: ID error */
#define VDLL_IND_TYPE_ERR_ID 3 #define VDLL_IND_TYPE_ERR_ID 3
/** notify vdll download error: Secure error */
#define VDLL_IND_TYPE_SEC_ERR_ID 4
/** vdll indicate event structure */ /** vdll indicate event structure */
typedef MLAN_PACK_START struct _vdll_ind { typedef MLAN_PACK_START struct _vdll_ind {
/*VDLL ind type*/ /*VDLL ind type*/
t_u16 type; t_u16 type;
/*reserved*/ /*vdllId*/
t_u16 reserved; t_u16 vdllId;
/*indicate the offset downloaded so far*/ /*indicate the offset downloaded so far*/
t_u32 offset; t_u32 offset;
/*VDLL block size*/ /*VDLL block size*/

View file

@ -73,13 +73,13 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
/** Host Command ID : 802.11 Ad-Hoc join */ /** Host Command ID : 802.11 Ad-Hoc join */
ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_JOIN, 0x002c), ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_JOIN, 0x002c),
/** Host Command ID: CW Mode */
ENUM_ELEMENT(HostCmd_CMD_CW_MODE_CTRL, 0x0239),
/** Host Command ID : 802.11 key material */ /** Host Command ID : 802.11 key material */
ENUM_ELEMENT(HostCmd_CMD_802_11_KEY_MATERIAL, 0x005e), ENUM_ELEMENT(HostCmd_CMD_802_11_KEY_MATERIAL, 0x005e),
/** Host Command ID : 802.11 Ad-Hoc stop */ /** Host Command ID : 802.11 Ad-Hoc stop */
ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_STOP, 0x0040), ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_STOP, 0x0040),
/** Host Command ID : GPIO Configuration */
ENUM_ELEMENT(HostCmd_CMD_GPIO_CFG, 0x0041),
/** Host Command ID : 802.22 MAC address */ /** Host Command ID : 802.22 MAC address */
ENUM_ELEMENT(HostCmd_CMD_802_11_MAC_ADDRESS, 0x004D), ENUM_ELEMENT(HostCmd_CMD_802_11_MAC_ADDRESS, 0x004D),
@ -199,6 +199,8 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
/** Host Command ID :EAPOL PKT */ /** Host Command ID :EAPOL PKT */
ENUM_ELEMENT(HostCmd_CMD_802_11_EAPOL_PKT, 0x012e), ENUM_ELEMENT(HostCmd_CMD_802_11_EAPOL_PKT, 0x012e),
ENUM_ELEMENT(HostCmd_CMD_EDMAC_CFG, 0x0130),
/** Host Command ID :MIMO SWITCH **/ /** Host Command ID :MIMO SWITCH **/
ENUM_ELEMENT(HostCmd_CMD_802_11_MIMO_SWITCH, 0x0235), ENUM_ELEMENT(HostCmd_CMD_802_11_MIMO_SWITCH, 0x0235),
@ -375,6 +377,17 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
/** Host Command ID: Get sensor temp*/ /** Host Command ID: Get sensor temp*/
ENUM_ELEMENT(HostCmd_CMD_DS_GET_SENSOR_TEMP, 0x0227), ENUM_ELEMENT(HostCmd_CMD_DS_GET_SENSOR_TEMP, 0x0227),
/** Host Command ID: NAN Parameters cofiguration */
ENUM_ELEMENT(HostCmd_CMD_NAN_PARAMS_CONFIG, 0x0228),
/** Host Command ID: NAN mode cofiguration */
ENUM_ELEMENT(HostCmd_CMD_NAN_MODE_CONFIG, 0x0229),
/** Host Command ID: NAN service discovery functionality */
ENUM_ELEMENT(HostCmd_CMD_NAN_SDF, 0x022a),
/** Host Command ID: NAN service hash */
ENUM_ELEMENT(HostCmd_CMD_NAN_SERVICE_HASH, 0x022b),
/** Host Command ID: NAN service state info (get/set) */
ENUM_ELEMENT(HostCmd_CMD_NAN_STATE_INFO, 0x022c),
/** Host Command ID : Configure ADHOC_OVER_IP parameters */ /** Host Command ID : Configure ADHOC_OVER_IP parameters */
ENUM_ELEMENT(HostCmd_CMD_WMM_PARAM_CONFIG, 0x023a), ENUM_ELEMENT(HostCmd_CMD_WMM_PARAM_CONFIG, 0x023a),
@ -446,4 +459,8 @@ ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003),
ENUM_ELEMENT(HostCmd_CMD_OFDM_DESENSE_CFG, 0x027f), ENUM_ELEMENT(HostCmd_CMD_OFDM_DESENSE_CFG, 0x027f),
ENUM_ELEMENT(HostCmd_CMD_NAV_MITIGATION_CFG, 0x0282), ENUM_ELEMENT(HostCmd_CMD_NAV_MITIGATION_CFG, 0x0282),
/** Host Command ID: Tx Frame */
ENUM_ELEMENT(HostCmd_CMD_802_11_TX_FRAME, 0x0283),
/* Always keep this last */ /* Always keep this last */
ENUM_ELEMENT_LAST(__HostCmd_CMD_Last)

View file

@ -319,6 +319,27 @@ typedef MLAN_PACK_START struct {
t_u8 variablep[]; t_u8 variablep[];
} MLAN_PACK_END IEEEtypes_assoc_req; } MLAN_PACK_END IEEEtypes_assoc_req;
/** Assoc Request */
#define SUBTYPE_ASSOC_REQUEST 0
/** Assoc Response */
#define SUBTYPE_ASSOC_RESP 1
/** ReAssoc Request */
#define SUBTYPE_REASSOC_REQUEST 2
/** ReAssoc Request */
#define SUBTYPE_REASSOC_RESP 3
/** Probe Resp */
#define SUBTYPE_PROBE_RESP 5
/** Disassoc Request */
#define SUBTYPE_DISASSOC 10
/** Auth Request */
#define SUBTYPE_AUTH 11
/** Deauth Request */
#define SUBTYPE_DEAUTH 12
/** Action frame */
#define SUBTYPE_ACTION 13
/** beacon */
#define SUBTYPE_BEACON 8
/*Mgmt frame*/ /*Mgmt frame*/
typedef MLAN_PACK_START struct { typedef MLAN_PACK_START struct {
/** frame control */ /** frame control */

View file

@ -975,6 +975,7 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter)
pmadapter->pcard_pcie->txbd_rdptr = 0; pmadapter->pcard_pcie->txbd_rdptr = 0;
pmadapter->pcard_pcie->rxbd_rdptr = 0; pmadapter->pcard_pcie->rxbd_rdptr = 0;
pmadapter->pcard_pcie->evtbd_rdptr = 0; pmadapter->pcard_pcie->evtbd_rdptr = 0;
pmadapter->pcard_pcie->txbd_pending = 0;
#if defined(PCIE8997) || defined(PCIE8897) #if defined(PCIE8997) || defined(PCIE8897)
if (!pmadapter->pcard_pcie->reg->use_adma) { if (!pmadapter->pcard_pcie->reg->use_adma) {
pmadapter->pcard_pcie->rxbd_wrptr = pmadapter->pcard_pcie->rxbd_wrptr =
@ -984,11 +985,15 @@ 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 (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;
pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD; pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD;
pmadapter->pcard_pcie->last_write_index_with_irq =
0xffffffff;
} }
#endif
} }
#endif #endif
LEAVE(); LEAVE();

View file

@ -89,6 +89,7 @@ enum _mlan_ioctl_req_id {
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
MLAN_OID_ACTION_CHAN_SWITCH = 0x0002001E, MLAN_OID_ACTION_CHAN_SWITCH = 0x0002001E,
#endif #endif
MLAN_OID_BSS_HOST_MLME = 0x0002001F,
/* Radio Configuration Group */ /* Radio Configuration Group */
MLAN_IOCTL_RADIO_CFG = 0x00030000, MLAN_IOCTL_RADIO_CFG = 0x00030000,
@ -376,6 +377,10 @@ enum _mlan_ioctl_req_id {
MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F, MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F,
MLAN_OID_MISC_NAV_MITIGATION = 0x00200090, MLAN_OID_MISC_NAV_MITIGATION = 0x00200090,
MLAN_OID_MISC_LED_CONFIG = 0x00200091, MLAN_OID_MISC_LED_CONFIG = 0x00200091,
MLAN_OID_MISC_TX_FRAME = 0x00200092,
MLAN_OID_MISC_EDMAC_CONFIG = 0x00200093,
MLAN_OID_MISC_GPIO_CFG = 0x00200094,
MLAN_OID_MISC_REGION_POWER_CFG = 0x00200095,
}; };
/** Sub command size */ /** Sub command size */
@ -390,7 +395,6 @@ enum _mlan_act_ioctl {
MLAN_ACT_RESET, MLAN_ACT_RESET,
MLAN_ACT_DEFAULT MLAN_ACT_DEFAULT
}; };
/** Enumeration for generic enable/disable */ /** Enumeration for generic enable/disable */
enum _mlan_act_generic { MLAN_ACT_DISABLE = 0, MLAN_ACT_ENABLE = 1 }; enum _mlan_act_generic { MLAN_ACT_DISABLE = 0, MLAN_ACT_ENABLE = 1 };
@ -1965,6 +1969,9 @@ typedef struct _mlan_fw_info {
/* higher 8 bytes of uuid */ /* higher 8 bytes of uuid */
t_u64 uuid_hi; t_u64 uuid_hi;
/* FW support tx data by cmd */
t_u8 cmd_tx_data;
t_u8 sec_rgpower;
} mlan_fw_info, *pmlan_fw_info; } mlan_fw_info, *pmlan_fw_info;
/** Version string buffer length */ /** Version string buffer length */
@ -4104,7 +4111,9 @@ typedef struct _mlan_ds_11ax_llde_cmd {
t_u8 triggerlimit; // cap airtime limit index: auto=0xff t_u8 triggerlimit; // cap airtime limit index: auto=0xff
t_u8 peakULrate; // cap peak UL rate t_u8 peakULrate; // cap peak UL rate
t_u8 dl_llde; // Downlink LLDE: enable=1,disable=0 t_u8 dl_llde; // Downlink LLDE: enable=1,disable=0
t_u16 triggerinterval; // Set trigger frame interval(us): auto=0 t_u16 pollinterval; // Set trigger frame interval(us): auto=0
t_u16 txOpDuration; // Set TxOp duration
t_u16 llde_ctrl; // for other configurations
t_u16 mu_rts_successcnt; t_u16 mu_rts_successcnt;
t_u16 mu_rts_failcnt; t_u16 mu_rts_failcnt;
t_u16 basic_trigger_successcnt; t_u16 basic_trigger_successcnt;
@ -4286,11 +4295,20 @@ enum _mlan_reg_type {
MLAN_REG_CAU = 5, MLAN_REG_CAU = 5,
MLAN_REG_PSU = 6, MLAN_REG_PSU = 6,
MLAN_REG_BCA = 7, MLAN_REG_BCA = 7,
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \
defined(SD9177)
MLAN_REG_CIU = 8, MLAN_REG_CIU = 8,
#endif
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
MLAN_REG_MAC2 = 0x81, MLAN_REG_MAC2 = 0x81,
MLAN_REG_BBP2 = 0x82, MLAN_REG_BBP2 = 0x82,
MLAN_REG_RF2 = 0x83, MLAN_REG_RF2 = 0x83,
MLAN_REG_BCA2 = 0x87 MLAN_REG_BCA2 = 0x87
#endif
}; };
/** Type definition of mlan_ds_reg_rw for MLAN_OID_REG_RW */ /** Type definition of mlan_ds_reg_rw for MLAN_OID_REG_RW */
@ -4490,6 +4508,26 @@ typedef struct _mlan_ds_misc_cmd {
t_u8 cmd[MRVDRV_SIZE_OF_CMD_BUFFER]; t_u8 cmd[MRVDRV_SIZE_OF_CMD_BUFFER];
} mlan_ds_misc_cmd; } mlan_ds_misc_cmd;
/** Type definition of mlan_ds_misc_tx_frame for MLAN_OID_MISC_TX_FRAME */
typedef struct _mlan_ds_misc_tx_frame {
/** Band Configuration */
Band_Config_t bandcfg;
/** channel */
t_u8 channel;
/** Buffer type: data, cmd, event etc. */
mlan_buf_type buf_type;
/** QoS priority */
t_u32 priority;
/** Flags for this buffer */
t_u32 flags;
/** tx_seq_num */
t_u32 tx_seq_num;
/** tx_buf length */
t_u16 data_len;
/** Tx buffer */
t_u8 tx_buf[MRVDRV_SIZE_OF_CMD_BUFFER];
} mlan_ds_misc_tx_frame;
/** Maximum number of system clocks */ /** Maximum number of system clocks */
#define MLAN_MAX_CLK_NUM 16 #define MLAN_MAX_CLK_NUM 16
@ -4766,6 +4804,18 @@ typedef struct _mlan_ds_misc_country_code {
t_u8 country_code[COUNTRY_CODE_LEN]; t_u8 country_code[COUNTRY_CODE_LEN];
} mlan_ds_misc_country_code; } mlan_ds_misc_country_code;
/** Type defination of mlan_ds_gpio_cfg_ops */
typedef struct _mlan_ds_gpio_cfg_ops {
/** Get or Set action */
t_u8 action;
/** Operation type */
t_u8 opsType;
/** pin number */
t_u8 pin_num;
/** pin value */
t_u8 value;
} mlan_ds_gpio_cfg_ops;
/** action for set */ /** action for set */
#define SUBSCRIBE_EVT_ACT_BITWISE_SET 0x0002 #define SUBSCRIBE_EVT_ACT_BITWISE_SET 0x0002
/** action for clear */ /** action for clear */
@ -5490,22 +5540,6 @@ typedef MLAN_PACK_START struct _mlan_ds_misc_tx_rx_histogram {
t_u8 value[1]; t_u8 value[1];
} MLAN_PACK_END mlan_ds_misc_tx_rx_histogram; } MLAN_PACK_END mlan_ds_misc_tx_rx_histogram;
typedef MLAN_PACK_START struct _mlan_ds_cw_mode_ctrl {
/** Mode of Operation 0: Disable 1: Tx Continuous Packet 2: Tx
* Continuous Wave */
t_u8 mode;
/*channel*/
t_u8 channel;
/* channel info*/
t_u8 chanInfo;
/** Tx Power level in dBm */
t_u16 txPower;
/** Packet Length */
t_u16 pktLength;
/** bit rate Info */
t_u32 rateInfo;
} MLAN_PACK_END mlan_ds_cw_mode_ctrl;
#define RX_PKT_INFO MBIT(1) #define RX_PKT_INFO MBIT(1)
/** Struct for per-packet configuration */ /** Struct for per-packet configuration */
typedef struct _mlan_per_pkt_cfg { typedef struct _mlan_per_pkt_cfg {
@ -6124,6 +6158,20 @@ typedef struct _mlan_ds_reorder_flush_time {
t_u16 flush_time_ac_vi_vo; t_u16 flush_time_ac_vi_vo;
} mlan_ds_reorder_flush_time; } mlan_ds_reorder_flush_time;
/** EDMAC configuration parameters */
typedef struct _mlan_ds_ed_mac_cfg {
/** EU adaptivity for 2.4ghz band */
t_u16 ed_ctrl_2g;
/** Energy detect threshold offset for 2.4ghz */
t_s16 ed_offset_2g;
/** EU adaptivity for 5ghz band */
t_u16 ed_ctrl_5g;
/** Energy detect threshold offset for 5ghz */
t_s16 ed_offset_5g;
t_u32 ed_bitmap_txq_lock;
} mlan_ds_ed_mac_cfg;
/** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */ /** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */
typedef struct _mlan_ds_misc_cfg { typedef struct _mlan_ds_misc_cfg {
/** Sub-command */ /** Sub-command */
@ -6140,6 +6188,8 @@ typedef struct _mlan_ds_misc_cfg {
#endif #endif
/** Hostcmd for MLAN_OID_MISC_HOST_CMD */ /** Hostcmd for MLAN_OID_MISC_HOST_CMD */
mlan_ds_misc_cmd hostcmd; mlan_ds_misc_cmd hostcmd;
/** tx_frame for MLAN_OID_MISC_TX_FRAME */
mlan_ds_misc_tx_frame tx_frame;
/** System clock for MLAN_OID_MISC_SYS_CLOCK */ /** System clock for MLAN_OID_MISC_SYS_CLOCK */
mlan_ds_misc_sys_clock sys_clock; mlan_ds_misc_sys_clock sys_clock;
/** WWS set/get for MLAN_OID_MISC_WWS */ /** WWS set/get for MLAN_OID_MISC_WWS */
@ -6241,7 +6291,6 @@ typedef struct _mlan_ds_misc_cfg {
mlan_ds_misc_keep_alive keep_alive; mlan_ds_misc_keep_alive keep_alive;
mlan_ds_misc_keep_alive_rx keep_alive_rx; mlan_ds_misc_keep_alive_rx keep_alive_rx;
mlan_ds_misc_tx_rx_histogram tx_rx_histogram; mlan_ds_misc_tx_rx_histogram tx_rx_histogram;
mlan_ds_cw_mode_ctrl cwmode;
/** Tx/Rx per-packet control */ /** Tx/Rx per-packet control */
t_u8 txrx_pkt_ctrl; t_u8 txrx_pkt_ctrl;
mlan_ds_misc_robustcoex_params robustcoexparams; mlan_ds_misc_robustcoex_params robustcoexparams;
@ -6294,6 +6343,8 @@ typedef struct _mlan_ds_misc_cfg {
mlan_ds_ch_load ch_load; mlan_ds_ch_load ch_load;
mlan_ds_cross_chip_synch cross_chip_synch; mlan_ds_cross_chip_synch cross_chip_synch;
mlan_ds_reorder_flush_time flush_time; mlan_ds_reorder_flush_time flush_time;
mlan_ds_ed_mac_cfg edmac_cfg;
mlan_ds_gpio_cfg_ops gpio_cfg_ops;
} param; } param;
} mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg;

View file

@ -839,6 +839,14 @@ static int wlan_update_rsn_ie(mlan_private *pmpriv,
ap_mfpc = ((*prsn_cap & (0x1 << MFPC_BIT)) == (0x1 << MFPC_BIT)); ap_mfpc = ((*prsn_cap & (0x1 << MFPC_BIT)) == (0x1 << MFPC_BIT));
ap_mfpr = ((*prsn_cap & (0x1 << MFPR_BIT)) == (0x1 << MFPR_BIT)); ap_mfpr = ((*prsn_cap & (0x1 << MFPR_BIT)) == (0x1 << MFPR_BIT));
/* Check for negative case
* If WPA3SAE AP has PMF=0, block the association */
if ((*akm_type == AssocAgentAuth_Wpa3Sae) && (!ap_mfpc && !ap_mfpr)) {
PRINTM(MERROR,
"RSNE: WPA3-SAE AP with incorrect PMF setting, can't associate to AP\n");
return MLAN_STATUS_FAILURE;
}
if ((!ap_mfpc && !ap_mfpr && pmpriv->pmfcfg.mfpr) || if ((!ap_mfpc && !ap_mfpr && pmpriv->pmfcfg.mfpr) ||
((!ap_mfpc) && ap_mfpr) || ((!ap_mfpc) && ap_mfpr) ||
(ap_mfpc && ap_mfpr && (!pmpriv->pmfcfg.mfpc))) { (ap_mfpc && ap_mfpr && (!pmpriv->pmfcfg.mfpc))) {
@ -1627,21 +1635,22 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv,
assoc_logger_data *assoc_succ; assoc_logger_data *assoc_succ;
mlan_ds_bss *bss; mlan_ds_bss *bss;
IEEEtypes_MgmtHdr_t *hdr; IEEEtypes_MgmtHdr_t *hdr;
t_u16 sub_type = 0;
ENTER(); ENTER();
if (pmpriv->curr_bss_params.host_mlme) {
hdr = (IEEEtypes_MgmtHdr_t *)&resp->params; hdr = (IEEEtypes_MgmtHdr_t *)&resp->params;
sub_type = IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(hdr->FrmCtl);
if (!memcmp(pmpriv->adapter, hdr->BssId, if (!memcmp(pmpriv->adapter, hdr->BssId,
pmpriv->pattempted_bss_desc->mac_address, pmpriv->pattempted_bss_desc->mac_address,
MLAN_MAC_ADDR_LENGTH)) MLAN_MAC_ADDR_LENGTH) &&
passoc_rsp = (IEEEtypes_AssocRsp_t ((sub_type == SUBTYPE_ASSOC_RESP) ||
*)((t_u8 *)(&resp->params) + (sub_type == SUBTYPE_REASSOC_RESP))) {
passoc_rsp =
(IEEEtypes_AssocRsp_t *)((t_u8 *)(&resp->params) +
sizeof(IEEEtypes_MgmtHdr_t)); sizeof(IEEEtypes_MgmtHdr_t));
else pmpriv->curr_bss_params.host_mlme = MTRUE;
passoc_rsp = (IEEEtypes_AssocRsp_t *)&resp->params;
} else } else
passoc_rsp = (IEEEtypes_AssocRsp_t *)&resp->params; passoc_rsp = (IEEEtypes_AssocRsp_t *)&resp->params;
passoc_rsp->status_code = wlan_le16_to_cpu(passoc_rsp->status_code); passoc_rsp->status_code = wlan_le16_to_cpu(passoc_rsp->status_code);
if (pmpriv->media_connected == MTRUE) if (pmpriv->media_connected == MTRUE)
@ -2185,6 +2194,19 @@ mlan_status wlan_cmd_802_11_ad_hoc_start(mlan_private *pmpriv,
wlan_cpu_to_le16(prsn_ie_tlv->header.len); wlan_cpu_to_le16(prsn_ie_tlv->header.len);
} }
if (pmpriv->curr_bss_params.host_mlme) {
MrvlIEtypes_HostMlme_t *host_mlme_tlv =
(MrvlIEtypes_HostMlme_t *)pos;
host_mlme_tlv->header.type =
wlan_cpu_to_le16(TLV_TYPE_HOST_MLME);
host_mlme_tlv->header.len = sizeof(host_mlme_tlv->host_mlme);
host_mlme_tlv->host_mlme = MTRUE;
pos += sizeof(host_mlme_tlv->header) +
host_mlme_tlv->header.len;
cmd_append_size += sizeof(MrvlIEtypes_HostMlme_t);
host_mlme_tlv->header.len =
wlan_cpu_to_le16(host_mlme_tlv->header.len);
}
cmd->size = (t_u16)wlan_cpu_to_le16( cmd->size = (t_u16)wlan_cpu_to_le16(
(t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_START) + S_DS_GEN + (t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_START) + S_DS_GEN +
cmd_append_size)); cmd_append_size));
@ -2480,6 +2502,20 @@ mlan_status wlan_cmd_802_11_ad_hoc_join(mlan_private *pmpriv,
} }
} }
if (pmpriv->curr_bss_params.host_mlme) {
MrvlIEtypes_HostMlme_t *host_mlme_tlv =
(MrvlIEtypes_HostMlme_t *)pos;
host_mlme_tlv->header.type =
wlan_cpu_to_le16(TLV_TYPE_HOST_MLME);
host_mlme_tlv->header.len = sizeof(host_mlme_tlv->host_mlme);
host_mlme_tlv->host_mlme = MTRUE;
pos += sizeof(host_mlme_tlv->header) +
host_mlme_tlv->header.len;
cmd_append_size += sizeof(MrvlIEtypes_HostMlme_t);
host_mlme_tlv->header.len =
wlan_cpu_to_le16(host_mlme_tlv->header.len);
}
cmd->size = (t_u16)wlan_cpu_to_le16( cmd->size = (t_u16)wlan_cpu_to_le16(
(t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_JOIN) + S_DS_GEN + (t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_JOIN) + S_DS_GEN +
cmd_append_size)); cmd_append_size));

View file

@ -560,7 +560,14 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);
#ifdef SDIO #ifdef SDIO
#define MAX_SUPPORT_AMSDU_SIZE 4096 #define MAX_SUPPORT_AMSDU_SIZE 4096
/** 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) || \
defined(SD8987) || defined(SD9098) || defined(SD9097) || \
defined(SDIW624) || defined(SD8978) || defined(SD9177)
#define MAX_MP_REGS 196 #define MAX_MP_REGS 196
#else
/* upto 0xB7 */
#define MAX_MP_REGS 184
#endif
/** Maximum port */ /** Maximum port */
#define MAX_PORT 32 #define MAX_PORT 32
/** Maximum port 16 */ /** Maximum port 16 */
@ -2189,6 +2196,8 @@ typedef struct _mlan_pcie_card {
t_u32 pcie_int_mode; t_u32 pcie_int_mode;
/** PCIE function number */ /** PCIE function number */
t_u8 func_num; t_u8 func_num;
/** rx interrupt pending */
t_u8 rx_pending;
/** pending num of tx ring buffer in firmware */ /** pending num of tx ring buffer in firmware */
t_u8 txbd_pending; t_u8 txbd_pending;
/** Write pointer for TXBD ring */ /** Write pointer for TXBD ring */
@ -2252,8 +2261,11 @@ typedef struct _mlan_pcie_card {
mlan_buffer *cmdrsp_buf; mlan_buffer *cmdrsp_buf;
/** Command buffer */ /** Command buffer */
mlan_buffer *vdll_cmd_buf; mlan_buffer *vdll_cmd_buf;
/** last write index where we have tx_done interrupt enabled */
t_u32 last_write_index_with_irq;
/** last tx_pkt_size */ /** last tx_pkt_size */
t_u32 last_tx_pkt_size[MLAN_MAX_TXRX_BD]; t_u32 last_tx_pkt_size[MLAN_MAX_TXRX_BD];
} mlan_pcie_card, *pmlan_pcie_card; } mlan_pcie_card, *pmlan_pcie_card;
#endif #endif
@ -2351,6 +2363,16 @@ struct _mlan_adapter {
#ifdef PCIE #ifdef PCIE
/** rx data lock to synchronize wlan_pcie_process_recv_data */ /** rx data lock to synchronize wlan_pcie_process_recv_data */
t_void *pmlan_rx_lock; t_void *pmlan_rx_lock;
/** PCIe rx process */
t_u8 pcie_rx_processing;
/** PCIe event process */
t_u8 pcie_event_processing;
/** PCIe tx process */
t_u8 pcie_tx_processing;
/** pcie cmd_dnld_int flag */
t_u8 pcie_cmd_dnld_int;
/** more_tx_task_flag */
t_u32 more_tx_task_flag;
/** tx data lock to synchronize send_data and send_data_complete */ /** tx data lock to synchronize send_data and send_data_complete */
t_void *pmlan_tx_lock; t_void *pmlan_tx_lock;
/** event lock to synchronize process_event and event_ready */ /** event lock to synchronize process_event and event_ready */
@ -2424,9 +2446,13 @@ struct _mlan_adapter {
t_u32 fw_cap_info; t_u32 fw_cap_info;
/** Extended firmware capability information */ /** Extended firmware capability information */
t_u32 fw_cap_ext; t_u32 fw_cap_ext;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
defined(SDIW624) || 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;
#endif
/** vdll ctrl */ /** vdll ctrl */
vdll_dnld_ctrl vdll_ctrl; vdll_dnld_ctrl vdll_ctrl;
#if defined(SDIO) || defined(PCIE) #if defined(SDIO) || defined(PCIE)
@ -2731,6 +2757,8 @@ struct _mlan_adapter {
t_u8 wakeup_fw_timer_is_set; t_u8 wakeup_fw_timer_is_set;
/** Number of wake up timeouts */ /** Number of wake up timeouts */
t_u32 pm_wakeup_timeout; t_u32 pm_wakeup_timeout;
/** Card wakeup flag */
t_u8 pm_wakeup_flag;
/** Host Sleep configured flag */ /** Host Sleep configured flag */
t_u8 is_hs_configured; t_u8 is_hs_configured;
@ -2988,6 +3016,21 @@ static inline t_u8 wlan_is_tx_pending(mlan_adapter *pmadapter)
return MFALSE; return MFALSE;
} }
/**
* @brief check if Rx pending
*
* @param pmadapter Pointer to mlan_adapter
* @return MTRUE/MFALSE;
*/
static inline t_u8 wlan_is_rx_pending(mlan_adapter *pmadapter)
{
#ifdef PCIE
if (IS_PCIE(pmadapter->card_type) && pmadapter->pcard_pcie->rx_pending)
return MTRUE;
#endif
return MFALSE;
}
/** process host cmd */ /** process host cmd */
mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter, mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
@ -3168,6 +3211,11 @@ t_void wlan_process_bypass_tx(mlan_adapter *pmadapter);
t_void wlan_cleanup_bypass_txq(pmlan_private priv); t_void wlan_cleanup_bypass_txq(pmlan_private priv);
t_u8 wlan_bypass_tx_list_empty(mlan_adapter *pmadapter); t_u8 wlan_bypass_tx_list_empty(mlan_adapter *pmadapter);
mlan_status wlan_misc_ioctl_tx_frame(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_tx_frame(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf);
/** Check if this is the last packet */ /** Check if this is the last packet */
t_u8 wlan_check_last_packet_indication(pmlan_private priv); t_u8 wlan_check_last_packet_indication(pmlan_private priv);
@ -3986,12 +4034,6 @@ mlan_status wlan_cmd_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd,
mlan_status wlan_ret_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_status wlan_ret_mac_control(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf); mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_cw_mode_ctrl(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_ret_cw_mode_ctrl(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf);
mlan_status wlan_cmd_802_11_radio_control(pmlan_private pmpriv, mlan_status wlan_cmd_802_11_radio_control(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf); t_u16 cmd_action, t_void *pdata_buf);
@ -4011,6 +4053,9 @@ mlan_status wlan_ret_reg_access(mlan_adapter *pmadapter, t_u16 type,
mlan_ioctl_req *pioctl_buf); mlan_ioctl_req *pioctl_buf);
mlan_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf); mlan_ioctl_req *pioctl_buf);
mlan_status wlan_ret_gpio_cfg_ops(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf);
mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter, mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
@ -4022,6 +4067,8 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf); t_u16 cmd_action, t_void *pdata_buf);
mlan_status wlan_cmd_mem_access(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, mlan_status wlan_cmd_mem_access(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
t_void *pdata_buf); t_void *pdata_buf);
mlan_status wlan_cmd_gpio_cfg_ops(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
t_void *pdata_buf);
mlan_status wlan_cmd_802_11_mac_address(pmlan_private pmpriv, mlan_status wlan_cmd_802_11_mac_address(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action); t_u16 cmd_action);
@ -4214,9 +4261,6 @@ mlan_status wlan_misc_ioctl_low_pwr_mode(pmlan_adapter pmadapter,
mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter, mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_ioctl_cwmode_ctrl(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req);
mlan_status wlan_set_mef_entry(mlan_private *pmpriv, pmlan_adapter pmadapter, mlan_status wlan_set_mef_entry(mlan_private *pmpriv, pmlan_adapter pmadapter,
mef_cfg_data *pmef); mef_cfg_data *pmef);
mlan_status wlan_process_mef_cfg_cmd(mlan_private *pmpriv, mlan_status wlan_process_mef_cfg_cmd(mlan_private *pmpriv,
@ -4260,11 +4304,12 @@ mlan_status wlan_ret_ch_load(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter, mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left); void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left);
void wlan_free_fw_cfp_tables(mlan_adapter *pmadapter); void wlan_free_fw_cfp_tables(mlan_adapter *pmadapter);
mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter, mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
mlan_status wlan_misc_region_power_cfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req);
mlan_status wlan_get_cfp_table(pmlan_adapter pmadapter, mlan_status wlan_get_cfp_table(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
@ -4312,6 +4357,9 @@ mlan_status wlan_cmd_fw_dump_event(pmlan_private pmpriv,
HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
t_void *pdata_buf); t_void *pdata_buf);
mlan_status wlan_misc_gpiocfg(pmlan_adapter pmadapter,
mlan_ioctl_req *pioctl_req);
mlan_status wlan_misc_bootsleep(pmlan_adapter pmadapter, mlan_status wlan_misc_bootsleep(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req); pmlan_ioctl_req pioctl_req);
@ -4352,6 +4400,11 @@ mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp, HostCmd_DS_COMMAND *resp,
mlan_ioctl_req *pioctl_buf); mlan_ioctl_req *pioctl_buf);
mlan_status wlan_misc_ioctl_edmac_cfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req);
mlan_status wlan_cmd_edmac_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
t_u16 cmd_action, t_void *pdata_buf);
/** Set/Get Country code */ /** Set/Get Country code */
mlan_status wlan_misc_ioctl_country_code(pmlan_adapter pmadapter, mlan_status wlan_misc_ioctl_country_code(pmlan_adapter pmadapter,
mlan_ioctl_req *pioctl_req); mlan_ioctl_req *pioctl_req);
@ -4714,4 +4767,10 @@ wlan_get_privs_by_two_cond(mlan_adapter *pmadapter,
return count; return count;
} }
t_bool wlan_secure_add(t_void *datain, t_s32 add, t_void *dataout,
data_type type);
t_bool wlan_secure_sub(t_void *datain, t_s32 sub, t_void *dataout,
data_type type);
#endif /* !_MLAN_MAIN_H_ */ #endif /* !_MLAN_MAIN_H_ */

View file

@ -330,6 +330,35 @@ mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter,
return ret; return ret;
} }
/**
* @brief send host cmd
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_PENDING --success, otherwise fail
*/
mlan_status wlan_misc_ioctl_tx_frame(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_misc_cfg *misc = MNULL;
ENTER();
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_TX_FRAME,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req,
&misc->param.tx_frame);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/** /**
* @brief Send function init/shutdown command to firmware * @brief Send function init/shutdown command to firmware
* *
@ -693,7 +722,9 @@ t_void wlan_wakeup_card_timeout_func(void *function_context)
PRINTM(MERROR, "Wakeup card timeout(%d)!\n", PRINTM(MERROR, "Wakeup card timeout(%d)!\n",
pmadapter->pm_wakeup_timeout); pmadapter->pm_wakeup_timeout);
pmadapter->pm_wakeup_timeout++; pmadapter->pm_wakeup_timeout++;
wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_DBG_DUMP, MNULL); pmadapter->pm_wakeup_flag = MTRUE;
wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DEFER_HANDLING, MNULL);
} }
pmadapter->wakeup_fw_timer_is_set = MFALSE; pmadapter->wakeup_fw_timer_is_set = MFALSE;
@ -1636,15 +1667,27 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
switch (reg_mem->param.reg_rw.type) { switch (reg_mem->param.reg_rw.type) {
case MLAN_REG_MAC: case MLAN_REG_MAC:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_MAC2: case MLAN_REG_MAC2:
#endif
cmd_no = HostCmd_CMD_MAC_REG_ACCESS; cmd_no = HostCmd_CMD_MAC_REG_ACCESS;
break; break;
case MLAN_REG_BBP: case MLAN_REG_BBP:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_BBP2: case MLAN_REG_BBP2:
#endif
cmd_no = HostCmd_CMD_BBP_REG_ACCESS; cmd_no = HostCmd_CMD_BBP_REG_ACCESS;
break; break;
case MLAN_REG_RF: case MLAN_REG_RF:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_RF2: case MLAN_REG_RF2:
#endif
cmd_no = HostCmd_CMD_RF_REG_ACCESS; cmd_no = HostCmd_CMD_RF_REG_ACCESS;
break; break;
case MLAN_REG_CAU: case MLAN_REG_CAU:
@ -1654,12 +1697,21 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
cmd_no = HostCmd_CMD_TARGET_ACCESS; cmd_no = HostCmd_CMD_TARGET_ACCESS;
break; break;
case MLAN_REG_BCA: case MLAN_REG_BCA:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_BCA2: case MLAN_REG_BCA2:
#endif
cmd_no = HostCmd_CMD_BCA_REG_ACCESS; cmd_no = HostCmd_CMD_BCA_REG_ACCESS;
break; break;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \
defined(SD9177)
case MLAN_REG_CIU: case MLAN_REG_CIU:
cmd_no = HostCmd_CMD_REG_ACCESS; cmd_no = HostCmd_CMD_REG_ACCESS;
break; break;
#endif
default: default:
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
ret = MLAN_STATUS_FAILURE; ret = MLAN_STATUS_FAILURE;
@ -4115,6 +4167,9 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
if (pioctl_req->action == MLAN_ACT_SET) { if (pioctl_req->action == MLAN_ACT_SET) {
/* User input validation */ /* User input validation */
if (IS_STREAM_2X2(pmadapter->feature_control)) { if (IS_STREAM_2X2(pmadapter->feature_control)) {
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
@ -4157,9 +4212,15 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter,
ant_cfg->tx_antenna, ant_cfg->tx_antenna,
ant_cfg->rx_antenna); ant_cfg->rx_antenna);
} else { } else {
#endif
ant_cfg->tx_antenna &= 0x0003; ant_cfg->tx_antenna &= 0x0003;
ant_cfg->rx_antenna &= 0x0003; ant_cfg->rx_antenna &= 0x0003;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
} }
#endif
if (!ant_cfg->tx_antenna || if (!ant_cfg->tx_antenna ||
bitcount(ant_cfg->tx_antenna & 0x00FF) > bitcount(ant_cfg->tx_antenna & 0x00FF) >
pmadapter->number_of_antenna || pmadapter->number_of_antenna ||
@ -5338,41 +5399,6 @@ mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter,
return ret; return ret;
} }
/* @brief Set/Get CW Mode Level control
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_SUCCESS
*/
mlan_status wlan_misc_ioctl_cwmode_ctrl(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_ds_misc_cfg *misc = MNULL;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
t_u16 cmd_action = 0;
ENTER();
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_SET)
cmd_action = HostCmd_ACT_GEN_SET;
else
cmd_action = HostCmd_ACT_GEN_GET;
/* Send request to firmware */
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CW_MODE_CTRL, cmd_action, 0,
(t_void *)pioctl_req, &misc->param.cwmode);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/** /**
* @brief push value to stack * @brief push value to stack
* *
@ -6209,6 +6235,32 @@ mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter,
return ret; return ret;
} }
/**
* @brief Create custom regulatory cfg
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req A pointer to ioctl request buffer
*
* @return MLAN_STATUS_PENDING --success, otherwise fail
*/
mlan_status wlan_misc_region_power_cfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_status ret = MLAN_STATUS_SUCCESS;
ENTER();
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_REGION_POWER_CFG,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req,
MNULL);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/** /**
* @brief Create custom regulatory cfg * @brief Create custom regulatory cfg
* *
@ -6240,7 +6292,7 @@ mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
misc_cfg->param.custom_reg_domain.region.country_code[0] != '\0' && misc_cfg->param.custom_reg_domain.region.country_code[0] != '\0' &&
misc_cfg->param.custom_reg_domain.region.country_code[1] != '\0') { misc_cfg->param.custom_reg_domain.region.country_code[1] != '\0') {
/* Copy the driver country code in the custom_reg_domain. The /* Copy the driver country code in the custom_reg_domain. The
* cmd cmd response handler will use it to compare with the FW * cmd response handler will use it to compare with the FW
* country code * country code
*/ */
pmadapter->country_code[0] = pmadapter->country_code[0] =
@ -6250,7 +6302,7 @@ mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
pmadapter->country_code[2] = '\0'; pmadapter->country_code[2] = '\0';
} }
/* Send request to firmware */ /* Send 2G/5G CFP table request to firmware */
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CHAN_REGION_CFG, cmd_action, ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CHAN_REGION_CFG, cmd_action,
0, (t_void *)pioctl_req, MNULL); 0, (t_void *)pioctl_req, MNULL);
@ -6595,6 +6647,41 @@ mlan_status wlan_misc_ioctl_net_monitor(pmlan_adapter pmadapter,
return ret; return ret;
} }
/**
* @brief config gpio cfg
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req Pointer to the IOCTL request buffer
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
mlan_status wlan_misc_gpiocfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
mlan_ds_misc_cfg *misc = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS;
t_u16 cmd_action = 0;
ENTER();
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_GET)
cmd_action = HostCmd_ACT_GEN_GET;
else
cmd_action = HostCmd_ACT_GEN_SET;
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_GPIO_CFG, cmd_action, 0,
(t_void *)pioctl_req, (t_void *)misc);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/** /**
* @brief config boot sleep * @brief config boot sleep
* *
@ -7551,3 +7638,226 @@ mlan_status wlan_misc_ioctl_reorder_flush_time(pmlan_adapter pmadapter,
LEAVE(); LEAVE();
return ret; return ret;
} }
/**
* @brief configure edmac parameters
*
* @param pmadapter A pointer to mlan_adapter structure
* @param pioctl_req Pointer to the IOCTL request buffer
*
* @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE
*/
mlan_status wlan_misc_ioctl_edmac_cfg(pmlan_adapter pmadapter,
pmlan_ioctl_req pioctl_req)
{
mlan_ds_misc_cfg *misc = MNULL;
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
ENTER();
misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf;
if (MLAN_ACT_SET == pioctl_req->action) {
misc->param.edmac_cfg.ed_ctrl_2g = 0x1;
misc->param.edmac_cfg.ed_offset_2g = 0x8;
misc->param.edmac_cfg.ed_ctrl_5g = 0x1;
misc->param.edmac_cfg.ed_offset_5g = 0x8;
misc->param.edmac_cfg.ed_bitmap_txq_lock = 0x1e00FF;
} else {
misc->param.edmac_cfg.ed_ctrl_2g = 0x0;
misc->param.edmac_cfg.ed_ctrl_5g = 0x0;
}
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_EDMAC_CFG,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req,
(t_void *)&misc->param.edmac_cfg);
if (ret == MLAN_STATUS_SUCCESS)
ret = MLAN_STATUS_PENDING;
LEAVE();
return ret;
}
/**
* @brief Add 2 variables securely, to prevent overflow.
*
* @param datain Pointer to 1st variable
* @param add 2nd variable value to add to 1st variable
* @param dataout Pointer to variable where sum is to be stored
* @param type Datatype of 1st and 2nd variable
*
* @return MTRUE if success or MFALSE if overflow error
*/
t_bool wlan_secure_add(t_void *datain, t_s32 add, t_void *dataout,
data_type type)
{
t_bool status = MTRUE;
switch (type) {
case TYPE_SINT8:
if (add > SINT8_MAX || *(t_s8 *)datain > SINT8_MAX - add)
goto fail;
else
*(t_s8 *)dataout = *(t_s8 *)datain + add;
break;
case TYPE_UINT8:
if (add > UINT8_MAX || *(t_u8 *)datain > UINT8_MAX - add)
goto fail;
else
*(t_u8 *)dataout = *(t_u8 *)datain + add;
break;
case TYPE_SINT16:
if (add > SINT16_MAX || *(t_s16 *)datain > SINT16_MAX - add)
goto fail;
else
*(t_s16 *)dataout = *(t_s16 *)datain + add;
break;
case TYPE_UINT16:
if (add > UINT16_MAX || *(t_u16 *)datain > UINT16_MAX - add)
goto fail;
else
*(t_u16 *)dataout = *(t_u16 *)datain + add;
break;
case TYPE_SINT32:
if (*(t_s32 *)datain > SINT32_MAX - add)
goto fail;
else
*(t_s32 *)dataout = *(t_s32 *)datain + add;
break;
case TYPE_UINT32:
if (*(t_u32 *)datain > UINT32_MAX - add)
goto fail;
else
*(t_u32 *)dataout = *(t_u32 *)datain + add;
break;
case TYPE_SINT64:
if (*(t_s64 *)datain > SINT64_MAX - add)
goto fail;
else
*(t_s64 *)dataout = *(t_s64 *)datain + add;
break;
case TYPE_UINT64:
if (*(t_u64 *)datain > UINT64_MAX - add)
goto fail;
else
*(t_u64 *)dataout = *(t_u64 *)datain + add;
break;
case TYPE_PTR:
if (*(t_ptr *)datain > PTR_MAX - add)
goto fail;
else
*(t_ptr *)dataout = *(t_ptr *)datain + add;
break;
default:
status = MFALSE;
break;
}
ret:
return status;
fail:
status = MFALSE;
goto ret;
}
/**
* @brief Subtract 2 variables securely, to prevent underflow.
*
* @param datain Pointer to 1st variable
* @param add 2nd variable value to subtract from 1st variable
* @param dataout Pointer to variable where diff is to be stored
* @param type Datatype of 1st and 2nd variable
*
* @return MTRUE if success or MFALSE if underflow error
*/
t_bool wlan_secure_sub(t_void *datain, t_s32 sub, t_void *dataout,
data_type type)
{
t_u8 status = MTRUE;
switch (type) {
case TYPE_SINT8:
if (*(t_s8 *)datain >= (t_s8)SINT8_MIN + sub)
*(t_s8 *)dataout = *(t_s8 *)datain - sub;
else
goto fail;
break;
case TYPE_UINT8:
if (*(t_u8 *)datain >= sub)
*(t_u8 *)dataout = *(t_u8 *)datain - sub;
else
goto fail;
break;
case TYPE_SINT16:
if (*(t_s16 *)datain >= (t_s16)SINT16_MIN + sub)
*(t_s16 *)dataout = *(t_s16 *)datain - sub;
else
goto fail;
break;
case TYPE_UINT16:
if (*(t_u16 *)datain >= sub)
*(t_u16 *)dataout = *(t_u16 *)datain - sub;
else
goto fail;
break;
case TYPE_SINT32:
if (*(t_s32 *)datain >= (t_s32)SINT32_MIN + sub)
*(t_s32 *)dataout = *(t_s32 *)datain - sub;
else
goto fail;
break;
case TYPE_UINT32:
if (*(t_u32 *)datain >= sub)
*(t_u32 *)dataout = *(t_u32 *)datain - sub;
else
goto fail;
break;
case TYPE_SINT64:
if (*(t_s64 *)datain >= (t_s64)SINT64_MIN + sub)
*(t_s64 *)dataout = *(t_s64 *)datain - sub;
else
goto fail;
break;
case TYPE_UINT64:
if (*(t_u64 *)datain >= sub)
*(t_u64 *)dataout = *(t_u64 *)datain - sub;
else
goto fail;
break;
case TYPE_PTR:
if (*(t_ptr *)datain >= sub)
*(t_ptr *)dataout = *(t_ptr *)datain - sub;
else
goto fail;
break;
default:
status = MFALSE;
break;
}
ret:
return status;
fail:
status = MFALSE;
goto ret;
}

File diff suppressed because it is too large Load diff

View file

@ -186,6 +186,7 @@ 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)
/** 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 */
@ -322,6 +323,7 @@ Change log:
#define PCIE9098_HOST_INTR_SEL_MASK \ #define PCIE9098_HOST_INTR_SEL_MASK \
(PCIE9098_HOST_INTR_DNLD_DONE | PCIE9098_HOST_INTR_UPLD_RDY | \ (PCIE9098_HOST_INTR_DNLD_DONE | PCIE9098_HOST_INTR_UPLD_RDY | \
PCIE9098_HOST_INTR_CMD_DONE | PCIE9098_HOST_INTR_EVENT_RDY) PCIE9098_HOST_INTR_CMD_DONE | PCIE9098_HOST_INTR_EVENT_RDY)
#endif
#if defined(PCIE8997) || defined(PCIE8897) #if defined(PCIE8997) || defined(PCIE8897)
/* PCIE INTERNAL REGISTERS */ /* PCIE INTERNAL REGISTERS */

View file

@ -3377,6 +3377,7 @@ static t_void wlan_scan_process_results(mlan_private *pmpriv)
* Prepares domain info from scan table and downloads the * Prepares domain info from scan table and downloads the
* domain info command to the FW. * domain info command to the FW.
*/ */
if (pmpriv->bss_role == MLAN_BSS_ROLE_STA)
wlan_11d_prepare_dnld_domain_info_cmd(pmpriv); wlan_11d_prepare_dnld_domain_info_cmd(pmpriv);
PRINTM(MMSG, "wlan: SCAN COMPLETED: scanned AP count=%d\n", PRINTM(MMSG, "wlan: SCAN COMPLETED: scanned AP count=%d\n",
pmadapter->num_in_scan_table); pmadapter->num_in_scan_table);

View file

@ -223,6 +223,9 @@ static const struct _mlan_card_info mlan_card_info_sd8897 = {
}; };
#endif #endif
#if defined(SD8977) || defined(SD8997) || defined(SD8987) || \
defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD8978) || defined(SD9177)
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,
@ -289,6 +292,7 @@ static const struct _mlan_sdio_card_reg mlan_reg_sd8977_sd8997 = {
.fw_dnld_status_1_reg = 0xE9, .fw_dnld_status_1_reg = 0xE9,
.winner_check_reg = 0xFC, .winner_check_reg = 0xFC,
}; };
#endif
#ifdef SD8997 #ifdef SD8997
static const struct _mlan_card_info mlan_card_info_sd8997 = { static const struct _mlan_card_info mlan_card_info_sd8997 = {
@ -322,15 +326,6 @@ static const struct _mlan_card_info mlan_card_info_sdiw624 = {
}; };
#endif #endif
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,
};
#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,
@ -1049,10 +1044,12 @@ 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)
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_SD9177(pmadapter->card_type)) IS_SDAW693(pmadapter->card_type) || IS_SD9177(pmadapter->card_type))
check_fw_status = MTRUE; check_fw_status = MTRUE;
#endif
/* Perform firmware data transfer */ /* Perform firmware data transfer */
do { do {
@ -2411,10 +2408,6 @@ 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
case CARD_TYPE_SDAW693:
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
pmadapter->pcard_info = &mlan_card_info_sdaw693;
break;
#ifdef SD9177 #ifdef SD9177
case CARD_TYPE_SD9177: case CARD_TYPE_SD9177:
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997; pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
@ -3024,6 +3017,7 @@ exit:
return ret; return ret;
} }
#if (defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177))
/** /**
* @brief This function sends vdll data to the card. * @brief This function sends vdll data to the card.
* *
@ -3065,6 +3059,7 @@ static mlan_status wlan_sdio_send_vdll(mlan_adapter *pmadapter,
LEAVE(); LEAVE();
return ret; return ret;
} }
#endif
/** /**
* @brief This function sends data to the card. * @brief This function sends data to the card.
@ -3083,8 +3078,10 @@ static mlan_status wlan_sdio_host_to_card_ext(pmlan_private pmpriv, t_u8 type,
mlan_status ret = MLAN_STATUS_SUCCESS; mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_adapter *pmadapter = pmpriv->adapter; mlan_adapter *pmadapter = pmpriv->adapter;
#if (defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177))
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
ret = wlan_sdio_host_to_card(pmadapter, type, pmbuf, tx_param); ret = wlan_sdio_host_to_card(pmadapter, type, pmbuf, tx_param);
if (type == MLAN_TYPE_DATA && ret == MLAN_STATUS_FAILURE) if (type == MLAN_TYPE_DATA && ret == MLAN_STATUS_FAILURE)
@ -3110,6 +3107,7 @@ mlan_status wlan_alloc_sdio_mpa_buffers(mlan_adapter *pmadapter,
{ {
mlan_status ret = MLAN_STATUS_SUCCESS; mlan_status ret = MLAN_STATUS_SUCCESS;
pmlan_callbacks pcb = &pmadapter->callbacks; pmlan_callbacks pcb = &pmadapter->callbacks;
t_u32 buf_size = 0;
t_u8 mp_aggr_pkt_limit = pmadapter->pcard_sd->mp_aggr_pkt_limit; t_u8 mp_aggr_pkt_limit = pmadapter->pcard_sd->mp_aggr_pkt_limit;
ENTER(); ENTER();
@ -3117,9 +3115,12 @@ mlan_status wlan_alloc_sdio_mpa_buffers(mlan_adapter *pmadapter,
if ((pmadapter->pcard_sd->max_segs < mp_aggr_pkt_limit) || if ((pmadapter->pcard_sd->max_segs < mp_aggr_pkt_limit) ||
(pmadapter->pcard_sd->max_seg_size < (pmadapter->pcard_sd->max_seg_size <
pmadapter->pcard_sd->max_sp_tx_size)) { pmadapter->pcard_sd->max_sp_tx_size)) {
if (!wlan_secure_add(&mpa_tx_buf_size, DMA_ALIGNMENT, &buf_size,
TYPE_UINT32))
PRINTM(MERROR, "%s:tx_buf_size overflow \n", __func__);
ret = pcb->moal_malloc( ret = pcb->moal_malloc(
pmadapter->pmoal_handle, pmadapter->pmoal_handle, buf_size,
mpa_tx_buf_size + DMA_ALIGNMENT,
MLAN_MEM_DEF | MLAN_MEM_DMA, MLAN_MEM_DEF | MLAN_MEM_DMA,
(t_u8 **)&pmadapter->pcard_sd->mpa_tx.head_ptr); (t_u8 **)&pmadapter->pcard_sd->mpa_tx.head_ptr);
if (ret != MLAN_STATUS_SUCCESS || if (ret != MLAN_STATUS_SUCCESS ||
@ -3141,9 +3142,12 @@ mlan_status wlan_alloc_sdio_mpa_buffers(mlan_adapter *pmadapter,
if ((pmadapter->pcard_sd->max_segs < mp_aggr_pkt_limit) || if ((pmadapter->pcard_sd->max_segs < mp_aggr_pkt_limit) ||
(pmadapter->pcard_sd->max_seg_size < (pmadapter->pcard_sd->max_seg_size <
pmadapter->pcard_sd->max_sp_rx_size)) { pmadapter->pcard_sd->max_sp_rx_size)) {
if (!wlan_secure_add(&mpa_rx_buf_size, DMA_ALIGNMENT, &buf_size,
TYPE_UINT32))
PRINTM(MERROR, "%s:rx_buf_size overflow \n", __func__);
ret = pcb->moal_malloc( ret = pcb->moal_malloc(
pmadapter->pmoal_handle, pmadapter->pmoal_handle, buf_size,
mpa_rx_buf_size + DMA_ALIGNMENT,
MLAN_MEM_DEF | MLAN_MEM_DMA, MLAN_MEM_DEF | MLAN_MEM_DMA,
(t_u8 **)&pmadapter->pcard_sd->mpa_rx.head_ptr); (t_u8 **)&pmadapter->pcard_sd->mpa_rx.head_ptr);
if (ret != MLAN_STATUS_SUCCESS || if (ret != MLAN_STATUS_SUCCESS ||
@ -3384,6 +3388,9 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
ret = MLAN_STATUS_FAILURE; ret = MLAN_STATUS_FAILURE;
goto done; goto done;
} }
#if defined(SD8997) || defined(SD8977) || defined(SD8987) || \
defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD8978) || defined(SD9177)
if (MFALSE if (MFALSE
#ifdef SD8997 #ifdef SD8997
|| IS_SD8997(pmadapter->card_type) || IS_SD8997(pmadapter->card_type)
@ -3406,7 +3413,6 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
#ifdef SDIW624 #ifdef SDIW624
|| IS_SDIW624(pmadapter->card_type) || IS_SDIW624(pmadapter->card_type)
#endif #endif
|| IS_SDAW693(pmadapter->card_type)
#ifdef SD9177 #ifdef SD9177
|| IS_SD9177(pmadapter->card_type) || IS_SD9177(pmadapter->card_type)
#endif #endif
@ -3417,6 +3423,7 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
HOST_TO_CARD_EVENT_REG, HOST_TO_CARD_EVENT_REG,
value | HOST_POWER_UP); value | HOST_POWER_UP);
} }
#endif
/* Poll register around 100 ms */ /* Poll register around 100 ms */
for (tries = 0; tries < MAX_POLL_TRIES; ++tries) { for (tries = 0; tries < MAX_POLL_TRIES; ++tries) {
pcb->moal_read_reg(pmadapter->pmoal_handle, reset_reg, &value); pcb->moal_read_reg(pmadapter->pmoal_handle, reset_reg, &value);

View file

@ -1194,7 +1194,29 @@ process_start:
} }
} }
#endif #endif
#ifdef PCIE
if (IS_PCIE(pmadapter->card_type) &&
pmadapter->pcie_cmd_dnld_int) {
pmadapter->pcie_cmd_dnld_int = MFALSE;
mlan_process_pcie_interrupt_cb(pmadapter, RX_CMD_DNLD);
}
#endif
/* wake up timeout happened */
if ((pmadapter->ps_state == PS_STATE_SLEEP) &&
pmadapter->pm_wakeup_flag) {
pmadapter->pm_wakeup_flag = MFALSE;
if (pmadapter->pm_wakeup_timeout > 2)
wlan_recv_event(
wlan_get_priv(pmadapter,
MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DBG_DUMP, MNULL);
else {
pmadapter->ops.wakeup_card(pmadapter, MTRUE);
pmadapter->pm_wakeup_fw_try = MTRUE;
continue;
}
}
/* Need to wake up the card ? */ /* Need to wake up the card ? */
if ((pmadapter->ps_state == PS_STATE_SLEEP) && if ((pmadapter->ps_state == PS_STATE_SLEEP) &&
(pmadapter->pm_wakeup_card_req && (pmadapter->pm_wakeup_card_req &&
@ -1363,7 +1385,19 @@ process_start:
break; break;
} }
#endif #endif
#ifdef PCIE
if (IS_PCIE(pmadapter->card_type)) {
if (pmadapter->pcard_pcie->reg->use_adma) {
if (wlan_is_tx_pending(pmadapter)) {
wlan_recv_event(
wlan_get_priv(pmadapter,
MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE,
MNULL);
}
}
}
#endif
} while (MTRUE); } while (MTRUE);
pcb->moal_spin_lock(pmadapter->pmoal_handle, pcb->moal_spin_lock(pmadapter->pmoal_handle,
@ -1417,10 +1451,9 @@ mlan_status mlan_send_packet(t_void *padapter, pmlan_buffer pmbuf)
eth_type = eth_type =
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]);
if (((pmadapter->priv[pmbuf->bss_index]->port_ctrl_mode == MTRUE) && if ((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) ||
((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) ||
(eth_type == MLAN_ETHER_PKT_TYPE_ARP) || (eth_type == MLAN_ETHER_PKT_TYPE_ARP) ||
(eth_type == MLAN_ETHER_PKT_TYPE_WAPI))) || (eth_type == MLAN_ETHER_PKT_TYPE_WAPI) ||
(eth_type == MLAN_ETHER_PKT_TYPE_TDLS_ACTION) || (eth_type == MLAN_ETHER_PKT_TYPE_TDLS_ACTION) ||
(pmbuf->buf_type == MLAN_BUF_TYPE_RAW_DATA) (pmbuf->buf_type == MLAN_BUF_TYPE_RAW_DATA)
@ -1868,6 +1901,12 @@ void mlan_process_pcie_interrupt_cb(t_void *padapter, int type)
ENTER(); ENTER();
if (type == RX_DATA) { if (type == RX_DATA) {
if ((pmadapter->ps_state == PS_STATE_SLEEP) ||
(pmadapter->ps_state == PS_STATE_SLEEP_CFM)) {
LEAVE();
return;
}
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);
@ -1880,6 +1919,9 @@ void mlan_process_pcie_interrupt_cb(t_void *padapter, int type)
LEAVE(); LEAVE();
return; return;
} }
} else if (type == TX_COMPLETE && !wlan_is_tx_pending(pmadapter)) {
LEAVE();
return;
} }
pmadapter->ops.process_int_status(pmadapter, type); pmadapter->ops.process_int_status(pmadapter, type);
switch (type) { switch (type) {
@ -1891,11 +1933,24 @@ void mlan_process_pcie_interrupt_cb(t_void *padapter, int type)
mlan_rx_process(pmadapter, MNULL); mlan_rx_process(pmadapter, MNULL);
} }
break; break;
case RX_EVENT: // Rx event
case TX_COMPLETE: // Tx data complete case TX_COMPLETE: // Tx data complete
case RX_CMD_RESP: // Rx CMD Resp wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY),
mlan_main_process(pmadapter); MLAN_EVENT_ID_DRV_DEFER_HANDLING, MNULL);
if (pmadapter->pcard_pcie->reg->use_adma) {
if (wlan_is_tx_pending(pmadapter))
wlan_recv_event(
wlan_get_priv(pmadapter,
MLAN_BSS_ROLE_ANY),
MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE,
MNULL);
}
break; break;
case RX_EVENT: // Rx event
case RX_CMD_RESP: // Rx CMD Resp
if (mlan_main_process(pmadapter) == MLAN_STATUS_FAILURE)
PRINTM(MERROR, "mlan_main_process failed.\n");
break;
case RX_CMD_DNLD:
default: default:
break; break;
} }

View file

@ -1169,7 +1169,7 @@ static mlan_status wlan_cmd_802_11_key_material(pmlan_private pmpriv,
PRINTM(MCMND, "Remove Key\n"); PRINTM(MCMND, "Remove Key\n");
goto done; goto done;
} }
pkey_material->action = wlan_cpu_to_le16(HostCmd_ACT_GEN_SET); pkey_material->action = wlan_cpu_to_le16(cmd_action);
pkey_material->key_param_set.key_idx = pkey->key_index & KEY_INDEX_MASK; pkey_material->key_param_set.key_idx = pkey->key_index & KEY_INDEX_MASK;
pkey_material->key_param_set.type = pkey_material->key_param_set.type =
wlan_cpu_to_le16(TLV_TYPE_KEY_PARAM_V2); wlan_cpu_to_le16(TLV_TYPE_KEY_PARAM_V2);
@ -3750,10 +3750,6 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
ret = wlan_cmd_802_11_rf_antenna(pmpriv, cmd_ptr, cmd_action, ret = wlan_cmd_802_11_rf_antenna(pmpriv, cmd_ptr, cmd_action,
pdata_buf); pdata_buf);
break; break;
case HostCmd_CMD_CW_MODE_CTRL:
ret = wlan_cmd_cw_mode_ctrl(pmpriv, cmd_ptr, cmd_action,
pdata_buf);
break;
case HostCmd_CMD_TXPWR_CFG: case HostCmd_CMD_TXPWR_CFG:
ret = wlan_cmd_tx_power_cfg(pmpriv, cmd_ptr, cmd_action, ret = wlan_cmd_tx_power_cfg(pmpriv, cmd_ptr, cmd_action,
pdata_buf); pdata_buf);
@ -4034,6 +4030,9 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
case HostCmd_CMD_MEM_ACCESS: case HostCmd_CMD_MEM_ACCESS:
ret = wlan_cmd_mem_access(cmd_ptr, cmd_action, pdata_buf); ret = wlan_cmd_mem_access(cmd_ptr, cmd_action, pdata_buf);
break; break;
case HostCmd_CMD_GPIO_CFG:
ret = wlan_cmd_gpio_cfg_ops(cmd_ptr, cmd_action, pdata_buf);
break;
case HostCmd_CMD_INACTIVITY_TIMEOUT_EXT: case HostCmd_CMD_INACTIVITY_TIMEOUT_EXT:
ret = wlan_cmd_inactivity_timeout(cmd_ptr, cmd_action, ret = wlan_cmd_inactivity_timeout(cmd_ptr, cmd_action,
pdata_buf); pdata_buf);
@ -4175,6 +4174,13 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
sizeof(HostCmd_DS_CHAN_REGION_CFG) + S_DS_GEN); sizeof(HostCmd_DS_CHAN_REGION_CFG) + S_DS_GEN);
cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action); cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action);
break; break;
case HostCmd_CMD_REGION_POWER_CFG:
cmd_ptr->command = wlan_cpu_to_le16(cmd_no);
cmd_ptr->size = wlan_cpu_to_le16(
sizeof(HostCmd_DS_REGION_POWER_CFG) + S_DS_GEN);
cmd_ptr->params.rg_power_cfg.action =
wlan_cpu_to_le16(cmd_action);
break;
case HostCmd_CMD_AUTO_TX: case HostCmd_CMD_AUTO_TX:
ret = wlan_cmd_auto_tx(pmpriv, cmd_ptr, cmd_action, cmd_oid, ret = wlan_cmd_auto_tx(pmpriv, cmd_ptr, cmd_action, cmd_oid,
pdata_buf); pdata_buf);
@ -4275,6 +4281,13 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no,
ret = wlan_cmd_cross_chip_synch(pmpriv, cmd_ptr, cmd_action, ret = wlan_cmd_cross_chip_synch(pmpriv, cmd_ptr, cmd_action,
pdata_buf); pdata_buf);
break; break;
case HostCmd_CMD_802_11_TX_FRAME:
ret = wlan_cmd_tx_frame(pmpriv, cmd_ptr, cmd_action, pdata_buf);
break;
case HostCmd_CMD_EDMAC_CFG:
ret = wlan_cmd_edmac_cfg(pmpriv, cmd_ptr, cmd_action,
pdata_buf);
break;
default: default:
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no); PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
ret = MLAN_STATUS_FAILURE; ret = MLAN_STATUS_FAILURE;

View file

@ -158,7 +158,8 @@ static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv,
ENTER(); ENTER();
if (resp->command != HostCmd_CMD_WMM_PARAM_CONFIG && if (resp->command != HostCmd_CMD_WMM_PARAM_CONFIG &&
resp->command != HostCmd_CMD_CHAN_REGION_CFG) resp->command != HostCmd_CMD_CHAN_REGION_CFG &&
resp->command != HostCmd_CMD_REGION_POWER_CFG)
PRINTM(MERROR, "CMD_RESP: cmd %#x error, result=%#x\n", PRINTM(MERROR, "CMD_RESP: cmd %#x error, result=%#x\n",
resp->command, resp->result); resp->command, resp->result);
if (pioctl_buf) if (pioctl_buf)
@ -335,6 +336,10 @@ static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv,
ret = MLAN_STATUS_SUCCESS; ret = MLAN_STATUS_SUCCESS;
PRINTM(MCMND, "FW don't support chan region cfg command!\n"); PRINTM(MCMND, "FW don't support chan region cfg command!\n");
break; break;
case HostCmd_CMD_REGION_POWER_CFG:
ret = MLAN_STATUS_SUCCESS;
PRINTM(MCMND, "FW don't support region power cfg command!\n");
break;
default: default:
break; break;
} }
@ -3354,9 +3359,6 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_802_11_RF_ANTENNA: case HostCmd_CMD_802_11_RF_ANTENNA:
ret = wlan_ret_802_11_rf_antenna(pmpriv, resp, pioctl_buf); ret = wlan_ret_802_11_rf_antenna(pmpriv, resp, pioctl_buf);
break; break;
case HostCmd_CMD_CW_MODE_CTRL:
ret = wlan_ret_cw_mode_ctrl(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_VERSION_EXT: case HostCmd_CMD_VERSION_EXT:
ret = wlan_ret_ver_ext(pmpriv, resp, pioctl_buf); ret = wlan_ret_ver_ext(pmpriv, resp, pioctl_buf);
break; break;
@ -3511,6 +3513,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_MEM_ACCESS: case HostCmd_CMD_MEM_ACCESS:
ret = wlan_ret_mem_access(pmpriv, resp, pioctl_buf); ret = wlan_ret_mem_access(pmpriv, resp, pioctl_buf);
break; break;
case HostCmd_CMD_GPIO_CFG:
ret = wlan_ret_gpio_cfg_ops(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_INACTIVITY_TIMEOUT_EXT: case HostCmd_CMD_INACTIVITY_TIMEOUT_EXT:
ret = wlan_ret_inactivity_timeout(pmpriv, resp, pioctl_buf); ret = wlan_ret_inactivity_timeout(pmpriv, resp, pioctl_buf);
break; break;
@ -3612,6 +3617,8 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_CHAN_REGION_CFG: case HostCmd_CMD_CHAN_REGION_CFG:
ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf); ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf);
break; break;
case HostCmd_CMD_REGION_POWER_CFG:
break;
case HostCmd_CMD_AUTO_TX: case HostCmd_CMD_AUTO_TX:
ret = wlan_ret_auto_tx(pmpriv, resp, pioctl_buf); ret = wlan_ret_auto_tx(pmpriv, resp, pioctl_buf);
break; break;
@ -3695,6 +3702,10 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_CROSS_CHIP_SYNCH: case HostCmd_CMD_CROSS_CHIP_SYNCH:
ret = wlan_ret_cross_chip_synch(pmpriv, resp, pioctl_buf); ret = wlan_ret_cross_chip_synch(pmpriv, resp, pioctl_buf);
break; break;
case HostCmd_CMD_802_11_TX_FRAME:
break;
case HostCmd_CMD_EDMAC_CFG:
break;
default: default:
PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n", PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
resp->command); resp->command);

View file

@ -62,6 +62,49 @@ static t_void wlan_handle_disconnect_event(pmlan_private pmpriv)
LEAVE(); LEAVE();
} }
/**
* @brief This function iterates over station list and notifies
* mac address of each sta to respective event handler.
*
* @param priv A pointer to mlan_private structure
* @event_id A reference to mlan event
* @return N/A
*/
static void wlan_notify_stations(mlan_private *priv, mlan_event_id event_id)
{
sta_node *sta_ptr;
t_u8 event_buf[128];
mlan_event *pevent = (mlan_event *)event_buf;
t_u8 *pbuf;
ENTER();
sta_ptr = (sta_node *)util_peek_list(
priv->adapter->pmoal_handle, &priv->sta_list,
priv->adapter->callbacks.moal_spin_lock,
priv->adapter->callbacks.moal_spin_unlock);
if (!sta_ptr) {
LEAVE();
return;
}
while (sta_ptr != (sta_node *)&priv->sta_list) {
memset(priv->adapter, event_buf, 0, sizeof(event_buf));
pevent->bss_index = priv->bss_index;
pevent->event_id = event_id;
pevent->event_len = MLAN_MAC_ADDR_LENGTH + 2;
pbuf = (t_u8 *)pevent->event_buf;
/* reason field set to 0, Unspecified */
memcpy_ext(priv->adapter, pbuf + 2, sta_ptr->mac_addr,
MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH);
wlan_recv_event(priv, pevent->event_id, pevent);
sta_ptr = sta_ptr->pnext;
}
LEAVE();
return;
}
/** /**
* @brief This function will parse the TDLS event for further wlan action * @brief This function will parse the TDLS event for further wlan action
* *
@ -334,6 +377,75 @@ static void wlan_send_tdls_tear_down_request(pmlan_private priv)
return; return;
} }
/**
* @brief This function will handle the generic NAN event for further wlan
* action based on the Event subtypes
*
* @param pmpriv A pointer to mlan_private
* @param evt_buf A pointer to mlan_event
* @param pmbuf A pointer to mlan buffer
*
* @return N/A
*/
static void wlan_process_nan_event(pmlan_private pmpriv, pmlan_buffer pmbuf)
{
t_u8 *evt_buf = MNULL;
mlan_event *pevent;
mlan_status ret = MLAN_STATUS_SUCCESS;
event_nan_generic *nan_event =
(event_nan_generic *)(pmbuf->pbuf + pmbuf->data_offset +
sizeof(mlan_event_id));
pmlan_adapter pmadapter = pmpriv->adapter;
pmlan_callbacks pcb = &pmadapter->callbacks;
ENTER();
ret = pcb->moal_malloc(pmadapter->pmoal_handle, MAX_EVENT_SIZE,
MLAN_MEM_DEF, &evt_buf);
if (ret != MLAN_STATUS_SUCCESS || !evt_buf) {
LEAVE();
return;
}
pevent = (pmlan_event)evt_buf;
pevent->bss_index = pmpriv->bss_index;
if (wlan_le16_to_cpu(nan_event->event_sub_type) ==
NAN_EVT_SUBTYPE_SD_EVENT ||
wlan_le16_to_cpu(nan_event->event_sub_type) ==
NAN_EVT_SUBTYPE_SDF_TX_DONE) {
pevent->event_id = MLAN_EVENT_ID_DRV_PASSTHRU;
pevent->event_len = pmbuf->data_len;
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
pmbuf->pbuf + pmbuf->data_offset, pevent->event_len,
pevent->event_len);
wlan_recv_event(pmpriv, pevent->event_id, pevent);
pcb->moal_mfree(pmadapter->pmoal_handle, evt_buf);
} else {
t_u8 test_mac[MLAN_MAC_ADDR_LENGTH] = {0x00, 0x11, 0x22,
0x33, 0x44, 0x55};
pevent->event_id = MLAN_EVENT_ID_DRV_CONNECTED;
pevent->event_len = MLAN_MAC_ADDR_LENGTH;
memcpy_ext(pmpriv->adapter, (t_u8 *)pevent->event_buf, test_mac,
MLAN_MAC_ADDR_LENGTH, pevent->event_len);
wlan_ralist_add(pmpriv, test_mac);
memcpy_ext(pmpriv->adapter,
pmpriv->curr_bss_params.bss_descriptor.mac_address,
test_mac, MLAN_MAC_ADDR_LENGTH,
MLAN_MAC_ADDR_LENGTH);
wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_CONNECTED, pevent);
if (pmpriv->port_ctrl_mode == MTRUE)
pmpriv->port_open = MTRUE;
pmpriv->media_connected = MTRUE;
PRINTM_NETINTF(MEVENT, pmpriv);
PRINTM(MEVENT, "nan interface - opened\n");
pcb->moal_mfree(pmadapter->pmoal_handle, evt_buf);
}
LEAVE();
return;
}
/******************************************************** /********************************************************
Global Functions Global Functions
********************************************************/ ********************************************************/
@ -377,10 +489,6 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect)
else else
#endif #endif
wlan_11h_check_update_radar_det_state(priv); wlan_11h_check_update_radar_det_state(priv);
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
} }
if (priv->port_ctrl_mode == MTRUE) { if (priv->port_ctrl_mode == MTRUE) {
@ -887,6 +995,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
wlan_clean_txrx(pmpriv); wlan_clean_txrx(pmpriv);
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_ADHOC_LINK_LOST, wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_ADHOC_LINK_LOST,
MNULL); MNULL);
/* Notify IBSS disconnect handler to delete stations if any. */
wlan_notify_stations(pmpriv, MLAN_EVENT_ID_FW_IBSS_DISCONNECT);
break; break;
case EVENT_ASSOC_REQ_IE: case EVENT_ASSOC_REQ_IE:
pmpriv->assoc_req_size = pmbuf->data_len - sizeof(eventcause); pmpriv->assoc_req_size = pmbuf->data_len - sizeof(eventcause);
@ -932,10 +1042,6 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_PORT_RELEASE, MNULL); wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_PORT_RELEASE, MNULL);
/* Send OBSS scan param to the application */ /* Send OBSS scan param to the application */
wlan_2040_coex_event(pmpriv); wlan_2040_coex_event(pmpriv);
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break; break;
case EVENT_STOP_TX: case EVENT_STOP_TX:
@ -1296,8 +1402,22 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
break; break;
case EVENT_IBSS_STATION_CONNECT: case EVENT_IBSS_STATION_CONNECT:
pevent->bss_index = pmpriv->bss_index;
pevent->event_id = MLAN_EVENT_ID_FW_IBSS_CONNECT;
pevent->event_len = pmbuf->data_len;
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
pmbuf->pbuf + pmbuf->data_offset, pevent->event_len,
pevent->event_len);
wlan_recv_event(pmpriv, pevent->event_id, pevent);
break; break;
case EVENT_IBSS_STATION_DISCONNECT: case EVENT_IBSS_STATION_DISCONNECT:
pevent->bss_index = pmpriv->bss_index;
pevent->event_id = MLAN_EVENT_ID_FW_IBSS_DISCONNECT;
pevent->event_len = pmbuf->data_len;
memcpy_ext(pmadapter, (t_u8 *)pevent->event_buf,
pmbuf->pbuf + pmbuf->data_offset, pevent->event_len,
pevent->event_len);
wlan_recv_event(pmpriv, pevent->event_id, pevent);
break; break;
case EVENT_SAD_REPORT: { case EVENT_SAD_REPORT: {
#ifdef DEBUG_LEVEL1 #ifdef DEBUG_LEVEL1
@ -1339,6 +1459,10 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
PRINTM(MEVENT, "EVENT: BT coex wlan param update\n"); PRINTM(MEVENT, "EVENT: BT coex wlan param update\n");
wlan_bt_coex_wlan_param_update_event(pmpriv, pmbuf); wlan_bt_coex_wlan_param_update_event(pmpriv, pmbuf);
break; break;
case EVENT_NAN_GENERIC:
PRINTM(MEVENT, "EVENT: NAN_GENERIC_EVENT\n");
wlan_process_nan_event(pmpriv, pmbuf);
break;
#if defined(PCIE) #if defined(PCIE)
case EVENT_SSU_DUMP_DMA: case EVENT_SSU_DUMP_DMA:

View file

@ -468,6 +468,10 @@ static mlan_status wlan_get_info_ioctl(pmlan_adapter pmadapter,
IS_FW_SUPPORT_BEACON_PROT(pmadapter) ? 0x01 : 0x00; IS_FW_SUPPORT_BEACON_PROT(pmadapter) ? 0x01 : 0x00;
pget_info->param.fw_info.rtt_support = pget_info->param.fw_info.rtt_support =
IS_FW_SUPPORT_RTT(pmadapter) ? 0x01 : 0x00; IS_FW_SUPPORT_RTT(pmadapter) ? 0x01 : 0x00;
pget_info->param.fw_info.cmd_tx_data =
IS_FW_SUPPORT_CMD_TX_DATA(pmadapter) ? 0x01 : 0x00;
pget_info->param.fw_info.sec_rgpower =
IS_FW_SUPPORT_SEC_RG_POWER(pmadapter) ? 0x01 : 0x00;
break; break;
case MLAN_OID_GET_BSS_INFO: case MLAN_OID_GET_BSS_INFO:
status = wlan_get_info_bss_info(pmadapter, pioctl_req); status = wlan_get_info_bss_info(pmadapter, pioctl_req);
@ -1504,6 +1508,7 @@ static mlan_status wlan_bss_ioctl(pmlan_adapter pmadapter,
{ {
mlan_status status = MLAN_STATUS_SUCCESS; mlan_status status = MLAN_STATUS_SUCCESS;
mlan_ds_bss *bss = MNULL; mlan_ds_bss *bss = MNULL;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
ENTER(); ENTER();
@ -1519,6 +1524,9 @@ static mlan_status wlan_bss_ioctl(pmlan_adapter pmadapter,
bss = (mlan_ds_bss *)pioctl_req->pbuf; bss = (mlan_ds_bss *)pioctl_req->pbuf;
switch (bss->sub_command) { switch (bss->sub_command) {
case MLAN_OID_BSS_HOST_MLME:
pmpriv->curr_bss_params.host_mlme = MTRUE;
break;
case MLAN_OID_BSS_START: case MLAN_OID_BSS_START:
status = wlan_bss_ioctl_start(pmadapter, pioctl_req); status = wlan_bss_ioctl_start(pmadapter, pioctl_req);
break; break;
@ -2998,7 +3006,7 @@ static mlan_status wlan_sec_ioctl_set_wpa_key(pmlan_adapter pmadapter,
} }
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_KEY_MATERIAL, ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_KEY_MATERIAL,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, pioctl_req->action, 0, (t_void *)pioctl_req,
&sec->param.encrypt_key); &sec->param.encrypt_key);
if (ret == MLAN_STATUS_SUCCESS) if (ret == MLAN_STATUS_SUCCESS)
@ -3113,7 +3121,8 @@ static mlan_status wlan_sec_ioctl_encrypt_key(pmlan_adapter pmadapter,
mlan_ds_sec_cfg *sec = MNULL; mlan_ds_sec_cfg *sec = MNULL;
ENTER(); ENTER();
sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf; sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf;
if (pioctl_req->action == MLAN_ACT_SET) { if ((pioctl_req->action == MLAN_ACT_SET) ||
(pioctl_req->action == MLAN_ACT_CLEAR)) {
if (sec->param.encrypt_key.is_wapi_key) if (sec->param.encrypt_key.is_wapi_key)
status = wlan_sec_ioctl_set_wapi_key(pmadapter, status = wlan_sec_ioctl_set_wapi_key(pmadapter,
pioctl_req); pioctl_req);
@ -5208,9 +5217,6 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_PMIC_CFG: case MLAN_OID_MISC_PMIC_CFG:
status = wlan_misc_ioctl_pmic_configure(pmadapter, pioctl_req); status = wlan_misc_ioctl_pmic_configure(pmadapter, pioctl_req);
break; break;
case MLAN_OID_MISC_CWMODE_CTRL:
status = wlan_misc_ioctl_cwmode_ctrl(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_MEF_FLT_CFG: case MLAN_OID_MISC_MEF_FLT_CFG:
status = wlan_misc_ioctl_mef_flt_cfg(pmadapter, pioctl_req); status = wlan_misc_ioctl_mef_flt_cfg(pmadapter, pioctl_req);
break; break;
@ -5266,6 +5272,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_GET_CHAN_REGION_CFG: case MLAN_OID_MISC_GET_CHAN_REGION_CFG:
status = wlan_misc_chan_reg_cfg(pmadapter, pioctl_req); status = wlan_misc_chan_reg_cfg(pmadapter, pioctl_req);
break; break;
case MLAN_OID_MISC_REGION_POWER_CFG:
status = wlan_misc_region_power_cfg(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_CLOUD_KEEP_ALIVE: case MLAN_OID_MISC_CLOUD_KEEP_ALIVE:
status = wlan_misc_cloud_keep_alive(pmadapter, pioctl_req); status = wlan_misc_cloud_keep_alive(pmadapter, pioctl_req);
break; break;
@ -5299,6 +5308,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_GET_TX_RX_HISTOGRAM: case MLAN_OID_MISC_GET_TX_RX_HISTOGRAM:
status = wlan_get_tx_rx_histogram(pmadapter, pioctl_req); status = wlan_get_tx_rx_histogram(pmadapter, pioctl_req);
break; break;
case MLAN_OID_MISC_GPIO_CFG:
status = wlan_misc_gpiocfg(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_BOOT_SLEEP: case MLAN_OID_MISC_BOOT_SLEEP:
status = wlan_misc_bootsleep(pmadapter, pioctl_req); status = wlan_misc_bootsleep(pmadapter, pioctl_req);
break; break;
@ -5386,7 +5398,12 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
status = wlan_misc_ioctl_reorder_flush_time(pmadapter, status = wlan_misc_ioctl_reorder_flush_time(pmadapter,
pioctl_req); pioctl_req);
break; break;
case MLAN_OID_MISC_TX_FRAME:
status = wlan_misc_ioctl_tx_frame(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_EDMAC_CONFIG:
status = wlan_misc_ioctl_edmac_cfg(pmadapter, pioctl_req);
break;
default: default:
if (pioctl_req) if (pioctl_req)
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;

View file

@ -89,7 +89,85 @@ done:
LEAVE(); LEAVE();
return ret; return ret;
} }
Stats_mcast_drv_t gmcast_stats = {0};
/* This flag is used to protect the mcast drv stat update
* when it's value is copied to provide to mlanutl
* MTRUE = Update is allowed
* MFALSE = Update is not allowed
*/
t_u8 mcast_drv_update_allow_flag = MTRUE;
#define DEST_MAC_OFFSET 10
#define CYCLE_START 1
#define FIVE_SEC 5000000 /* 1000000 usec = 1sec*/
/**
* @brief This function calculates the cycle delta and driver time delta
* for Mcast packets
*
* @param pmadapter A pointer to pmlan_adapter structure
* @param pmbuf A pointer to the mlan_buffer for process
*
* @return Nothing
*/
void wlan_drv_mcast_cycle_delay_calulation(pmlan_adapter pmadapter,
pmlan_buffer pmbuf)
{
static t_u32 prev_mcast_sec = 0;
static t_u32 prev_mcast_usec = 0;
t_u32 curr_ts_sec = 0;
t_u32 curr_ts_usec = 0;
t_u64 cycle_delta = 0;
t_u64 profile_delta = 0;
if (mcast_drv_update_allow_flag == MFALSE)
return;
/* Take current time */
if (pmadapter && pmadapter->pmoal_handle)
pmadapter->callbacks.moal_get_system_time(
pmadapter->pmoal_handle, &curr_ts_sec, &curr_ts_usec);
else
PRINTM(MERROR, "ERR: pmadapter or pmoal_handle NULL\n",
__func__);
if (curr_ts_sec || curr_ts_usec) {
/* Calculate profile delta */
profile_delta = (curr_ts_sec - pmbuf->in_ts_sec) * 1000000;
profile_delta += (t_s32)(curr_ts_usec - pmbuf->in_ts_usec);
if ((profile_delta >= 0) && (profile_delta <= 1000))
gmcast_stats.spent_time_under_1000usec++;
else if ((profile_delta > 1000) && (profile_delta <= 2000))
gmcast_stats.spent_time_over_1000usec++;
else if ((profile_delta > 2000) && (profile_delta <= 3000))
gmcast_stats.spent_time_over_2000usec++;
else if (profile_delta > 3000)
gmcast_stats.spent_time_over_3000usec++;
}
/* Process the start cycle data */
cycle_delta = (pmbuf->in_ts_sec - prev_mcast_sec) * 1000000;
cycle_delta += (t_s32)(pmbuf->in_ts_usec - prev_mcast_usec);
/* If start cycle delta is more than 5 sec ignore*/
if ((pmbuf->u.mc_tx_info.mc_pkt_flags & (1 << CYCLE_START)) &&
(cycle_delta < FIVE_SEC)) {
if ((cycle_delta >= 0) && (cycle_delta <= 2300))
gmcast_stats.cycle_recv_under_2300usec++;
if ((cycle_delta > 2300) && (cycle_delta <= 2900))
gmcast_stats.cycle_recv_in_time++;
if ((cycle_delta > 2900) && (cycle_delta <= 3500))
gmcast_stats.cycle_recv_over_2900usec++;
if ((cycle_delta > 3500) && (cycle_delta <= 5000))
gmcast_stats.cycle_recv_over_3500usec++;
if ((cycle_delta > 5000) && (cycle_delta <= 10000))
gmcast_stats.cycle_recv_over_5000usec++;
if ((cycle_delta > 10000) && (cycle_delta <= 15000))
gmcast_stats.cycle_recv_over_10000usec++;
if (cycle_delta > 15000)
gmcast_stats.cycle_recv_over_15000usec++;
}
/* Update the last received mcast cycle value */
prev_mcast_sec = pmbuf->in_ts_sec;
prev_mcast_usec = pmbuf->in_ts_usec;
}
/** /**
* @brief This function checks the conditions and sends packet to device * @brief This function checks the conditions and sends packet to device
* *
@ -112,6 +190,7 @@ mlan_status wlan_process_tx(pmlan_private priv, pmlan_buffer pmbuf,
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
PTxPD plocal_tx_pd = MNULL; PTxPD plocal_tx_pd = MNULL;
#endif #endif
t_u8 dest_mac_first_octet = 0;
ENTER(); ENTER();
head_ptr = (t_u8 *)priv->ops.process_txpd(priv, pmbuf); head_ptr = (t_u8 *)priv->ops.process_txpd(priv, pmbuf);
@ -124,6 +203,11 @@ mlan_status wlan_process_tx(pmlan_private priv, pmlan_buffer pmbuf,
if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA)
plocal_tx_pd = (TxPD *)(head_ptr + priv->intf_hr_len); plocal_tx_pd = (TxPD *)(head_ptr + priv->intf_hr_len);
#endif #endif
dest_mac_first_octet = *(head_ptr + priv->intf_hr_len + sizeof(TxPD) +
DEST_MAC_OFFSET);
if (dest_mac_first_octet & 0x01)
wlan_drv_mcast_cycle_delay_calulation(pmadapter, pmbuf);
if (pmadapter->tp_state_on) if (pmadapter->tp_state_on)
pmadapter->callbacks.moal_tp_accounting(pmadapter->pmoal_handle, pmadapter->callbacks.moal_tp_accounting(pmadapter->pmoal_handle,
pmbuf, 4); pmbuf, 4);

View file

@ -197,7 +197,8 @@ static mlan_status uap_process_cmdresp_error(mlan_private *pmpriv,
ENTER(); ENTER();
if (resp->command != HostCmd_CMD_WMM_PARAM_CONFIG && if (resp->command != HostCmd_CMD_WMM_PARAM_CONFIG &&
resp->command != HostCmd_CMD_CHAN_REGION_CFG) resp->command != HostCmd_CMD_CHAN_REGION_CFG &&
resp->command != HostCmd_CMD_REGION_POWER_CFG)
PRINTM(MERROR, "CMD_RESP: cmd %#x error, result=%#x\n", PRINTM(MERROR, "CMD_RESP: cmd %#x error, result=%#x\n",
resp->command, resp->result); resp->command, resp->result);
if (pioctl_buf) if (pioctl_buf)
@ -291,6 +292,10 @@ static mlan_status uap_process_cmdresp_error(mlan_private *pmpriv,
ret = MLAN_STATUS_SUCCESS; ret = MLAN_STATUS_SUCCESS;
PRINTM(MCMND, "FW don't support chan region cfg command!\n"); PRINTM(MCMND, "FW don't support chan region cfg command!\n");
break; break;
case HostCmd_CMD_REGION_POWER_CFG:
ret = MLAN_STATUS_SUCCESS;
PRINTM(MCMND, "FW don't support region power cfg command!\n");
break;
case HostCmd_CMD_802_11_REMAIN_ON_CHANNEL: case HostCmd_CMD_802_11_REMAIN_ON_CHANNEL:
if (resp->result == HostCmd_RESULT_BUSY) if (resp->result == HostCmd_RESULT_BUSY)
pmadapter->dbg.num_remain_chan_err++; pmadapter->dbg.num_remain_chan_err++;
@ -711,7 +716,11 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
t_u8 zero_mac[] = {0, 0, 0, 0, 0, 0}; t_u8 zero_mac[] = {0, 0, 0, 0, 0, 0};
t_u16 i; t_u16 i;
t_u16 ac; t_u16 ac;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
int rx_mcs_supp = 0; int rx_mcs_supp = 0;
#endif
ENTER(); ENTER();
if (pioctl_buf == MNULL) { if (pioctl_buf == MNULL) {
@ -1320,9 +1329,13 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
memcpy_ext(pmpriv->adapter, tlv_htcap->ht_cap.supported_mcs_set, memcpy_ext(pmpriv->adapter, tlv_htcap->ht_cap.supported_mcs_set,
bss->param.bss_config.supported_mcs_set, 16, bss->param.bss_config.supported_mcs_set, 16,
sizeof(tlv_htcap->ht_cap.supported_mcs_set)); sizeof(tlv_htcap->ht_cap.supported_mcs_set));
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
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) ||
IS_CARDAW693(pmpriv->adapter->card_type)) {
if (bss->param.bss_config.supported_mcs_set[0]) { if (bss->param.bss_config.supported_mcs_set[0]) {
if (bss->param.bss_config.bandcfg.chanBand == if (bss->param.bss_config.bandcfg.chanBand ==
BAND_5GHZ) BAND_5GHZ)
@ -1346,6 +1359,7 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv,
} }
} }
} }
#endif
tlv_htcap->ht_cap.ht_ext_cap = tlv_htcap->ht_cap.ht_ext_cap =
wlan_cpu_to_le16(bss->param.bss_config.ht_ext_cap); wlan_cpu_to_le16(bss->param.bss_config.ht_ext_cap);
tlv_htcap->ht_cap.tx_bf_cap = tlv_htcap->ht_cap.tx_bf_cap =
@ -3529,7 +3543,7 @@ static mlan_status wlan_uap_cmd_key_material(pmlan_private pmpriv,
PRINTM(MCMND, "Remove Key\n"); PRINTM(MCMND, "Remove Key\n");
goto done; goto done;
} }
pkey_material->action = wlan_cpu_to_le16(HostCmd_ACT_GEN_SET); pkey_material->action = wlan_cpu_to_le16(cmd_action);
pkey_material->key_param_set.key_idx = pkey->key_index & KEY_INDEX_MASK; pkey_material->key_param_set.key_idx = pkey->key_index & KEY_INDEX_MASK;
pkey_material->key_param_set.type = pkey_material->key_param_set.type =
wlan_cpu_to_le16(TLV_TYPE_KEY_PARAM_V2); wlan_cpu_to_le16(TLV_TYPE_KEY_PARAM_V2);
@ -4567,6 +4581,9 @@ static mlan_status wlan_ret_add_station(pmlan_private pmpriv,
return MLAN_STATUS_SUCCESS; return MLAN_STATUS_SUCCESS;
} }
extern Stats_mcast_drv_t gmcast_stats;
extern t_u8 mcast_drv_update_allow_flag;
#define OP_RESET 3
/** /**
* @brief This function prepares command of per peer stats * @brief This function prepares command of per peer stats
* *
@ -4600,6 +4617,13 @@ static mlan_status wlan_cmd_stats(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd,
(Stats_Cfg_Params_TLV_t *)stats_cmd->tlv_buffer; (Stats_Cfg_Params_TLV_t *)stats_cmd->tlv_buffer;
*cfg_param = *stats_param; *cfg_param = *stats_param;
} }
/* To identify the reset operation */
if (stats_param->op == OP_RESET) {
mcast_drv_update_allow_flag = MFALSE;
memset(pmpriv->adapter, &gmcast_stats, 0,
sizeof(Stats_mcast_drv_t));
mcast_drv_update_allow_flag = MTRUE;
}
} else { } else {
cmd->size = cmd->size =
wlan_cpu_to_le16(sizeof(HostCmd_DS_STATS) + S_DS_GEN); wlan_cpu_to_le16(sizeof(HostCmd_DS_STATS) + S_DS_GEN);
@ -4624,6 +4648,7 @@ static mlan_status wlan_ret_stats(pmlan_private pmpriv,
{ {
HostCmd_DS_STATS *cfg_cmd = (HostCmd_DS_STATS *)&resp->params.stats; HostCmd_DS_STATS *cfg_cmd = (HostCmd_DS_STATS *)&resp->params.stats;
mlan_ds_misc_cfg *misc_cfg = MNULL; mlan_ds_misc_cfg *misc_cfg = MNULL;
Stats_Cfg_Params_TLV_t *stats_param = MNULL;
t_u8 *pBuf = (t_u8 *)&cfg_cmd->tlv_buffer; t_u8 *pBuf = (t_u8 *)&cfg_cmd->tlv_buffer;
int len = resp->size; int len = resp->size;
@ -4636,6 +4661,29 @@ static mlan_status wlan_ret_stats(pmlan_private pmpriv,
len); len);
misc_cfg->param.stats.tlv_len = len; misc_cfg->param.stats.tlv_len = len;
pioctl_buf->buf_len = sizeof(mlan_ds_stats) + len - 1; pioctl_buf->buf_len = sizeof(mlan_ds_stats) + len - 1;
stats_param =
(Stats_Cfg_Params_TLV_t *)misc_cfg->param.stats.tlv_buf;
if (stats_param && (stats_param->tlvHeader.type ==
NXP_802_11_PER_PEER_STATS_ENTRY_TLV_ID)) {
/* add the mcast drv stats */
mcast_drv_update_allow_flag = MFALSE;
/* Adding the Mcast drv stats to stats tlv_buf */
memcpy_ext(pmpriv->adapter,
(t_u8 *)(((t_u8 *)&misc_cfg->param.stats
.tlv_buf) +
len),
(t_u8 *)&gmcast_stats,
sizeof(Stats_mcast_drv_t),
sizeof(Stats_mcast_drv_t));
mcast_drv_update_allow_flag = MTRUE;
/* Updating the tlv_len */
misc_cfg->param.stats.tlv_len =
len + sizeof(Stats_mcast_drv_t);
pioctl_buf->buf_len = sizeof(mlan_ds_stats) + len +
sizeof(Stats_mcast_drv_t) - 1;
}
} }
LEAVE(); LEAVE();
@ -4933,6 +4981,13 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
sizeof(HostCmd_DS_CHAN_REGION_CFG) + S_DS_GEN); sizeof(HostCmd_DS_CHAN_REGION_CFG) + S_DS_GEN);
cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action); cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action);
break; break;
case HostCmd_CMD_REGION_POWER_CFG:
cmd_ptr->command = wlan_cpu_to_le16(cmd_no);
cmd_ptr->size = wlan_cpu_to_le16(
sizeof(HostCmd_DS_REGION_POWER_CFG) + S_DS_GEN);
cmd_ptr->params.rg_power_cfg.action =
wlan_cpu_to_le16(cmd_action);
break;
case HostCmd_CMD_802_11_NET_MONITOR: case HostCmd_CMD_802_11_NET_MONITOR:
ret = wlan_cmd_net_monitor(pmpriv, cmd_ptr, cmd_action, ret = wlan_cmd_net_monitor(pmpriv, cmd_ptr, cmd_action,
pdata_buf); pdata_buf);
@ -5059,6 +5114,13 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no,
ret = wlan_cmd_802_11_scan_ext(pmpriv, cmd_ptr, pdata_buf); ret = wlan_cmd_802_11_scan_ext(pmpriv, cmd_ptr, pdata_buf);
break; break;
#endif #endif
case HostCmd_CMD_802_11_TX_FRAME:
ret = wlan_cmd_tx_frame(pmpriv, cmd_ptr, cmd_action, pdata_buf);
break;
case HostCmd_CMD_EDMAC_CFG:
ret = wlan_cmd_edmac_cfg(pmpriv, cmd_ptr, cmd_action,
pdata_buf);
break;
default: default:
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no); PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
if (pioctl_req) if (pioctl_req)
@ -5131,10 +5193,6 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
wlan_11h_radar_detected_callback((t_void *)pmpriv); wlan_11h_radar_detected_callback((t_void *)pmpriv);
wlan_coex_ampdu_rxwinsize(pmadapter); wlan_coex_ampdu_rxwinsize(pmadapter);
pmpriv->uap_host_based = 0; pmpriv->uap_host_based = 0;
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break; break;
case HostCmd_CMD_APCMD_BSS_START: case HostCmd_CMD_APCMD_BSS_START:
if (!pmpriv->intf_state_11h.is_11h_host && if (!pmpriv->intf_state_11h.is_11h_host &&
@ -5154,13 +5212,12 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
pmpriv->uap_bss_started = MFALSE; pmpriv->uap_bss_started = MFALSE;
pmpriv->uap_host_based = 0; pmpriv->uap_host_based = 0;
ret = wlan_uap_ret_sys_reset(pmpriv, resp, pioctl_buf); ret = wlan_uap_ret_sys_reset(pmpriv, resp, pioctl_buf);
wlan_11h_reset_dfs_checking_chan_dfs_state(priv, DFS_USABLE); if (!(wlan_is_etsi_country(pmpriv->adapter,
pmpriv->adapter->country_code)))
wlan_11h_reset_dfs_checking_chan_dfs_state(priv,
DFS_USABLE);
wlan_11h_check_update_radar_det_state(pmpriv); wlan_11h_check_update_radar_det_state(pmpriv);
wlan_coex_ampdu_rxwinsize(pmadapter); wlan_coex_ampdu_rxwinsize(pmadapter);
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break; break;
case HostCmd_CMD_APCMD_SYS_INFO: case HostCmd_CMD_APCMD_SYS_INFO:
break; break;
@ -5384,6 +5441,8 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
case HostCmd_CMD_CHAN_REGION_CFG: case HostCmd_CMD_CHAN_REGION_CFG:
ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf); ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf);
break; break;
case HostCmd_CMD_REGION_POWER_CFG:
break;
case HostCmd_CMD_PACKET_AGGR_CTRL: case HostCmd_CMD_PACKET_AGGR_CTRL:
ret = wlan_ret_packet_aggr_ctrl(pmpriv, resp, pioctl_buf); ret = wlan_ret_packet_aggr_ctrl(pmpriv, resp, pioctl_buf);
break; break;
@ -5483,6 +5542,10 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no,
pmadapter->curr_cmd->pioctl_buf = MNULL; pmadapter->curr_cmd->pioctl_buf = MNULL;
break; break;
#endif #endif
case HostCmd_CMD_802_11_TX_FRAME:
break;
case HostCmd_CMD_EDMAC_CFG:
break;
default: default:
PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n", PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
resp->command); resp->command);
@ -5567,10 +5630,6 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
wlan_coex_ampdu_rxwinsize(pmadapter); wlan_coex_ampdu_rxwinsize(pmadapter);
if (wlan_11h_radar_detect_required(pmpriv, pmpriv->uap_channel)) if (wlan_11h_radar_detect_required(pmpriv, pmpriv->uap_channel))
wlan_11h_update_dfs_master_state_by_uap(pmpriv); wlan_11h_update_dfs_master_state_by_uap(pmpriv);
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break; break;
case EVENT_MICRO_AP_BSS_ACTIVE: case EVENT_MICRO_AP_BSS_ACTIVE:
PRINTM(MEVENT, "EVENT: MICRO_AP_BSS_ACTIVE\n"); PRINTM(MEVENT, "EVENT: MICRO_AP_BSS_ACTIVE\n");

View file

@ -1042,7 +1042,7 @@ wlan_uap_sec_ioctl_set_encrypt_key(pmlan_adapter pmadapter,
ENTER(); ENTER();
sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf; sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf;
if (pioctl_req->action != MLAN_ACT_SET) { if ((pioctl_req->action != MLAN_ACT_SET)) {
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
LEAVE(); LEAVE();
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
@ -1055,7 +1055,7 @@ wlan_uap_sec_ioctl_set_encrypt_key(pmlan_adapter pmadapter,
} }
ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_KEY_MATERIAL, ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_KEY_MATERIAL,
HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED, pioctl_req->action, KEY_INFO_ENABLED,
(t_void *)pioctl_req, &sec->param.encrypt_key); (t_void *)pioctl_req, &sec->param.encrypt_key);
if (ret == MLAN_STATUS_SUCCESS) if (ret == MLAN_STATUS_SUCCESS)
@ -2127,6 +2127,13 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
pmadapter->max_sta_conn; pmadapter->max_sta_conn;
pget_info->param.fw_info.uuid_lo = pmadapter->uuid_lo; pget_info->param.fw_info.uuid_lo = pmadapter->uuid_lo;
pget_info->param.fw_info.uuid_hi = pmadapter->uuid_hi; pget_info->param.fw_info.uuid_hi = pmadapter->uuid_hi;
pget_info->param.fw_info.cmd_tx_data =
IS_FW_SUPPORT_CMD_TX_DATA(pmadapter) ? 0x01 :
0x00;
pget_info->param.fw_info.sec_rgpower =
IS_FW_SUPPORT_SEC_RG_POWER(pmadapter) ? 0x01 :
0x00;
} else if (pget_info->sub_command == MLAN_OID_LINK_STATS) } else if (pget_info->sub_command == MLAN_OID_LINK_STATS)
status = wlan_ioctl_link_statistic(pmpriv, pioctl_req); status = wlan_ioctl_link_statistic(pmpriv, pioctl_req);
break; break;
@ -2305,6 +2312,9 @@ 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_GET_REGIONPWR_CFG) if (misc->sub_command == MLAN_OID_MISC_GET_REGIONPWR_CFG)
status = wlan_get_rgchnpwr_cfg(pmadapter, pioctl_req); status = wlan_get_rgchnpwr_cfg(pmadapter, pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_REGION_POWER_CFG)
status = wlan_misc_region_power_cfg(pmadapter,
pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_CFP_TABLE) if (misc->sub_command == MLAN_OID_MISC_CFP_TABLE)
status = wlan_get_cfp_table(pmadapter, pioctl_req); status = wlan_get_cfp_table(pmadapter, pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_RANGE_EXT) if (misc->sub_command == MLAN_OID_MISC_RANGE_EXT)
@ -2321,6 +2331,12 @@ 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_EXT_CAP_CFG) if (misc->sub_command == MLAN_OID_MISC_EXT_CAP_CFG)
status = wlan_misc_ext_capa_cfg(pmadapter, pioctl_req); status = wlan_misc_ext_capa_cfg(pmadapter, pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_TX_FRAME)
status =
wlan_misc_ioctl_tx_frame(pmadapter, pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_EDMAC_CONFIG)
status = wlan_misc_ioctl_edmac_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

@ -1876,6 +1876,12 @@ t_void wlan_wmm_init(pmlan_adapter pmadapter)
MLAN_WFD_AMPDU_DEF_TXRXWINSIZE; MLAN_WFD_AMPDU_DEF_TXRXWINSIZE;
} }
#endif #endif
if (priv->bss_type == MLAN_BSS_TYPE_NAN) {
priv->add_ba_param.tx_win_size =
MLAN_NAN_AMPDU_DEF_TXRXWINSIZE;
priv->add_ba_param.rx_win_size =
MLAN_NAN_AMPDU_DEF_TXRXWINSIZE;
}
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
if (priv->bss_type == MLAN_BSS_TYPE_UAP) { if (priv->bss_type == MLAN_BSS_TYPE_UAP) {
priv->add_ba_param.tx_win_size = priv->add_ba_param.tx_win_size =
@ -2502,7 +2508,7 @@ t_u8 wlan_wmm_compute_driver_packet_delay(pmlan_private priv,
t_u8 ret_val = 0; t_u8 ret_val = 0;
t_u32 out_ts_sec, out_ts_usec; t_u32 out_ts_sec, out_ts_usec;
t_s32 queue_delay; t_s32 queue_delay;
t_s32 temp_delay = 0;
ENTER(); ENTER();
priv->adapter->callbacks.moal_get_system_time( priv->adapter->callbacks.moal_get_system_time(
@ -2514,9 +2520,17 @@ t_u8 wlan_wmm_compute_driver_packet_delay(pmlan_private priv,
priv->adapter->callbacks.moal_tp_accounting( priv->adapter->callbacks.moal_tp_accounting(
priv->adapter->pmoal_handle, pmbuf, 11); priv->adapter->pmoal_handle, pmbuf, 11);
} }
queue_delay = (t_s32)(out_ts_sec - pmbuf->in_ts_sec) * 1000; if (!wlan_secure_sub(&out_ts_sec, pmbuf->in_ts_sec, &temp_delay,
queue_delay += (t_s32)(out_ts_usec - pmbuf->in_ts_usec) / 1000; TYPE_SINT32))
PRINTM(MERROR, "%s:TS(sec) not valid \n", __func__);
queue_delay = temp_delay * 1000;
if (!wlan_secure_sub(&out_ts_usec, pmbuf->in_ts_usec, &temp_delay,
TYPE_SINT32))
PRINTM(MERROR, "%s:TS(usec) not valid \n", __func__);
queue_delay += temp_delay / 1000;
/* /*
* Queue delay is passed as a uint8 in units of 2ms (ms shifted * Queue delay is passed as a uint8 in units of 2ms (ms shifted
* by 1). Min value (other than 0) is therefore 2ms, max is 510ms. * by 1). Min value (other than 0) is therefore 2ms, max is 510ms.

View file

@ -24,7 +24,7 @@
#define _MLAN_DECL_H_ #define _MLAN_DECL_H_
/** MLAN release version */ /** MLAN release version */
#define MLAN_RELEASE_VERSION "408.p2" #define MLAN_RELEASE_VERSION "423.p1"
/** Re-define generic data types for MLAN/MOAL */ /** Re-define generic data types for MLAN/MOAL */
/** Signed char (1-byte) */ /** Signed char (1-byte) */
@ -157,10 +157,6 @@ typedef t_s32 t_sval;
/** This is current limit on Maximum Rx AMPDU allowed */ /** This is current limit on Maximum Rx AMPDU allowed */
#define MLAN_MAX_RX_BASTREAM_SUPPORTED 16 #define MLAN_MAX_RX_BASTREAM_SUPPORTED 16
#ifndef UINT_MAX
#define UINT_MAX (~0U)
#endif
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
/** Default Win size attached during ADDBA request */ /** Default Win size attached during ADDBA request */
#define MLAN_STA_AMPDU_DEF_TXWINSIZE 64 #define MLAN_STA_AMPDU_DEF_TXWINSIZE 64
@ -185,6 +181,11 @@ typedef t_s32 t_sval;
#define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16 #define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16
#endif #endif
/** NAN use the same window size for tx/rx */
#define MLAN_NAN_AMPDU_DEF_TXRXWINSIZE 16
/** RX winsize for COEX */
#define MLAN_NAN_COEX_AMPDU_DEF_RXWINSIZE 16
/** Block ack timeout value */ /** Block ack timeout value */
#define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff #define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff
/** Maximum Tx Win size configured for ADDBA request [10 bits] */ /** Maximum Tx Win size configured for ADDBA request [10 bits] */
@ -273,9 +274,14 @@ typedef t_s32 t_sval;
/** pcie inband reset */ /** pcie inband reset */
#define FW_RELOAD_PCIE_INBAND_RESET 6 #define FW_RELOAD_PCIE_INBAND_RESET 6
/** auto fw reload enable */
#define AUTO_FW_RELOAD_ENABLE MBIT(0)
/** auto fw reload enable pcie inband reset */
#define AUTO_FW_RELOAD_PCIE_INBAND_RESET MBIT(1)
#ifdef PCIE #ifdef PCIE
/* Interrupt type */ /* Interrupt type */
enum { RX_DATA, RX_EVENT, TX_COMPLETE, RX_CMD_RESP }; enum { RX_DATA, RX_EVENT, TX_COMPLETE, RX_CMD_RESP, RX_CMD_DNLD };
#endif #endif
#ifdef USB #ifdef USB
#define MLAN_USB_BLOCK_SIZE (512) #define MLAN_USB_BLOCK_SIZE (512)
@ -747,6 +753,7 @@ typedef enum _mlan_bss_type {
#ifdef WIFI_DIRECT_SUPPORT #ifdef WIFI_DIRECT_SUPPORT
MLAN_BSS_TYPE_WIFIDIRECT = 2, MLAN_BSS_TYPE_WIFIDIRECT = 2,
#endif #endif
MLAN_BSS_TYPE_NAN = 4,
MLAN_BSS_TYPE_DFS = 8, MLAN_BSS_TYPE_DFS = 8,
MLAN_BSS_TYPE_ANY = 0xff, MLAN_BSS_TYPE_ANY = 0xff,
} mlan_bss_type; } mlan_bss_type;
@ -803,6 +810,8 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024, MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025, MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026, MLAN_EVENT_ID_FW_BW_CHANGED = 0x00000026,
MLAN_EVENT_ID_FW_IBSS_CONNECT = 0x00000028,
MLAN_EVENT_ID_FW_IBSS_DISCONNECT = 0x00000029,
MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B, MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED = 0x0000002B,
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
@ -845,6 +854,7 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020, MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
#endif #endif
MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023, MLAN_EVENT_ID_FW_ROAM_OFFLOAD_RESULT = 0x80000023,
MLAN_EVENT_ID_NAN_STARTED = 0x80000024,
MLAN_EVENT_ID_DRV_RTT_RESULT = 0x80000025, MLAN_EVENT_ID_DRV_RTT_RESULT = 0x80000025,
MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026, MLAN_EVENT_ID_DRV_ASSOC_FAILURE_LOGGER = 0x80000026,
MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027, MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027,
@ -857,7 +867,9 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_DRV_DEFER_RX_EVENT = 0x80000033, MLAN_EVENT_ID_DRV_DEFER_RX_EVENT = 0x80000033,
MLAN_EVENT_ID_DRV_DEFER_CMDRESP = 0x80000034, MLAN_EVENT_ID_DRV_DEFER_CMDRESP = 0x80000034,
MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035, MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035,
MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE = 0x80000036,
#endif #endif
MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH = 0x80000037,
} mlan_event_id; } mlan_event_id;
/** Data Structures */ /** Data Structures */
@ -907,7 +919,9 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t {
#define OID_TYPE_CAL 0x2 #define OID_TYPE_CAL 0x2
#define OID_TYPE_DPD 0xa #define OID_TYPE_DPD 0xa
#define NONE_TYPE_DPD 0xb
#define UNKNOW_DPD_LENGTH 0xffffffff #define UNKNOW_DPD_LENGTH 0xffffffff
#define NONE_DPD_LENGTH 0xfafafafa
/** Custom data structure */ /** Custom data structure */
typedef struct _mlan_init_param { typedef struct _mlan_init_param {
@ -1291,7 +1305,19 @@ typedef MLAN_PACK_START struct _mc_txcontrol {
/** mc_pkt_flags */ /** mc_pkt_flags */
t_u8 mc_pkt_flags; t_u8 mc_pkt_flags;
} MLAN_PACK_END mc_txcontrol, *pmc_txcontrol; } MLAN_PACK_END mc_txcontrol, *pmc_txcontrol;
typedef MLAN_PACK_START struct MAPP_Stats_Mcast_drv {
t_u32 cycle_recv_under_2300usec;
t_u32 cycle_recv_in_time;
t_u32 cycle_recv_over_2900usec;
t_u32 cycle_recv_over_3500usec;
t_u32 cycle_recv_over_5000usec;
t_u32 cycle_recv_over_10000usec;
t_u32 cycle_recv_over_15000usec;
t_u32 spent_time_under_1000usec;
t_u32 spent_time_over_1000usec;
t_u32 spent_time_over_2000usec;
t_u32 spent_time_over_3000usec;
} MLAN_PACK_END Stats_mcast_drv_t, *pStats_mcast_drv_t;
/** mlan_buffer data structure */ /** mlan_buffer data structure */
typedef struct _mlan_buffer { typedef struct _mlan_buffer {
/** Pointer to previous mlan_buffer */ /** Pointer to previous mlan_buffer */
@ -2782,4 +2808,97 @@ MLAN_API void mlan_process_pcie_interrupt_cb(t_void *pmadapter, int type);
#define CSI_SIGNATURE 0xABCD #define CSI_SIGNATURE 0xABCD
/** secure add/sub **/
#ifndef SINT8_MAX
#define SINT8_MAX 0x7f
#endif
#ifndef SINT8_MIN
#define SINT8_MIN 0x80
#endif
#ifndef UINT8_MAX
#define UINT8_MAX 0xff
#endif
#ifndef SINT16_MAX
#define SINT16_MAX 0x7fff
#endif
#ifndef SINT16_MIN
#define SINT16_MIN 0x8000
#endif
#ifndef UINT16_MAX
#define UINT16_MAX 0xffff
#endif
#ifndef SINT32_MAX
#define SINT32_MAX 0x7fffffff
#endif
#ifndef SINT32_MIN
#define SINT32_MIN 0x80000000
#endif
#ifndef UINT32_MAX
#define UINT32_MAX 0xffffffff
#endif
#ifndef SINT64_MAX
#define SINT64_MAX 0x7fffffffffffffff
#endif
#ifndef SINT64_MIN
#define SINT64_MIN 0x8000000000000000
#endif
#ifndef UINT64_MAX
#define UINT64_MAX 0xffffffffffffffff
#endif
#ifndef PTR_MAX
#ifdef MLAN_64BIT
#define PTR_MAX UINT64_MAX
#else
#define PTR_MAX UINT32_MAX
#endif
#endif
#ifndef SINT_MAX
#ifdef MLAN_64BIT
#define SINT_MAX SINT64_MAX
#else
#define SINT_MAX SINT32_MAX
#endif
#endif
#ifndef SINT_MIN
#ifdef MLAN_64BIT
#define SINT_MIN SINT64_MIN
#else
#define SINT_MIN SINT32_MIN
#endif
#endif
#ifndef UINT_MAX
#ifdef MLAN_64BIT
#define UINT_MAX UINT64_MAX
#else
#define UINT_MAX UINT32_MAX
#endif
#endif
typedef enum {
TYPE_SINT8,
TYPE_UINT8,
TYPE_SINT16,
TYPE_UINT16,
TYPE_SINT32,
TYPE_UINT32,
TYPE_SINT64,
TYPE_UINT64,
TYPE_PTR,
} data_type;
#endif /* !_MLAN_DECL_H_ */ #endif /* !_MLAN_DECL_H_ */

View file

@ -319,6 +319,27 @@ typedef MLAN_PACK_START struct {
t_u8 variablep[]; t_u8 variablep[];
} MLAN_PACK_END IEEEtypes_assoc_req; } MLAN_PACK_END IEEEtypes_assoc_req;
/** Assoc Request */
#define SUBTYPE_ASSOC_REQUEST 0
/** Assoc Response */
#define SUBTYPE_ASSOC_RESP 1
/** ReAssoc Request */
#define SUBTYPE_REASSOC_REQUEST 2
/** ReAssoc Request */
#define SUBTYPE_REASSOC_RESP 3
/** Probe Resp */
#define SUBTYPE_PROBE_RESP 5
/** Disassoc Request */
#define SUBTYPE_DISASSOC 10
/** Auth Request */
#define SUBTYPE_AUTH 11
/** Deauth Request */
#define SUBTYPE_DEAUTH 12
/** Action frame */
#define SUBTYPE_ACTION 13
/** beacon */
#define SUBTYPE_BEACON 8
/*Mgmt frame*/ /*Mgmt frame*/
typedef MLAN_PACK_START struct { typedef MLAN_PACK_START struct {
/** frame control */ /** frame control */

View file

@ -89,6 +89,7 @@ enum _mlan_ioctl_req_id {
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
MLAN_OID_ACTION_CHAN_SWITCH = 0x0002001E, MLAN_OID_ACTION_CHAN_SWITCH = 0x0002001E,
#endif #endif
MLAN_OID_BSS_HOST_MLME = 0x0002001F,
/* Radio Configuration Group */ /* Radio Configuration Group */
MLAN_IOCTL_RADIO_CFG = 0x00030000, MLAN_IOCTL_RADIO_CFG = 0x00030000,
@ -376,6 +377,10 @@ enum _mlan_ioctl_req_id {
MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F, MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F,
MLAN_OID_MISC_NAV_MITIGATION = 0x00200090, MLAN_OID_MISC_NAV_MITIGATION = 0x00200090,
MLAN_OID_MISC_LED_CONFIG = 0x00200091, MLAN_OID_MISC_LED_CONFIG = 0x00200091,
MLAN_OID_MISC_TX_FRAME = 0x00200092,
MLAN_OID_MISC_EDMAC_CONFIG = 0x00200093,
MLAN_OID_MISC_GPIO_CFG = 0x00200094,
MLAN_OID_MISC_REGION_POWER_CFG = 0x00200095,
}; };
/** Sub command size */ /** Sub command size */
@ -390,7 +395,6 @@ enum _mlan_act_ioctl {
MLAN_ACT_RESET, MLAN_ACT_RESET,
MLAN_ACT_DEFAULT MLAN_ACT_DEFAULT
}; };
/** Enumeration for generic enable/disable */ /** Enumeration for generic enable/disable */
enum _mlan_act_generic { MLAN_ACT_DISABLE = 0, MLAN_ACT_ENABLE = 1 }; enum _mlan_act_generic { MLAN_ACT_DISABLE = 0, MLAN_ACT_ENABLE = 1 };
@ -1965,6 +1969,9 @@ typedef struct _mlan_fw_info {
/* higher 8 bytes of uuid */ /* higher 8 bytes of uuid */
t_u64 uuid_hi; t_u64 uuid_hi;
/* FW support tx data by cmd */
t_u8 cmd_tx_data;
t_u8 sec_rgpower;
} mlan_fw_info, *pmlan_fw_info; } mlan_fw_info, *pmlan_fw_info;
/** Version string buffer length */ /** Version string buffer length */
@ -4104,7 +4111,9 @@ typedef struct _mlan_ds_11ax_llde_cmd {
t_u8 triggerlimit; // cap airtime limit index: auto=0xff t_u8 triggerlimit; // cap airtime limit index: auto=0xff
t_u8 peakULrate; // cap peak UL rate t_u8 peakULrate; // cap peak UL rate
t_u8 dl_llde; // Downlink LLDE: enable=1,disable=0 t_u8 dl_llde; // Downlink LLDE: enable=1,disable=0
t_u16 triggerinterval; // Set trigger frame interval(us): auto=0 t_u16 pollinterval; // Set trigger frame interval(us): auto=0
t_u16 txOpDuration; // Set TxOp duration
t_u16 llde_ctrl; // for other configurations
t_u16 mu_rts_successcnt; t_u16 mu_rts_successcnt;
t_u16 mu_rts_failcnt; t_u16 mu_rts_failcnt;
t_u16 basic_trigger_successcnt; t_u16 basic_trigger_successcnt;
@ -4286,11 +4295,20 @@ enum _mlan_reg_type {
MLAN_REG_CAU = 5, MLAN_REG_CAU = 5,
MLAN_REG_PSU = 6, MLAN_REG_PSU = 6,
MLAN_REG_BCA = 7, MLAN_REG_BCA = 7,
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097) || \
defined(SD9177)
MLAN_REG_CIU = 8, MLAN_REG_CIU = 8,
#endif
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
MLAN_REG_MAC2 = 0x81, MLAN_REG_MAC2 = 0x81,
MLAN_REG_BBP2 = 0x82, MLAN_REG_BBP2 = 0x82,
MLAN_REG_RF2 = 0x83, MLAN_REG_RF2 = 0x83,
MLAN_REG_BCA2 = 0x87 MLAN_REG_BCA2 = 0x87
#endif
}; };
/** Type definition of mlan_ds_reg_rw for MLAN_OID_REG_RW */ /** Type definition of mlan_ds_reg_rw for MLAN_OID_REG_RW */
@ -4490,6 +4508,26 @@ typedef struct _mlan_ds_misc_cmd {
t_u8 cmd[MRVDRV_SIZE_OF_CMD_BUFFER]; t_u8 cmd[MRVDRV_SIZE_OF_CMD_BUFFER];
} mlan_ds_misc_cmd; } mlan_ds_misc_cmd;
/** Type definition of mlan_ds_misc_tx_frame for MLAN_OID_MISC_TX_FRAME */
typedef struct _mlan_ds_misc_tx_frame {
/** Band Configuration */
Band_Config_t bandcfg;
/** channel */
t_u8 channel;
/** Buffer type: data, cmd, event etc. */
mlan_buf_type buf_type;
/** QoS priority */
t_u32 priority;
/** Flags for this buffer */
t_u32 flags;
/** tx_seq_num */
t_u32 tx_seq_num;
/** tx_buf length */
t_u16 data_len;
/** Tx buffer */
t_u8 tx_buf[MRVDRV_SIZE_OF_CMD_BUFFER];
} mlan_ds_misc_tx_frame;
/** Maximum number of system clocks */ /** Maximum number of system clocks */
#define MLAN_MAX_CLK_NUM 16 #define MLAN_MAX_CLK_NUM 16
@ -4766,6 +4804,18 @@ typedef struct _mlan_ds_misc_country_code {
t_u8 country_code[COUNTRY_CODE_LEN]; t_u8 country_code[COUNTRY_CODE_LEN];
} mlan_ds_misc_country_code; } mlan_ds_misc_country_code;
/** Type defination of mlan_ds_gpio_cfg_ops */
typedef struct _mlan_ds_gpio_cfg_ops {
/** Get or Set action */
t_u8 action;
/** Operation type */
t_u8 opsType;
/** pin number */
t_u8 pin_num;
/** pin value */
t_u8 value;
} mlan_ds_gpio_cfg_ops;
/** action for set */ /** action for set */
#define SUBSCRIBE_EVT_ACT_BITWISE_SET 0x0002 #define SUBSCRIBE_EVT_ACT_BITWISE_SET 0x0002
/** action for clear */ /** action for clear */
@ -5490,22 +5540,6 @@ typedef MLAN_PACK_START struct _mlan_ds_misc_tx_rx_histogram {
t_u8 value[1]; t_u8 value[1];
} MLAN_PACK_END mlan_ds_misc_tx_rx_histogram; } MLAN_PACK_END mlan_ds_misc_tx_rx_histogram;
typedef MLAN_PACK_START struct _mlan_ds_cw_mode_ctrl {
/** Mode of Operation 0: Disable 1: Tx Continuous Packet 2: Tx
* Continuous Wave */
t_u8 mode;
/*channel*/
t_u8 channel;
/* channel info*/
t_u8 chanInfo;
/** Tx Power level in dBm */
t_u16 txPower;
/** Packet Length */
t_u16 pktLength;
/** bit rate Info */
t_u32 rateInfo;
} MLAN_PACK_END mlan_ds_cw_mode_ctrl;
#define RX_PKT_INFO MBIT(1) #define RX_PKT_INFO MBIT(1)
/** Struct for per-packet configuration */ /** Struct for per-packet configuration */
typedef struct _mlan_per_pkt_cfg { typedef struct _mlan_per_pkt_cfg {
@ -6124,6 +6158,20 @@ typedef struct _mlan_ds_reorder_flush_time {
t_u16 flush_time_ac_vi_vo; t_u16 flush_time_ac_vi_vo;
} mlan_ds_reorder_flush_time; } mlan_ds_reorder_flush_time;
/** EDMAC configuration parameters */
typedef struct _mlan_ds_ed_mac_cfg {
/** EU adaptivity for 2.4ghz band */
t_u16 ed_ctrl_2g;
/** Energy detect threshold offset for 2.4ghz */
t_s16 ed_offset_2g;
/** EU adaptivity for 5ghz band */
t_u16 ed_ctrl_5g;
/** Energy detect threshold offset for 5ghz */
t_s16 ed_offset_5g;
t_u32 ed_bitmap_txq_lock;
} mlan_ds_ed_mac_cfg;
/** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */ /** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */
typedef struct _mlan_ds_misc_cfg { typedef struct _mlan_ds_misc_cfg {
/** Sub-command */ /** Sub-command */
@ -6140,6 +6188,8 @@ typedef struct _mlan_ds_misc_cfg {
#endif #endif
/** Hostcmd for MLAN_OID_MISC_HOST_CMD */ /** Hostcmd for MLAN_OID_MISC_HOST_CMD */
mlan_ds_misc_cmd hostcmd; mlan_ds_misc_cmd hostcmd;
/** tx_frame for MLAN_OID_MISC_TX_FRAME */
mlan_ds_misc_tx_frame tx_frame;
/** System clock for MLAN_OID_MISC_SYS_CLOCK */ /** System clock for MLAN_OID_MISC_SYS_CLOCK */
mlan_ds_misc_sys_clock sys_clock; mlan_ds_misc_sys_clock sys_clock;
/** WWS set/get for MLAN_OID_MISC_WWS */ /** WWS set/get for MLAN_OID_MISC_WWS */
@ -6241,7 +6291,6 @@ typedef struct _mlan_ds_misc_cfg {
mlan_ds_misc_keep_alive keep_alive; mlan_ds_misc_keep_alive keep_alive;
mlan_ds_misc_keep_alive_rx keep_alive_rx; mlan_ds_misc_keep_alive_rx keep_alive_rx;
mlan_ds_misc_tx_rx_histogram tx_rx_histogram; mlan_ds_misc_tx_rx_histogram tx_rx_histogram;
mlan_ds_cw_mode_ctrl cwmode;
/** Tx/Rx per-packet control */ /** Tx/Rx per-packet control */
t_u8 txrx_pkt_ctrl; t_u8 txrx_pkt_ctrl;
mlan_ds_misc_robustcoex_params robustcoexparams; mlan_ds_misc_robustcoex_params robustcoexparams;
@ -6294,6 +6343,8 @@ typedef struct _mlan_ds_misc_cfg {
mlan_ds_ch_load ch_load; mlan_ds_ch_load ch_load;
mlan_ds_cross_chip_synch cross_chip_synch; mlan_ds_cross_chip_synch cross_chip_synch;
mlan_ds_reorder_flush_time flush_time; mlan_ds_reorder_flush_time flush_time;
mlan_ds_ed_mac_cfg edmac_cfg;
mlan_ds_gpio_cfg_ops gpio_cfg_ops;
} param; } param;
} mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg;

View file

@ -353,6 +353,7 @@ t_u8 woal_ieee_band_to_radio_type(t_u8 ieee_band)
* @param key_index Key index * @param key_index Key index
* @param addr Mac for which key is to be set * @param addr Mac for which key is to be set
* @param disable Key disabled or not * @param disable Key disabled or not
* @param pairwise pairwise flag
* @param wait_option wait option * @param wait_option wait option
* *
* @return MLAN_STATUS_SUCCESS -- success, otherwise fail * @return MLAN_STATUS_SUCCESS -- success, otherwise fail
@ -360,7 +361,7 @@ t_u8 woal_ieee_band_to_radio_type(t_u8 ieee_band)
mlan_status woal_cfg80211_set_key(moal_private *priv, t_u8 is_enable_wep, mlan_status woal_cfg80211_set_key(moal_private *priv, t_u8 is_enable_wep,
t_u32 cipher, const t_u8 *key, int key_len, t_u32 cipher, const t_u8 *key, int key_len,
const t_u8 *seq, int seq_len, t_u8 key_index, const t_u8 *seq, int seq_len, t_u8 key_index,
const t_u8 *addr, int disable, const t_u8 *addr, int disable, t_u8 pairwise,
t_u8 wait_option) t_u8 wait_option)
{ {
mlan_ioctl_req *req = NULL; mlan_ioctl_req *req = NULL;
@ -462,9 +463,16 @@ mlan_status woal_cfg80211_set_key(moal_private *priv, t_u8 is_enable_wep,
ETH_ALEN) == 0) ETH_ALEN) == 0)
sec->param.encrypt_key.key_flags = sec->param.encrypt_key.key_flags =
KEY_FLAG_GROUP_KEY; KEY_FLAG_GROUP_KEY;
else {
#if KERNEL_VERSION(2, 6, 36) < CFG80211_VERSION_CODE
if (!pairwise)
sec->param.encrypt_key.key_flags =
KEY_FLAG_GROUP_KEY;
else else
#endif
sec->param.encrypt_key.key_flags = sec->param.encrypt_key.key_flags =
KEY_FLAG_SET_TX_KEY; KEY_FLAG_SET_TX_KEY;
}
} else { } else {
moal_memcpy_ext(priv->phandle, moal_memcpy_ext(priv->phandle,
sec->param.encrypt_key.mac_addr, sec->param.encrypt_key.mac_addr,
@ -562,13 +570,13 @@ mlan_status woal_cfg80211_set_wep_keys(moal_private *priv, const t_u8 *key,
else else
cipher = WLAN_CIPHER_SUITE_WEP104; cipher = WLAN_CIPHER_SUITE_WEP104;
ret = woal_cfg80211_set_key(priv, 0, cipher, key, key_len, NULL, ret = woal_cfg80211_set_key(priv, 0, cipher, key, key_len, NULL,
0, index, NULL, 0, wait_option); 0, index, NULL, 0, 0, wait_option);
} else { } else {
/* No key provided so it is enable key. We /* No key provided so it is enable key. We
* want to just set the transmit key index * want to just set the transmit key index
*/ */
ret = woal_cfg80211_set_key(priv, 1, cipher, key, key_len, NULL, ret = woal_cfg80211_set_key(priv, 1, cipher, key, key_len, NULL,
0, index, NULL, 0, wait_option); 0, index, NULL, 0, 0, wait_option);
} }
if (ret != MLAN_STATUS_SUCCESS) if (ret != MLAN_STATUS_SUCCESS)
PRINTM(MERROR, "woal_cfg80211_set_wep_keys Fail\n"); PRINTM(MERROR, "woal_cfg80211_set_wep_keys Fail\n");
@ -1523,6 +1531,7 @@ int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
const t_u8 *mac_addr, struct key_params *params) const t_u8 *mac_addr, struct key_params *params)
{ {
moal_private *priv = (moal_private *)woal_get_netdev_priv(netdev); moal_private *priv = (moal_private *)woal_get_netdev_priv(netdev);
t_u8 pairwise_key = MFALSE;
ENTER(); ENTER();
if (priv->ft_pre_connect) { if (priv->ft_pre_connect) {
@ -1533,9 +1542,25 @@ int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
/** cancel pending scan */ /** cancel pending scan */
woal_cancel_scan(priv, MOAL_IOCTL_WAIT); woal_cancel_scan(priv, MOAL_IOCTL_WAIT);
#if KERNEL_VERSION(2, 6, 36) < CFG80211_VERSION_CODE
if (pairwise)
pairwise_key = MTRUE;
if (mac_addr)
PRINTM(MCMND,
"wlan: set_key key_index=%d pairwise=%d " MACSTR
" cipher=0x%x key_len=%d seq_len=%d\n",
key_index, pairwise, MAC2STR(mac_addr), params->cipher,
params->key_len, params->seq_len);
else
PRINTM(MCMND,
"wlan: set_key key_index=%d pairwise=%d cipher=0x%x key_len=%d seq_len=%d\n",
key_index, pairwise, params->cipher, params->key_len,
params->seq_len);
#endif
if (woal_cfg80211_set_key(priv, 0, params->cipher, params->key, if (woal_cfg80211_set_key(priv, 0, params->cipher, params->key,
params->key_len, params->seq, params->seq_len, params->key_len, params->seq, params->seq_len,
key_index, mac_addr, 0, MOAL_IOCTL_WAIT)) { key_index, mac_addr, 0, pairwise_key,
MOAL_IOCTL_WAIT)) {
PRINTM(MERROR, "Error adding the crypto keys\n"); PRINTM(MERROR, "Error adding the crypto keys\n");
LEAVE(); LEAVE();
return -EFAULT; return -EFAULT;
@ -1595,7 +1620,7 @@ int woal_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
*/ */
if (MLAN_STATUS_FAILURE == if (MLAN_STATUS_FAILURE ==
woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0, key_index, woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0, key_index,
mac_addr, 1, MOAL_NO_WAIT)) { mac_addr, 1, 0, MOAL_NO_WAIT)) {
PRINTM(MERROR, "Error deleting the crypto keys\n"); PRINTM(MERROR, "Error deleting the crypto keys\n");
LEAVE(); LEAVE();
return -EFAULT; return -EFAULT;
@ -2659,6 +2684,242 @@ t_u8 woal_check_mgmt_tx_channel(moal_private *priv,
} }
#endif #endif
/*
* @brief transmit management packet
*
* @param priv A pointer moal_private structure
* @param buf Frame buffer
* @param len Frame length
* @param chan A pointer to ieee80211_channel structure
* @param cookie Frame cookie
* @param wait Duration to wait
*
* @return 0 -- success, otherwise fail
*/
int woal_mgmt_tx(moal_private *priv, const u8 *buf, size_t len,
struct ieee80211_channel *chan, u64 cookie, unsigned int wait)
{
int ret = 0;
pmlan_buffer pmbuf = NULL;
t_u8 *pbuf = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
t_u16 packet_len = 0;
t_u16 pkt_len = 0;
t_u32 pkt_type;
t_u32 tx_control;
unsigned long flags;
struct sk_buff *skb = NULL;
struct tx_status_info *tx_info = NULL;
t_u32 remain_len = 0;
t_u32 buf_flags = 0;
t_u8 tx_seq_num = 0;
mlan_ioctl_req *ioctl_req = NULL;
mlan_ds_misc_cfg *misc = NULL;
ENTER();
/* pkt_type + tx_control */
#define HEADER_SIZE 8
packet_len = (t_u16)(len + MLAN_MAC_ADDR_LENGTH);
if (priv->phandle->cmd_tx_data) {
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (ioctl_req == NULL) {
ret = -ENOMEM;
goto done;
}
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
misc->sub_command = MLAN_OID_MISC_TX_FRAME;
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
ioctl_req->action = MLAN_ACT_SET;
if (chan) {
misc->param.tx_frame.bandcfg.chanBand =
woal_ieee_band_to_radio_type(chan->band);
misc->param.tx_frame.channel = chan->hw_value;
}
pbuf = misc->param.tx_frame.tx_buf;
} else {
pmbuf = woal_alloc_mlan_buffer(
priv->phandle, MLAN_MIN_DATA_HEADER_LEN + HEADER_SIZE +
packet_len + sizeof(packet_len));
if (!pmbuf) {
PRINTM(MERROR, "Fail to allocate mlan_buffer\n");
ret = -ENOMEM;
goto done;
}
pmbuf->data_offset = MLAN_MIN_DATA_HEADER_LEN;
pbuf = pmbuf->pbuf + pmbuf->data_offset;
}
pkt_type = MRVL_PKT_TYPE_MGMT_FRAME;
tx_control = 0;
remain_len = HEADER_SIZE + packet_len + sizeof(packet_len);
/* Add pkt_type and tx_control */
moal_memcpy_ext(priv->phandle, pbuf, &pkt_type, sizeof(pkt_type),
remain_len);
remain_len -= sizeof(pkt_type);
moal_memcpy_ext(priv->phandle, pbuf + sizeof(pkt_type), &tx_control,
sizeof(tx_control), remain_len);
remain_len -= sizeof(tx_control);
/* frmctl + durationid + addr1 + addr2 + addr3 + seqctl */
#define PACKET_ADDR4_POS (2 + 2 + 6 + 6 + 6 + 2)
pkt_len = woal_cpu_to_le16(packet_len);
moal_memcpy_ext(priv->phandle, pbuf + HEADER_SIZE, &pkt_len,
sizeof(pkt_len), remain_len);
remain_len -= sizeof(packet_len);
moal_memcpy_ext(priv->phandle, pbuf + HEADER_SIZE + sizeof(packet_len),
buf, PACKET_ADDR4_POS, remain_len);
remain_len -= PACKET_ADDR4_POS;
moal_memcpy_ext(priv->phandle,
pbuf + HEADER_SIZE + sizeof(packet_len) +
PACKET_ADDR4_POS,
addr, MLAN_MAC_ADDR_LENGTH, remain_len);
remain_len -= MLAN_MAC_ADDR_LENGTH;
moal_memcpy_ext(priv->phandle,
pbuf + HEADER_SIZE + sizeof(packet_len) +
PACKET_ADDR4_POS + MLAN_MAC_ADDR_LENGTH,
buf + PACKET_ADDR4_POS, len - PACKET_ADDR4_POS,
remain_len);
DBG_HEXDUMP(MDAT_D, "Mgmt Tx", pbuf,
HEADER_SIZE + packet_len + sizeof(packet_len));
if ((ieee80211_is_action(((struct ieee80211_mgmt *)buf)->frame_control))
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
|| moal_extflg_isset(priv->phandle, EXT_HOST_MLME)
#endif
) {
buf_flags = MLAN_BUF_FLAG_TX_STATUS;
if (!priv->tx_seq_num)
priv->tx_seq_num++;
tx_seq_num = priv->tx_seq_num++;
tx_info = kzalloc(sizeof(struct tx_status_info), GFP_ATOMIC);
if (tx_info) {
skb = alloc_skb(len, GFP_ATOMIC);
if (skb) {
moal_memcpy_ext(priv->phandle, skb->data, buf,
len, len);
skb_put(skb, len);
spin_lock_irqsave(&priv->tx_stat_lock, flags);
tx_info->tx_cookie = cookie;
tx_info->tx_skb = skb;
tx_info->tx_seq_num = tx_seq_num;
if ((priv->bss_role == MLAN_BSS_ROLE_UAP) &&
(priv->phandle->remain_on_channel && !wait))
tx_info->cancel_remain_on_channel =
MTRUE;
INIT_LIST_HEAD(&tx_info->link);
list_add_tail(&tx_info->link,
&priv->tx_stat_queue);
spin_unlock_irqrestore(&priv->tx_stat_lock,
flags);
} else {
kfree(tx_info);
tx_info = NULL;
}
}
}
if (priv->phandle->cmd_tx_data) {
misc->param.tx_frame.data_len =
HEADER_SIZE + packet_len + sizeof(packet_len);
misc->param.tx_frame.buf_type = MLAN_BUF_TYPE_RAW_DATA;
misc->param.tx_frame.priority = 7;
misc->param.tx_frame.flags = buf_flags;
misc->param.tx_frame.tx_seq_num = tx_seq_num;
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
PRINTM(MERROR, "Fail to send packet status=%d\n",
status);
if (tx_info)
woal_remove_tx_info(priv, tx_info->tx_seq_num);
ret = -EFAULT;
goto done;
}
if (!tx_info) {
/* Delay 30ms to guarantee the packet has been already
* tx'ed, because if we call cfg80211_mgmt_tx_status()
* immediately, then wpa_supplicant will call
* cancel_remain_on_channel(), which may affect the mgmt
* frame tx. Meanwhile it is only necessary for P2P
* action handshake to wait 30ms.
*/
if (buf_flags == MLAN_BUF_FLAG_TX_STATUS)
woal_sched_timeout(30);
/* Notify the mgmt tx status */
#if KERNEL_VERSION(2, 6, 37) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 6, 0) > CFG80211_VERSION_CODE
cfg80211_mgmt_tx_status(dev, cookie, buf, len, true,
GFP_ATOMIC);
#else
cfg80211_mgmt_tx_status(priv->wdev, cookie, buf, len,
true, GFP_ATOMIC);
#endif
#endif
}
} else {
pmbuf->data_len = HEADER_SIZE + packet_len + sizeof(packet_len);
pmbuf->buf_type = MLAN_BUF_TYPE_RAW_DATA;
pmbuf->bss_index = priv->bss_index;
pmbuf->flags = buf_flags;
pmbuf->tx_seq_num = tx_seq_num;
status = mlan_send_packet(priv->phandle->pmlan_adapter, pmbuf);
switch (status) {
case MLAN_STATUS_PENDING:
atomic_inc(&priv->phandle->tx_pending);
queue_work(priv->phandle->workqueue,
&priv->phandle->main_work);
/* Delay 30ms to guarantee the packet has been already
* tx'ed, because if we call cfg80211_mgmt_tx_status()
* immediately, then wpa_supplicant will call
* cancel_remain_on_channel(), which may affect the mgmt
* frame tx. Meanwhile it is only necessary for P2P
* action handshake to wait 30ms.
*/
if (buf_flags == MLAN_BUF_FLAG_TX_STATUS) {
if (tx_info)
break;
else
woal_sched_timeout(30);
}
/* Notify the mgmt tx status */
#if KERNEL_VERSION(2, 6, 37) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 6, 0) > CFG80211_VERSION_CODE
cfg80211_mgmt_tx_status(dev, cookie, buf, len, true,
GFP_ATOMIC);
#else
cfg80211_mgmt_tx_status(priv->wdev, cookie, buf, len,
true, GFP_ATOMIC);
#endif
#endif
break;
case MLAN_STATUS_SUCCESS:
woal_free_mlan_buffer(priv->phandle, pmbuf);
break;
case MLAN_STATUS_FAILURE:
default:
woal_free_mlan_buffer(priv->phandle, pmbuf);
ret = -EFAULT;
break;
}
}
done:
if (priv->phandle->cmd_tx_data) {
if (status != MLAN_STATUS_PENDING)
kfree(ioctl_req);
} else {
if (status != MLAN_STATUS_PENDING) {
if (tx_info)
woal_remove_tx_info(priv, tx_info->tx_seq_num);
}
}
LEAVE();
return ret;
}
#if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(3, 2, 0) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 3, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(3, 3, 0) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 6, 0) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(3, 6, 0) <= CFG80211_VERSION_CODE
@ -2804,25 +3065,13 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
#endif #endif
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
int ret = 0; int ret = 0;
pmlan_buffer pmbuf = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
t_u16 packet_len = 0;
t_u16 pkt_len = 0;
t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
t_u32 pkt_type;
t_u32 tx_control;
#if KERNEL_VERSION(2, 6, 39) <= CFG80211_VERSION_CODE #if KERNEL_VERSION(2, 6, 39) <= CFG80211_VERSION_CODE
t_u8 channel_status; t_u8 channel_status;
t_u32 duration; t_u32 duration;
moal_private *remain_priv = NULL; moal_private *remain_priv = NULL;
#endif #endif
unsigned long flags;
struct sk_buff *skb = NULL;
struct tx_status_info *tx_info = NULL;
t_u32 remain_len = 0;
t_u16 fc, type, stype; t_u16 fc, type, stype;
ENTER(); ENTER();
if (buf == NULL || len == 0) { if (buf == NULL || len == 0) {
@ -2856,7 +3105,8 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
case IEEE80211_STYPE_DEAUTH: case IEEE80211_STYPE_DEAUTH:
case IEEE80211_STYPE_DISASSOC: case IEEE80211_STYPE_DISASSOC:
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
if (!priv->bss_started) { if ((priv->bss_role == MLAN_BSS_ROLE_UAP) &&
!priv->bss_started) {
PRINTM(MCMND, PRINTM(MCMND,
"Drop deauth packet before AP started\n"); "Drop deauth packet before AP started\n");
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
@ -2997,17 +3247,6 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
} }
#endif #endif
/* pkt_type + tx_control */
#define HEADER_SIZE 8
packet_len = (t_u16)(len + MLAN_MAC_ADDR_LENGTH);
pmbuf = woal_alloc_mlan_buffer(priv->phandle,
MLAN_MIN_DATA_HEADER_LEN + HEADER_SIZE +
packet_len + sizeof(packet_len));
if (!pmbuf) {
PRINTM(MERROR, "Fail to allocate mlan_buffer\n");
ret = -ENOMEM;
goto done;
}
#if KERNEL_VERSION(3, 8, 0) > LINUX_VERSION_CODE #if KERNEL_VERSION(3, 8, 0) > LINUX_VERSION_CODE
*cookie = random32() | 1; *cookie = random32() | 1;
#else #else
@ -3017,133 +3256,9 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
*cookie = get_random_u32() | 1; *cookie = get_random_u32() | 1;
#endif #endif
#endif #endif
pmbuf->data_offset = MLAN_MIN_DATA_HEADER_LEN; ret = woal_mgmt_tx(priv, buf, len, chan, *cookie, wait);
pkt_type = MRVL_PKT_TYPE_MGMT_FRAME;
tx_control = 0;
remain_len = HEADER_SIZE + packet_len + sizeof(packet_len);
/* Add pkt_type and tx_control */
moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset,
&pkt_type, sizeof(pkt_type), remain_len);
remain_len -= sizeof(pkt_type);
moal_memcpy_ext(priv->phandle,
pmbuf->pbuf + pmbuf->data_offset + sizeof(pkt_type),
&tx_control, sizeof(tx_control), remain_len);
remain_len -= sizeof(tx_control);
/* frmctl + durationid + addr1 + addr2 + addr3 + seqctl */
#define PACKET_ADDR4_POS (2 + 2 + 6 + 6 + 6 + 2)
pkt_len = woal_cpu_to_le16(packet_len);
moal_memcpy_ext(priv->phandle,
pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE,
&pkt_len, sizeof(pkt_len), remain_len);
remain_len -= sizeof(packet_len);
moal_memcpy_ext(priv->phandle,
pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE +
sizeof(packet_len),
buf, PACKET_ADDR4_POS, remain_len);
remain_len -= PACKET_ADDR4_POS;
moal_memcpy_ext(priv->phandle,
pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE +
sizeof(packet_len) + PACKET_ADDR4_POS,
addr, MLAN_MAC_ADDR_LENGTH, remain_len);
remain_len -= MLAN_MAC_ADDR_LENGTH;
moal_memcpy_ext(priv->phandle,
pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE +
sizeof(packet_len) + PACKET_ADDR4_POS +
MLAN_MAC_ADDR_LENGTH,
buf + PACKET_ADDR4_POS, len - PACKET_ADDR4_POS,
remain_len);
pmbuf->data_len = HEADER_SIZE + packet_len + sizeof(packet_len);
pmbuf->buf_type = MLAN_BUF_TYPE_RAW_DATA;
pmbuf->bss_index = priv->bss_index;
if ((ieee80211_is_action(((struct ieee80211_mgmt *)buf)->frame_control))
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
|| moal_extflg_isset(priv->phandle, EXT_HOST_MLME)
#endif
) {
pmbuf->flags = MLAN_BUF_FLAG_TX_STATUS;
if (!priv->tx_seq_num)
priv->tx_seq_num++;
pmbuf->tx_seq_num = priv->tx_seq_num++;
tx_info = kzalloc(sizeof(struct tx_status_info), GFP_ATOMIC);
if (tx_info) {
skb = alloc_skb(len, GFP_ATOMIC);
if (skb) {
moal_memcpy_ext(priv->phandle, skb->data, buf,
len, len);
skb_put(skb, len);
spin_lock_irqsave(&priv->tx_stat_lock, flags);
tx_info->tx_cookie = *cookie;
tx_info->tx_skb = skb;
tx_info->tx_seq_num = pmbuf->tx_seq_num;
if ((priv->bss_role == MLAN_BSS_ROLE_UAP) &&
(priv->phandle->remain_on_channel && !wait))
tx_info->cancel_remain_on_channel =
MTRUE;
INIT_LIST_HEAD(&tx_info->link);
list_add_tail(&tx_info->link,
&priv->tx_stat_queue);
spin_unlock_irqrestore(&priv->tx_stat_lock,
flags);
} else {
kfree(tx_info);
tx_info = NULL;
}
}
}
status = mlan_send_packet(priv->phandle->pmlan_adapter, pmbuf);
switch (status) {
case MLAN_STATUS_PENDING:
atomic_inc(&priv->phandle->tx_pending);
queue_work(priv->phandle->workqueue, &priv->phandle->main_work);
/* Delay 30ms to guarantee the packet has been already tx'ed,
* because if we call cfg80211_mgmt_tx_status() immediately,
* then wpa_supplicant will call cancel_remain_on_channel(),
* which may affect the mgmt frame tx. Meanwhile it is only
* necessary for P2P action handshake to wait 30ms.
*/
if ((ieee80211_is_action(
((struct ieee80211_mgmt *)buf)->frame_control))
#if KERNEL_VERSION(3, 8, 0) <= CFG80211_VERSION_CODE
|| moal_extflg_isset(priv->phandle, EXT_HOST_MLME)
#endif
) {
if (tx_info)
break;
else
woal_sched_timeout(30);
}
/* Notify the mgmt tx status */
#if KERNEL_VERSION(2, 6, 37) <= CFG80211_VERSION_CODE
#if KERNEL_VERSION(3, 6, 0) > CFG80211_VERSION_CODE
cfg80211_mgmt_tx_status(dev, *cookie, buf, len, true,
GFP_ATOMIC);
#else
cfg80211_mgmt_tx_status(priv->wdev, *cookie, buf, len, true,
GFP_ATOMIC);
#endif
#endif
break;
case MLAN_STATUS_SUCCESS:
woal_free_mlan_buffer(priv->phandle, pmbuf);
break;
case MLAN_STATUS_FAILURE:
default:
woal_free_mlan_buffer(priv->phandle, pmbuf);
ret = -EFAULT;
break;
}
done: done:
if (status != MLAN_STATUS_PENDING) {
if (tx_info)
woal_remove_tx_info(priv, tx_info->tx_seq_num);
}
LEAVE(); LEAVE();
return ret; return ret;
} }
@ -4596,6 +4711,7 @@ Bit18: 0x1 (STBC Tx <= 80 MHz)
Bit19: 0x1 (STBC Rx <= 80 MHz) Bit19: 0x1 (STBC Rx <= 80 MHz)
Bit20: 0x1 (Doppler Tx) Bit20: 0x1 (Doppler Tx)
Bit21: 0x1 (Doppler Rx) Bit21: 0x1 (Doppler Rx)
Bit24-25: 0x1 (DCM Max Constellation Tx)
Bit27-28: 0x1 (DCM Max Constellation Rx) Bit27-28: 0x1 (DCM Max Constellation Rx)
Bit31: 0x1 (SU Beamformer) Bit31: 0x1 (SU Beamformer)
Bit32: 0x1 (SU BeamFormee) Bit32: 0x1 (SU BeamFormee)
@ -4609,16 +4725,16 @@ Bit59-61: 0x1 (Max Nc)
Bit75: 0x1 (Rx 1024-QAM Support < 242-tone RU) Bit75: 0x1 (Rx 1024-QAM Support < 242-tone RU)
*/ */
#define UAP_HE_MAC_CAP0_MASK 0x00 #define UAP_HE_MAC_CAP0_MASK 0x06
#define UAP_HE_MAC_CAP1_MASK 0x00 #define UAP_HE_MAC_CAP1_MASK 0x00
#define UAP_HE_MAC_CAP2_MASK 0x00 #define UAP_HE_MAC_CAP2_MASK 0x10
#define UAP_HE_MAC_CAP3_MASK 0x02 #define UAP_HE_MAC_CAP3_MASK 0x02
#define UAP_HE_MAC_CAP4_MASK 0x00 #define UAP_HE_MAC_CAP4_MASK 0x00
#define UAP_HE_MAC_CAP5_MASK 0x00 #define UAP_HE_MAC_CAP5_MASK 0x00
#define UAP_HE_PHY_CAP0_MASK 0x04 #define UAP_HE_PHY_CAP0_MASK 0x04
#define UAP_HE_PHY_CAP1_MASK 0x23 #define UAP_HE_PHY_CAP1_MASK 0x23
#define UAP_HE_PHY_CAP2_MASK 0x3E #define UAP_HE_PHY_CAP2_MASK 0x3E
#define UAP_HE_PHY_CAP3_MASK 0x88 #define UAP_HE_PHY_CAP3_MASK 0x89
#define UAP_HE_PHY_CAP4_MASK 0x1D #define UAP_HE_PHY_CAP4_MASK 0x1D
#define UAP_HE_PHY_CAP5_MASK 0x01 #define UAP_HE_PHY_CAP5_MASK 0x01
#define UAP_HE_PHY_CAP6_MASK 0xA0 #define UAP_HE_PHY_CAP6_MASK 0xA0
@ -4645,6 +4761,7 @@ Bit18: 0x1 (STBC Tx <= 80 MHz)
Bit19: 0x1 (STBC Rx <= 80 MHz) Bit19: 0x1 (STBC Rx <= 80 MHz)
Bit20: 0x1 (Doppler Tx) Bit20: 0x1 (Doppler Tx)
Bit21: 0x1 (Doppler Rx) Bit21: 0x1 (Doppler Rx)
Bit24-25: 0x1 (DCM Max Constellation Tx)
Bit27-28: 0x1 (DCM Max Constellation Rx) Bit27-28: 0x1 (DCM Max Constellation Rx)
Bit31: 0x1 (SU Beamformer) Bit31: 0x1 (SU Beamformer)
Bit32: 0x1 (SU BeamFormee) Bit32: 0x1 (SU BeamFormee)
@ -4666,7 +4783,7 @@ Bit75: 0x1 (Rx 1024-QAM Support < 242-tone RU)
#define UAP_HE_2G_PHY_CAP0_MASK 0x02 #define UAP_HE_2G_PHY_CAP0_MASK 0x02
#define UAP_HE_2G_PHY_CAP1_MASK 0x20 #define UAP_HE_2G_PHY_CAP1_MASK 0x20
#define UAP_HE_2G_PHY_CAP2_MASK 0x3E #define UAP_HE_2G_PHY_CAP2_MASK 0x3E
#define UAP_HE_2G_PHY_CAP3_MASK 0x88 #define UAP_HE_2G_PHY_CAP3_MASK 0x89
#define UAP_HE_2G_PHY_CAP4_MASK 0x1D #define UAP_HE_2G_PHY_CAP4_MASK 0x1D
#define UAP_HE_2G_PHY_CAP5_MASK 0x01 #define UAP_HE_2G_PHY_CAP5_MASK 0x01
#define UAP_HE_2G_PHY_CAP6_MASK 0xA0 #define UAP_HE_2G_PHY_CAP6_MASK 0xA0

View file

@ -73,7 +73,7 @@
mlan_status woal_cfg80211_set_key(moal_private *priv, t_u8 is_enable_wep, mlan_status woal_cfg80211_set_key(moal_private *priv, t_u8 is_enable_wep,
t_u32 cipher, const t_u8 *key, int key_len, t_u32 cipher, const t_u8 *key, int key_len,
const t_u8 *seq, int seq_len, t_u8 key_index, const t_u8 *seq, int seq_len, t_u8 key_index,
const t_u8 *addr, int disable, const t_u8 *addr, int disable, t_u8 pairwise,
t_u8 wait_option); t_u8 wait_option);
mlan_status woal_cfg80211_set_wep_keys(moal_private *priv, const t_u8 *key, mlan_status woal_cfg80211_set_wep_keys(moal_private *priv, const t_u8 *key,

View file

@ -146,7 +146,6 @@ static const struct nla_policy woal_attr_policy[ATTR_WIFI_MAX + 1] = {
[ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX] = {.type = NLA_U32}, [ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX] = {.type = NLA_U32},
[ATTR_SCAN_BAND_SET] = {.type = NLA_U8}, [ATTR_SCAN_BAND_SET] = {.type = NLA_U8},
}; };
// clang-format off // clang-format off
static const struct nla_policy static const struct nla_policy
woal_nd_offload_policy[ATTR_ND_OFFLOAD_MAX + 1] = { woal_nd_offload_policy[ATTR_ND_OFFLOAD_MAX + 1] = {
@ -3935,9 +3934,8 @@ done:
LEAVE(); LEAVE();
return ret; return ret;
} }
/** /**
* @brief vendor command to set scan band * @brief vendor command to
* *
* @param wiphy A pointer to wiphy struct * @param wiphy A pointer to wiphy struct
* @param wdev A pointer to wireless_dev struct * @param wdev A pointer to wireless_dev struct

View file

@ -616,7 +616,6 @@ typedef enum wifi_attr {
ATTR_WIFI_AFTER_LAST, ATTR_WIFI_AFTER_LAST,
ATTR_WIFI_MAX = ATTR_WIFI_AFTER_LAST - 1 ATTR_WIFI_MAX = ATTR_WIFI_AFTER_LAST - 1
} wifi_attr_t; } wifi_attr_t;
enum mrvl_wlan_vendor_attr_wifi_logger { enum mrvl_wlan_vendor_attr_wifi_logger {
MRVL_WLAN_VENDOR_ATTR_NAME = 10, MRVL_WLAN_VENDOR_ATTR_NAME = 10,
}; };

View file

@ -1202,6 +1202,7 @@ static ssize_t woal_debug_write(struct file *f, const char __user *buf,
t_u32 last_drvdbg = drvdbg; t_u32 last_drvdbg = drvdbg;
#endif #endif
gfp_t flag; gfp_t flag;
t_u32 temp_count = 0;
ENTER(); ENTER();
@ -1210,7 +1211,11 @@ static ssize_t woal_debug_write(struct file *f, const char __user *buf,
return MLAN_STATUS_FAILURE; return MLAN_STATUS_FAILURE;
} }
flag = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; flag = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
pdata = kzalloc(count + 1, flag);
if (!woal_secure_add(&count, 1, &temp_count, TYPE_UINT32))
PRINTM(MERROR, "%s:count param overflow \n", __func__);
pdata = kzalloc(temp_count, flag);
if (pdata == NULL) { if (pdata == NULL) {
MODULE_PUT; MODULE_PUT;
LEAVE(); LEAVE();

View file

@ -325,6 +325,7 @@ static int woal_get_priv_driver_version(moal_private *priv, t_u8 *respbuf,
{ {
int len = 0, ret = -1; int len = 0, ret = -1;
char buf[MLAN_MAX_VER_STR_LEN]; char buf[MLAN_MAX_VER_STR_LEN];
t_u32 temp_buf_len = 0;
ENTER(); ENTER();
@ -340,9 +341,13 @@ static int woal_get_priv_driver_version(moal_private *priv, t_u8 *respbuf,
len = strlen(buf); len = strlen(buf);
if (len) { if (len) {
if (!woal_secure_sub(&respbuflen, 1, &temp_buf_len,
TYPE_UINT32)) {
PRINTM(MERROR, "%s:respbuflen underflow \n", __func__);
}
/* Copy back the retrieved version string */ /* Copy back the retrieved version string */
PRINTM(MINFO, "MOAL VERSION: %s\n", buf); PRINTM(MINFO, "MOAL VERSION: %s\n", buf);
ret = MIN(len, (int)(respbuflen - 1)); ret = MIN(len, (int)temp_buf_len);
moal_memcpy_ext(priv->phandle, respbuf, buf, ret, moal_memcpy_ext(priv->phandle, respbuf, buf, ret,
respbuflen - 1); respbuflen - 1);
} else { } else {
@ -450,7 +455,7 @@ static int woal_setget_priv_11axcmdcfg(moal_private *priv, t_u8 *respbuf,
int ret = 0; int ret = 0;
mlan_status status = MLAN_STATUS_SUCCESS; mlan_status status = MLAN_STATUS_SUCCESS;
int header_len = 0, user_data_len = 0; int header_len = 0, user_data_len = 0;
int data[8] = {0}; int data[10] = {0};
ENTER(); ENTER();
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11ax_cmd_cfg)); req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11ax_cmd_cfg));
@ -470,7 +475,7 @@ static int woal_setget_priv_11axcmdcfg(moal_private *priv, t_u8 *respbuf,
PRINTM(MINFO, "data_len=%d,data=%d,%d,%d\n", user_data_len, data[0], PRINTM(MINFO, "data_len=%d,data=%d,%d,%d\n", user_data_len, data[0],
data[1], data[2]); data[1], data[2]);
if (user_data_len > 8 || user_data_len == 0) { if (user_data_len > 10 || user_data_len == 0) {
PRINTM(MERROR, "Invalid parameters\n"); PRINTM(MERROR, "Invalid parameters\n");
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
@ -526,7 +531,9 @@ static int woal_setget_priv_11axcmdcfg(moal_private *priv, t_u8 *respbuf,
cfg->param.llde_cfg.triggerlimit = data[4]; cfg->param.llde_cfg.triggerlimit = data[4];
cfg->param.llde_cfg.peakULrate = data[5]; cfg->param.llde_cfg.peakULrate = data[5];
cfg->param.llde_cfg.dl_llde = data[6]; cfg->param.llde_cfg.dl_llde = data[6];
cfg->param.llde_cfg.triggerinterval = data[7]; cfg->param.llde_cfg.pollinterval = data[7];
cfg->param.llde_cfg.txOpDuration = data[8];
cfg->param.llde_cfg.llde_ctrl = data[9];
break; break;
default: default:
PRINTM(MERROR, "unknown 11axcmd\n"); PRINTM(MERROR, "unknown 11axcmd\n");
@ -3978,7 +3985,8 @@ static int woal_priv_get_cfpinfo(moal_private *priv, t_u8 *respbuf,
} }
/* Allocate an IOCTL request buffer */ /* Allocate an IOCTL request buffer */
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); req = woal_alloc_mlan_ioctl_req(
MAX(CMD_BUF_LEN, sizeof(mlan_ds_misc_cfg)));
if (req == NULL) { if (req == NULL) {
ret = -ENOMEM; ret = -ENOMEM;
goto done; goto done;
@ -12283,7 +12291,8 @@ static void woal_get_dfs_chan_list(moal_private *priv)
for (i = 0; i < sband->n_channels; i++) { for (i = 0; i < sband->n_channels; i++) {
if ((sband->channels[i].flags & if ((sband->channels[i].flags &
IEEE80211_CHAN_RADAR) && IEEE80211_CHAN_RADAR) &&
(priv->auto_dfs_cfg.num_of_chan <= 0xFF)) { (priv->auto_dfs_cfg.num_of_chan <
MAX_DFS_CHAN_LIST)) {
priv->auto_dfs_cfg.dfs_chan_list priv->auto_dfs_cfg.dfs_chan_list
[priv->auto_dfs_cfg.num_of_chan] = [priv->auto_dfs_cfg.num_of_chan] =
sband->channels[i].hw_value; sband->channels[i].hw_value;
@ -13428,17 +13437,23 @@ static int woal_priv_set_get_tx_rx_ant(moal_private *priv, t_u8 *respbuf,
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type) || IS_CARD9097(priv->phandle->card_type) ||
IS_CARDIW624(priv->phandle->card_type)) { IS_CARDIW624(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
woal_cfg80211_notify_antcfg( woal_cfg80211_notify_antcfg(
priv, priv->phandle->wiphy, radio); priv, priv->phandle->wiphy, radio);
} }
#endif #endif
} else { } else {
radio->param.ant_cfg_1x1.antenna = data[0]; radio->param.ant_cfg_1x1.antenna = data[0];
if (user_data_len == 2) if (user_data_len == 2) {
if (data[1] > 0xffff) {
ret = -EINVAL;
goto done;
}
radio->param.ant_cfg_1x1.evaluate_time = radio->param.ant_cfg_1x1.evaluate_time =
data[1]; data[1];
} }
}
req->action = MLAN_ACT_SET; req->action = MLAN_ACT_SET;
} }
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
@ -13472,79 +13487,6 @@ done:
return ret; return ret;
} }
/*
* @brief Set/Get CWMode
*
* @param priv Pointer to moal_private structure
* @param respbuf Pointer to response buffer
* @param resplen Response buffer length
*
* @return Number of bytes written, negative for failure.
*/
static int woal_priv_set_get_cwmode(moal_private *priv, t_u8 *respbuf,
t_u32 respbuflen)
{
mlan_ioctl_req *ioctl_req = NULL;
mlan_ds_misc_cfg *misc = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
mlan_ds_cw_mode_ctrl *cwmode;
int ret = 0;
int header_len = 0;
ENTER();
if (!priv || !priv->phandle) {
PRINTM(MERROR, "priv or handle is null\n");
ret = -EFAULT;
goto done;
}
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (ioctl_req == NULL) {
ret = -ENOMEM;
goto done;
}
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
misc->sub_command = MLAN_OID_MISC_CWMODE_CTRL;
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_CWMODE);
if ((int)strlen(respbuf) == header_len) {
/* GET operation */
ioctl_req->action = MLAN_ACT_GET;
} else {
/* SET operation */
ioctl_req->action = MLAN_ACT_SET;
cwmode = (mlan_ds_cw_mode_ctrl *)(respbuf + header_len +
sizeof(t_u8));
misc->param.cwmode.mode = cwmode->mode;
misc->param.cwmode.txPower = cwmode->txPower;
misc->param.cwmode.rateInfo = cwmode->rateInfo;
misc->param.cwmode.channel = cwmode->channel;
misc->param.cwmode.chanInfo = cwmode->chanInfo;
misc->param.cwmode.pktLength = cwmode->pktLength;
}
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)&misc->param.cwmode,
sizeof(misc->param.cwmode), respbuflen);
ret = sizeof(misc->param.cwmode);
done:
if (status != MLAN_STATUS_PENDING)
kfree(ioctl_req);
LEAVE();
return ret;
}
/** /**
* @brief Set/Get out band independent reset * @brief Set/Get out band independent reset
* *
@ -14643,6 +14585,92 @@ done:
return ret; return ret;
} }
/**
* @brief Set and get gpio pin Configurations
*
* @param priv Pointer to moal_private structure
* @param respbuf Pointer to response buffer
* @param resplen Response buffer length
*
* @return Number of bytes written, negative for failure.
*/
static int woal_priv_gpiocfg(moal_private *priv, t_u8 *respbuf,
t_u32 respbuflen)
{
mlan_ioctl_req *req = NULL;
mlan_ds_misc_cfg *misc = NULL;
mlan_ds_gpio_cfg_ops *gpio_cfg = NULL;
int ret = 0;
int data[3] = {0};
int user_data_len = 0, header_len = 0;
mlan_status status = MLAN_STATUS_SUCCESS;
ENTER();
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (req == NULL) {
ret = -ENOMEM;
goto done;
}
misc = (mlan_ds_misc_cfg *)req->pbuf;
misc->sub_command = MLAN_OID_MISC_GPIO_CFG;
req->req_id = MLAN_IOCTL_MISC_CFG;
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_GPIOCFG);
if ((int)strlen(respbuf) == header_len) {
ret = -EINVAL;
goto done;
}
/* SET operation */
memset((t_u8 *)data, 0, sizeof(data));
parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data),
&user_data_len);
if (user_data_len == 1) {
PRINTM(MINFO, "GPIO_CFG: GET\n");
req->action = MLAN_ACT_GET;
} else if (user_data_len >= 2) {
PRINTM(MINFO, "GPIO_CFG: SET\n");
req->action = MLAN_ACT_SET;
} else {
ret = -EINVAL;
goto done;
}
gpio_cfg = (mlan_ds_gpio_cfg_ops *)&misc->param.gpio_cfg_ops;
if (gpio_cfg) {
gpio_cfg->pin_num = (t_u8)data[0];
if (user_data_len >= 2)
gpio_cfg->opsType = (t_u8)data[1];
if (user_data_len == 3)
gpio_cfg->value = (t_u8)data[2];
} else {
ret = -EFAULT;
goto done;
}
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
ret = -EFAULT;
goto done;
}
gpio_cfg = (mlan_ds_gpio_cfg_ops *)&misc->param.gpio_cfg_ops;
if (req->action == MLAN_ACT_GET) {
moal_memcpy_ext(priv->phandle, respbuf, gpio_cfg,
sizeof(gpio_cfg), respbuflen);
ret = sizeof(gpio_cfg);
}
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return ret;
}
/** /**
* @brief Set and get boot sleep configure * @brief Set and get boot sleep configure
* @param priv Pointer to moal_private structure * @param priv Pointer to moal_private structure
@ -17906,10 +17934,11 @@ static int woal_priv_set_roam_passphrase(moal_private *priv, t_u8 *respbuf,
goto done; goto done;
} }
ssid_passphrase->ssid.ssid_len = strlen(item); ssid_passphrase->ssid.ssid_len = strlen(item);
strncpy((char *)ssid_passphrase->ssid.ssid, moal_memcpy_ext(
item, priv->phandle,
MIN(strlen(item), (char *)ssid_passphrase->ssid.ssid,
MLAN_MAX_SSID_LENGTH)); item, strlen(item),
MLAN_MAX_SSID_LENGTH);
PRINTM(MINFO, "ssid=%s, len=%d\n", PRINTM(MINFO, "ssid=%s, len=%d\n",
ssid_passphrase->ssid.ssid, ssid_passphrase->ssid.ssid,
(int)ssid_passphrase->ssid.ssid_len); (int)ssid_passphrase->ssid.ssid_len);
@ -19521,7 +19550,8 @@ static int woal_priv_set_get_lpm(moal_private *priv, t_u8 *respbuf,
ENTER(); ENTER();
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type)) { IS_CARD9097(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_LPM); header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_LPM);
if ((int)strlen(respbuf) == header_len) { if ((int)strlen(respbuf) == header_len) {
/* GET operation */ /* GET operation */
@ -20495,6 +20525,10 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
/* Memory Read/Write */ /* Memory Read/Write */
len = woal_priv_memrdwr(priv, buf, priv_cmd.total_len); len = woal_priv_memrdwr(priv, buf, priv_cmd.total_len);
goto handled; goto handled;
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_GPIOCFG,
strlen(PRIV_CMD_GPIOCFG)) == 0) {
len = woal_priv_gpiocfg(priv, buf, priv_cmd.total_len);
goto handled;
#ifdef SDIO #ifdef SDIO
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_SDCMD52RW, } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_SDCMD52RW,
strlen(PRIV_CMD_SDCMD52RW)) == 0) { strlen(PRIV_CMD_SDCMD52RW)) == 0) {
@ -20988,12 +21022,6 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
/* Set/Get CFP table codes */ /* Set/Get CFP table codes */
len = woal_priv_cfp_code(priv, buf, priv_cmd.total_len); len = woal_priv_cfp_code(priv, buf, priv_cmd.total_len);
goto handled; goto handled;
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_CWMODE,
strlen(PRIV_CMD_CWMODE)) == 0) {
/* Set/Get Tx CWMode */
len = woal_priv_set_get_cwmode(priv, buf,
priv_cmd.total_len);
goto handled;
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_ANT_CFG, } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_ANT_CFG,
strlen(PRIV_CMD_ANT_CFG)) == 0) { strlen(PRIV_CMD_ANT_CFG)) == 0) {
/* Set/Get Tx/Rx antenna */ /* Set/Get Tx/Rx antenna */
@ -21452,8 +21480,8 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
PRINTM(MIOCTL, "Set COUNTRY %s\n", country_code); PRINTM(MIOCTL, "Set COUNTRY %s\n", country_code);
if (priv->phandle->params.cntry_txpwr) { if (priv->phandle->params.cntry_txpwr) {
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_request_country_power_table(priv, woal_request_country_power_table(priv, country_code,
country_code)) { MOAL_IOCTL_WAIT)) {
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }

View file

@ -151,6 +151,7 @@ typedef struct _chan_stats {
#define PRIV_CMD_REGRDWR "regrdwr" #define PRIV_CMD_REGRDWR "regrdwr"
#define PRIV_CMD_RDEEPROM "rdeeprom" #define PRIV_CMD_RDEEPROM "rdeeprom"
#define PRIV_CMD_MEMRDWR "memrdwr" #define PRIV_CMD_MEMRDWR "memrdwr"
#define PRIV_CMD_GPIOCFG "gpiocfg"
#ifdef SDIO #ifdef SDIO
#define PRIV_CMD_SDCMD52RW "sdcmd52rw" #define PRIV_CMD_SDCMD52RW "sdcmd52rw"
#endif #endif
@ -229,7 +230,6 @@ typedef struct _chan_stats {
#define PRIV_CMD_DFS_CAC "dfs_cac" #define PRIV_CMD_DFS_CAC "dfs_cac"
#define PRIV_CMD_AUTODFS "autodfs" #define PRIV_CMD_AUTODFS "autodfs"
#define PRIV_CMD_CFP_CODE "cfpcode" #define PRIV_CMD_CFP_CODE "cfpcode"
#define PRIV_CMD_CWMODE "cwmode"
#define PRIV_CMD_ANT_CFG "antcfg" #define PRIV_CMD_ANT_CFG "antcfg"
#define PRIV_CMD_SYSCLOCK "sysclock" #define PRIV_CMD_SYSCLOCK "sysclock"
#define PRIV_CMD_GET_KEY "getkey" #define PRIV_CMD_GET_KEY "getkey"
@ -737,13 +737,6 @@ typedef struct _tx_rx_histogram {
t_u8 action; t_u8 action;
} __ATTRIB_PACK__ tx_rx_histogram; } __ATTRIB_PACK__ tx_rx_histogram;
/* Enum for different CW mode type */
typedef enum _cw_modes_e {
CWMODE_DISABLE,
CWMODE_TXCONTPKT,
CWMODE_TXCONTWAVE,
} cw_modes_e;
/** wlan_ieee80211_chan */ /** wlan_ieee80211_chan */
typedef struct { typedef struct {
/** center freq */ /** center freq */

View file

@ -29,7 +29,11 @@ extern pmoal_handle m_handle[];
static char *fw_name; static char *fw_name;
static int req_fw_nowait; static int req_fw_nowait;
int fw_reload; int fw_reload;
int auto_fw_reload; #ifdef PCIE
int auto_fw_reload = AUTO_FW_RELOAD_ENABLE | AUTO_FW_RELOAD_PCIE_INBAND_RESET;
#else
int auto_fw_reload = AUTO_FW_RELOAD_ENABLE;
#endif
static char *hw_name; static char *hw_name;
@ -78,7 +82,7 @@ static int auto_ds;
/** net_rx mode*/ /** net_rx mode*/
static int net_rx; static int net_rx;
/** amsdu deaggr mode */ /** amsdu deaggr mode */
static int amsdu_deaggr; static int amsdu_deaggr = 1;
static int ext_scan; static int ext_scan;
@ -122,6 +126,11 @@ static int max_vir_bss = DEF_VIRTUAL_BSS;
#endif #endif
#endif #endif
/** Max NAN interfaces */
static int max_nan_bss = DEF_NAN_BSS;
/** NAN interface name */
static char *nan_name;
/** PM keep power */ /** PM keep power */
static int pm_keep_power = 1; static int pm_keep_power = 1;
#ifdef SDIO_SUSPEND_RESUME #ifdef SDIO_SUSPEND_RESUME
@ -152,6 +161,12 @@ static int rps = 0;
#endif #endif
#endif #endif
/**
* EDMAC for EU adaptivity
* Default value of 0 keeps edmac disabled by default
*/
static int edmac_ctrl = 0;
static int tx_skb_clone = 0; static int tx_skb_clone = 0;
#ifdef IMX_SUPPORT #ifdef IMX_SUPPORT
static int pmqos = 1; static int pmqos = 1;
@ -301,6 +316,8 @@ static int mon_filter = DEFAULT_NETMON_FILTER;
#endif #endif
#endif #endif
int dual_nb;
#ifdef DEBUG_LEVEL1 #ifdef DEBUG_LEVEL1
#ifdef DEBUG_LEVEL2 #ifdef DEBUG_LEVEL2
#define DEFAULT_DEBUG_MASK (0xffffffff) #define DEFAULT_DEBUG_MASK (0xffffffff)
@ -345,7 +362,6 @@ 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
{CARD_TYPE_SDAW693, 0, CARD_SDAW693},
#ifdef PCIE8897 #ifdef PCIE8897
{CARD_TYPE_PCIE8897, 0, CARD_PCIE8897}, {CARD_TYPE_PCIE8897, 0, CARD_PCIE8897},
#endif #endif
@ -358,7 +374,6 @@ 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
{CARD_TYPE_PCIEAW693, 0, CARD_PCIEAW693},
#ifdef PCIEIW624 #ifdef PCIEIW624
{CARD_TYPE_PCIEIW624, 0, CARD_PCIEIW624}, {CARD_TYPE_PCIEIW624, 0, CARD_PCIEIW624},
#endif #endif
@ -553,7 +568,9 @@ static mlan_status parse_line_read_card_info(t_u8 *line, char **type,
p = strstr(line, "_"); p = strstr(line, "_");
if (p != NULL) { if (p != NULL) {
*p++ = '\0'; *p = '\0';
if (!woal_secure_add(&p, 1, &p, TYPE_PTR))
PRINTM(MERROR, "%s:ERR:pointer overflow \n", __func__);
*if_id = p; *if_id = p;
} else { } else {
*if_id = NULL; *if_id = NULL;
@ -772,7 +789,20 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
} }
#endif #endif
#endif #endif
else if (strncmp(line, "auto_ds", strlen("auto_ds")) == 0) { else if (strncmp(line, "nan_name", strlen("nan_name")) == 0) {
if (parse_line_read_string(line, &out_str) !=
MLAN_STATUS_SUCCESS)
goto err;
woal_dup_string(&params->nan_name, out_str);
PRINTM(MMSG, "nan_name=%s\n", params->nan_name);
} else if (strncmp(line, "max_nan_bss",
strlen("max_nan_bss")) == 0) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
params->max_nan_bss = out_data;
PRINTM(MMSG, "max_nan_bss = %d\n", params->max_nan_bss);
} else if (strncmp(line, "auto_ds", strlen("auto_ds")) == 0) {
if (parse_line_read_int(line, &out_data) != if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS) MLAN_STATUS_SUCCESS)
goto err; goto err;
@ -1237,7 +1267,16 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
} }
#endif #endif
#endif #endif
else if (strncmp(line, "tx_skb_clone", else if (strncmp(line, "edmac_ctrl", strlen("edmac_ctrl")) ==
0) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
handle->params.edmac_ctrl = out_data;
PRINTM(MMSG, "edmac_ctrl set to %x from cfg\n",
handle->params.edmac_ctrl);
} else if (strncmp(line, "tx_skb_clone",
strlen("tx_skb_clone")) == 0) { strlen("tx_skb_clone")) == 0) {
if (parse_line_read_int(line, &out_data) != if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS) MLAN_STATUS_SUCCESS)
@ -1452,6 +1491,12 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
goto err; goto err;
params->auto_11ax = out_data; params->auto_11ax = out_data;
PRINTM(MMSG, "auto_11ax=%d\n", params->auto_11ax); PRINTM(MMSG, "auto_11ax=%d\n", params->auto_11ax);
} else if (strncmp(line, "dual_nb", strlen("dual_nb")) == 0) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
params->dual_nb = out_data;
PRINTM(MMSG, "dual_nb=%d\n", params->dual_nb);
} }
} }
if (end) if (end)
@ -1570,6 +1615,12 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
handle->params.max_vir_bss = params->max_vir_bss; handle->params.max_vir_bss = params->max_vir_bss;
#endif #endif
#endif /* WIFI_DIRECT_SUPPORT */ #endif /* WIFI_DIRECT_SUPPORT */
handle->params.max_nan_bss = max_nan_bss;
woal_dup_string(&handle->params.nan_name, nan_name);
if (params) {
handle->params.max_nan_bss = params->max_nan_bss;
woal_dup_string(&handle->params.nan_name, params->nan_name);
}
handle->params.auto_ds = auto_ds; handle->params.auto_ds = auto_ds;
if (params) if (params)
handle->params.auto_ds = params->auto_ds; handle->params.auto_ds = params->auto_ds;
@ -1738,6 +1789,7 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
PRINTM(MMSG, "rps set to %x from module param\n", handle->params.rps); PRINTM(MMSG, "rps set to %x from module param\n", handle->params.rps);
#endif #endif
#endif #endif
handle->params.edmac_ctrl = edmac_ctrl;
if (tx_skb_clone) if (tx_skb_clone)
moal_extflg_set(handle, EXT_TX_SKB_CLONE); moal_extflg_set(handle, EXT_TX_SKB_CLONE);
@ -1804,6 +1856,9 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params)
} }
handle->params.keep_previous_scan = keep_previous_scan; handle->params.keep_previous_scan = keep_previous_scan;
handle->params.auto_11ax = auto_11ax; handle->params.auto_11ax = auto_11ax;
handle->params.dual_nb = dual_nb;
if (params)
handle->params.dual_nb = params->dual_nb;
} }
/** /**
@ -1848,6 +1903,10 @@ void woal_free_module_param(moal_handle *handle)
params->wfd_name = NULL; params->wfd_name = NULL;
} }
#endif /* WIFI_DIRECT_SUPPORT */ #endif /* WIFI_DIRECT_SUPPORT */
if (params->nan_name) {
kfree(params->nan_name);
params->nan_name = NULL;
}
if (params->dpd_data_cfg) { if (params->dpd_data_cfg) {
kfree(params->dpd_data_cfg); kfree(params->dpd_data_cfg);
params->dpd_data_cfg = NULL; params->dpd_data_cfg = NULL;
@ -1987,7 +2046,13 @@ void woal_init_from_dev_tree(void)
} }
#endif #endif
#endif #endif
else if (!strncmp(prop->name, "tx_skb_clone", else if (!strncmp(prop->name, "edmac_ctrl",
strlen("edmac_ctrl"))) {
if (!of_property_read_u32(dt_node, prop->name, &data)) {
PRINTM(MIOCTL, "edmac_ctrl=0x%x\n", data);
edmac_ctrl = data;
}
} else if (!strncmp(prop->name, "tx_skb_clone",
strlen("tx_skb_clone"))) { strlen("tx_skb_clone"))) {
if (!of_property_read_u32(dt_node, prop->name, &data)) { if (!of_property_read_u32(dt_node, prop->name, &data)) {
PRINTM(MIOCTL, "tx_skb_clone=0x%x\n", data); PRINTM(MIOCTL, "tx_skb_clone=0x%x\n", data);
@ -2551,8 +2616,9 @@ MODULE_PARM_DESC(fw_reload,
"0: disable fw_reload; 1: enable fw reload feature"); "0: disable fw_reload; 1: enable fw reload feature");
module_param(auto_fw_reload, int, 0); module_param(auto_fw_reload, int, 0);
#ifdef PCIE #ifdef PCIE
MODULE_PARM_DESC(auto_fw_reload, MODULE_PARM_DESC(
"BIT0: enable auto fw_reload; BIT1:enable PCIe in-band reset"); auto_fw_reload,
"BIT0: enable auto fw_reload; BIT1: 0: enable PCIE FLR, 1: enable PCIe in-band reset");
#else #else
MODULE_PARM_DESC(auto_fw_reload, "BIT0: enable auto fw_reload"); MODULE_PARM_DESC(auto_fw_reload, "BIT0: enable auto fw_reload");
#endif #endif
@ -2573,8 +2639,9 @@ MODULE_PARM_DESC(
rf_test_mode, rf_test_mode,
"0: Download normal firmware; 1: Download RF_TEST_MODE firmware"); "0: Download normal firmware; 1: Download RF_TEST_MODE firmware");
module_param(drv_mode, int, 0660); module_param(drv_mode, int, 0660);
MODULE_PARM_DESC(drv_mode, MODULE_PARM_DESC(
"Bit 0: STA; Bit 1: uAP; Bit 2: WIFIDIRECT; Bit 7: ZERO_DFS"); drv_mode,
"Bit 0: STA; Bit 1: uAP; Bit 2: WIFIDIRECT; Bit 4: NAN; Bit 7: ZERO_DFS");
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
module_param(max_sta_bss, int, 0); module_param(max_sta_bss, int, 0);
@ -2598,6 +2665,10 @@ module_param(max_vir_bss, int, 0);
MODULE_PARM_DESC(max_vir_bss, "Number of Virtual interfaces (0)"); MODULE_PARM_DESC(max_vir_bss, "Number of Virtual interfaces (0)");
#endif #endif
#endif /* WIFI_DIRECT_SUPPORT */ #endif /* WIFI_DIRECT_SUPPORT */
module_param(nan_name, charp, 0);
MODULE_PARM_DESC(nan_name, "NAN interface name");
module_param(max_nan_bss, int, 0);
MODULE_PARM_DESC(max_nan_bss, "Number of NAN interfaces (1)");
#ifdef DEBUG_LEVEL1 #ifdef DEBUG_LEVEL1
module_param(drvdbg, uint, 0660); module_param(drvdbg, uint, 0660);
MODULE_PARM_DESC(drvdbg, "Driver debug"); MODULE_PARM_DESC(drvdbg, "Driver debug");
@ -2663,6 +2734,8 @@ MODULE_PARM_DESC(
"bit0-bit4(0x1 - 0xf): Enables rps on specific cpu ; 0: Disables rps"); "bit0-bit4(0x1 - 0xf): Enables rps on specific cpu ; 0: Disables rps");
#endif #endif
#endif #endif
module_param(edmac_ctrl, int, 0660);
MODULE_PARM_DESC(edmac_ctrl, "0: Disable edmac; 1: Enable edmac");
module_param(tx_skb_clone, uint, 0660); module_param(tx_skb_clone, uint, 0660);
MODULE_PARM_DESC(tx_skb_clone, MODULE_PARM_DESC(tx_skb_clone,
"1: Enable tx_skb_clone; 0: Disable tx_skb_clone"); "1: Enable tx_skb_clone; 0: Disable tx_skb_clone");
@ -2741,8 +2814,9 @@ module_param(net_rx, int, 0);
MODULE_PARM_DESC(net_rx, MODULE_PARM_DESC(net_rx,
"0: use netif_rx_ni in rx; 1: use netif_receive_skb in rx"); "0: use netif_rx_ni in rx; 1: use netif_receive_skb in rx");
module_param(amsdu_deaggr, int, 0); module_param(amsdu_deaggr, int, 0);
MODULE_PARM_DESC(amsdu_deaggr, MODULE_PARM_DESC(
"0: default; 1: Try to avoid buf copy in amsud deaggregation"); amsdu_deaggr,
"0: buf copy in amsud deaggregation; 1: avoid buf copy in amsud deaggregation (default)");
#ifdef SDIO #ifdef SDIO
#endif #endif
@ -2884,3 +2958,6 @@ MODULE_PARM_DESC(
"Bit6:TX frames excluding control; Bit5:non-bss beacons; Bit3:unicast destined non-promiscuous frames only; Bit2:data frames; Bit1:control frames; Bit0:management frames"); "Bit6:TX frames excluding control; Bit5:non-bss beacons; Bit3:unicast destined non-promiscuous frames only; Bit2:data frames; Bit1:control frames; Bit0:management frames");
#endif #endif
#endif #endif
module_param(dual_nb, int, 0);
MODULE_PARM_DESC(dual_nb, "0: Single BT (Default); 1: Dual BT");

View file

@ -2150,6 +2150,8 @@ mlan_status woal_request_get_fw_info(moal_private *priv, t_u8 wait_option,
info->param.fw_info.hotfix_version; info->param.fw_info.hotfix_version;
priv->phandle->fw_ecsa_enable = info->param.fw_info.ecsa_enable; priv->phandle->fw_ecsa_enable = info->param.fw_info.ecsa_enable;
priv->phandle->fw_bands = info->param.fw_info.fw_bands; priv->phandle->fw_bands = info->param.fw_info.fw_bands;
priv->phandle->cmd_tx_data = info->param.fw_info.cmd_tx_data;
priv->phandle->sec_rgpower = info->param.fw_info.sec_rgpower;
priv->phandle->fw_getlog_enable = priv->phandle->fw_getlog_enable =
info->param.fw_info.getlog_enable; info->param.fw_info.getlog_enable;
priv->phandle->fw_roaming_support = priv->phandle->fw_roaming_support =
@ -2583,6 +2585,43 @@ done:
return ret; return ret;
} }
/**
* @brief send mgmt packet through ioctl
*
* @param priv A pointer to moal_private structure
* @param pmbuf A pointer to mlan_buffer which hold mgmt packet
* @return N/A
*/
static mlan_status woal_send_mgmt_packet(moal_private *priv, pmlan_buffer pmbuf)
{
mlan_ioctl_req *ioctl_req = NULL;
mlan_ds_misc_cfg *misc = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
ENTER();
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (ioctl_req == NULL)
goto done;
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
misc->sub_command = MLAN_OID_MISC_TX_FRAME;
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
ioctl_req->action = MLAN_ACT_SET;
misc->param.tx_frame.data_len = pmbuf->data_len;
misc->param.tx_frame.buf_type = MLAN_BUF_TYPE_RAW_DATA;
misc->param.tx_frame.priority = 7;
if (pmbuf->tx_seq_num)
misc->param.tx_frame.flags = MLAN_BUF_FLAG_TX_STATUS;
misc->param.tx_frame.tx_seq_num = pmbuf->tx_seq_num;
moal_memcpy_ext(priv->phandle, misc->param.tx_frame.tx_buf,
pmbuf->pbuf + pmbuf->data_offset, pmbuf->data_len,
MRVDRV_SIZE_OF_CMD_BUFFER);
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
done:
if (status != MLAN_STATUS_PENDING)
kfree(ioctl_req);
LEAVE();
return status;
}
/** /**
* @brief send raw data packet ioctl function * @brief send raw data packet ioctl function
* *
@ -2596,6 +2635,7 @@ int woal_send_host_packet(struct net_device *dev, struct ifreq *req)
t_u32 packet_len = 0; t_u32 packet_len = 0;
int ret = 0; int ret = 0;
pmlan_buffer pmbuf = NULL; pmlan_buffer pmbuf = NULL;
IEEE80211_MGMT *mgmt = NULL;
mlan_status status; mlan_status status;
ENTER(); ENTER();
@ -2619,6 +2659,7 @@ int woal_send_host_packet(struct net_device *dev, struct ifreq *req)
goto done; goto done;
} }
#define PACKET_HEADER_LEN 8 #define PACKET_HEADER_LEN 8
#define FRAME_LEN 2
#define MV_ETH_FRAME_LEN 1514 #define MV_ETH_FRAME_LEN 1514
if (packet_len > MV_ETH_FRAME_LEN) { if (packet_len > MV_ETH_FRAME_LEN) {
PRINTM(MERROR, "Invalid packet length %d\n", packet_len); PRINTM(MERROR, "Invalid packet length %d\n", packet_len);
@ -2648,6 +2689,15 @@ int woal_send_host_packet(struct net_device *dev, struct ifreq *req)
pmbuf->buf_type = MLAN_BUF_TYPE_RAW_DATA; pmbuf->buf_type = MLAN_BUF_TYPE_RAW_DATA;
pmbuf->bss_index = priv->bss_index; pmbuf->bss_index = priv->bss_index;
mgmt = (IEEE80211_MGMT *)(pmbuf->pbuf + pmbuf->data_offset +
PACKET_HEADER_LEN + FRAME_LEN);
if (priv->phandle->cmd_tx_data &&
((mgmt->frame_control & IEEE80211_FC_MGMT_FRAME_TYPE_MASK) == 0)) {
status = woal_send_mgmt_packet(priv, pmbuf);
woal_free_mlan_buffer(priv->phandle, pmbuf);
goto done;
}
status = mlan_send_packet(priv->phandle->pmlan_adapter, pmbuf); status = mlan_send_packet(priv->phandle->pmlan_adapter, pmbuf);
switch (status) { switch (status) {
case MLAN_STATUS_PENDING: case MLAN_STATUS_PENDING:
@ -3862,6 +3912,34 @@ done:
return ret; return ret;
} }
/** @brief This function set rgpower table
*
* @param priv A Pointer to the moal_private structure
* @return MTRUE or MFALSE
*/
mlan_status woal_set_rgpower_table(moal_handle *handle)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
mlan_ioctl_req *req = NULL;
mlan_ds_misc_cfg *misc = NULL;
ENTER();
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (req) {
misc = (mlan_ds_misc_cfg *)req->pbuf;
misc->sub_command = MLAN_OID_MISC_REGION_POWER_CFG;
req->req_id = MLAN_IOCTL_MISC_CFG;
req->action = MLAN_ACT_SET;
ret = woal_request_ioctl(woal_get_priv(handle,
MLAN_BSS_ROLE_ANY),
req, MOAL_IOCTL_WAIT);
}
if (ret != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return ret;
}
/** @brief This function enables the host sleep /** @brief This function enables the host sleep
* *
* @param priv A Pointer to the moal_private structure * @param priv A Pointer to the moal_private structure
@ -8160,6 +8238,7 @@ void woal_ioctl_get_misc_conf(moal_private *priv, mlan_ds_misc_cfg *info)
#define TX_FRAME_STR_LEN 200 #define TX_FRAME_STR_LEN 200
#define TRIGGER_FRAME_STR_LEN 250 #define TRIGGER_FRAME_STR_LEN 250
#define HE_TB_TX_STR_LEN 30 #define HE_TB_TX_STR_LEN 30
#define MAX_RADIO_MODE 21
/* /*
* @brief Parse mfg cmd radio mode string * @brief Parse mfg cmd radio mode string
@ -8206,7 +8285,7 @@ static int parse_radio_mode_string(const char *s, size_t len,
if (pos) if (pos)
d->data2 = (t_u32)woal_string_to_number(pos); d->data2 = (t_u32)woal_string_to_number(pos);
if ((d->data1 > 14) || (d->data2 > 14)) if ((d->data1 > MAX_RADIO_MODE) || (d->data2 > MAX_RADIO_MODE))
ret = -EINVAL; ret = -EINVAL;
kfree(tmp); kfree(tmp);
@ -8214,7 +8293,6 @@ static int parse_radio_mode_string(const char *s, size_t len,
return ret; return ret;
} }
#ifdef SD9177
/* /*
* @brief PowerLevelToDUT11Bits * @brief PowerLevelToDUT11Bits
* *
@ -8238,7 +8316,6 @@ static void PowerLevelToDUT11Bits(int Pwr, t_u32 *PowerLevel)
return; return;
} }
#endif
/* /*
* @brief Parse mfg cmd tx pwr string * @brief Parse mfg cmd tx pwr string
@ -8258,21 +8335,24 @@ static int parse_tx_pwr_string(moal_handle *handle, const char *s, size_t len,
char *tmp = NULL; char *tmp = NULL;
char *pos = NULL; char *pos = NULL;
gfp_t flag; gfp_t flag;
#ifdef SD9177
t_u32 tx_pwr_converted = 0xffffffff; t_u32 tx_pwr_converted = 0xffffffff;
int tx_pwr_local = 0; int tx_pwr_local = 0;
t_u8 fc_card = MFALSE; t_u8 pow_conv = MFALSE;
#endif t_u32 pow_limit = 24;
t_u8 card_type;
ENTER(); ENTER();
if (!s || !d) { if (!s || !d) {
LEAVE(); LEAVE();
return -EINVAL; return -EINVAL;
} }
#ifdef SD9177
if (IS_SD9177(handle->card_type)) card_type = (handle->card_type) & 0xff;
fc_card = MTRUE; if ((card_type == CARD_TYPE_9098) || (card_type == CARD_TYPE_9097) ||
#endif (card_type == CARD_TYPE_9177) || (card_type == CARD_TYPE_IW624) ||
(card_type == CARD_TYPE_AW693))
pow_conv = MTRUE;
flag = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL; flag = (in_atomic() || irqs_disabled()) ? GFP_ATOMIC : GFP_KERNEL;
string = kzalloc(TX_PWR_STR_LEN, flag); string = kzalloc(TX_PWR_STR_LEN, flag);
if (string == NULL) { if (string == NULL) {
@ -8288,16 +8368,14 @@ 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");
#ifdef SD9177 if (pow_conv && pos) {
if (fc_card && pos) { /* for SH and later chipsets we need to convert user power vals
/* for sd9177 we need to convert user power vals including -ve * including -ve vals to 1/16dbm resolution*/
* vals as per labtool */
tx_pwr_local = woal_string_to_number(pos); tx_pwr_local = woal_string_to_number(pos);
PowerLevelToDUT11Bits(tx_pwr_local, &tx_pwr_converted); PowerLevelToDUT11Bits(tx_pwr_local, &tx_pwr_converted);
d->data1 = tx_pwr_converted; d->data1 = tx_pwr_converted;
} else pow_limit = 384;
#endif } else if (pos) {
if (pos) {
d->data1 = (t_u32)woal_string_to_number(pos); d->data1 = (t_u32)woal_string_to_number(pos);
} }
/* modulation */ /* modulation */
@ -8310,12 +8388,8 @@ static int parse_tx_pwr_string(moal_handle *handle, const char *s, size_t len,
if (pos) if (pos)
d->data3 = (t_u32)woal_string_to_number(pos); d->data3 = (t_u32)woal_string_to_number(pos);
#ifdef SD9177 if (((d->data1 > pow_limit) && (d->data1 != 0xffffffff)) ||
if (((!fc_card) && ((d->data1 > 24) && (d->data1 != 0xffffffff))) ||
(d->data2 > 2)) (d->data2 > 2))
#else
if (((d->data1 > 24) && (d->data1 != 0xffffffff)) || (d->data2 > 2))
#endif
ret = -EINVAL; ret = -EINVAL;
kfree(tmp); kfree(tmp);
@ -9112,3 +9186,59 @@ done:
return ret; return ret;
} }
#endif /* RF_TEST_MODE */ #endif /* RF_TEST_MODE */
/**
* @brief Configures edmac parameters based on region
*
* @param priv A pointer to moal_private structure
* @param country_code A pointer to country code
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING on success,
* otherwise failure code
*/
mlan_status woal_edmac_cfg(moal_private *priv, t_u8 *country_code)
{
mlan_ioctl_req *req = NULL;
mlan_ds_misc_cfg *cfg = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
BOOLEAN is_etsi = MFALSE;
ENTER();
is_etsi = woal_is_etsi_country(country_code);
if (is_etsi == MFALSE && priv->phandle->is_edmac_enabled == MFALSE)
return MLAN_STATUS_SUCCESS;
if (is_etsi == MTRUE && priv->phandle->is_edmac_enabled == MTRUE)
return MLAN_STATUS_SUCCESS;
req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (req == NULL) {
status = MLAN_STATUS_FAILURE;
goto done;
}
cfg = (mlan_ds_misc_cfg *)req->pbuf;
cfg->sub_command = MLAN_OID_MISC_EDMAC_CONFIG;
req->req_id = MLAN_IOCTL_MISC_CFG;
if (is_etsi)
req->action = MLAN_ACT_SET;
else
req->action = MLAN_ACT_CLEAR;
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
PRINTM(MMSG, "Failed to configure edmac\n");
goto done;
}
if (is_etsi)
priv->phandle->is_edmac_enabled = MTRUE;
else
priv->phandle->is_edmac_enabled = MFALSE;
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return status;
}

File diff suppressed because it is too large Load diff

View file

@ -118,7 +118,7 @@ Change log:
#include <net/ieee80211_radiotap.h> #include <net/ieee80211_radiotap.h>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0)
#include <net/netdev_rx_queue.h> #include <net/netdev_rx_queue.h>
#endif #endif
@ -292,12 +292,16 @@ typedef t_u8 BOOLEAN;
#define CARD_TYPE_PCIE_USB 7 #define CARD_TYPE_PCIE_USB 7
/** card type SD9177_UART */ /** card type SD9177_UART */
#define CARD_TYPE_SD9177_UART 1 // As per datasheet/SoC design #define CARD_TYPE_SD9177_UART 1 // As per datasheet/SoC design
/** card type SDIW624_UART */ /** card type SDIW624_UARTSPI */
#define CARD_TYPE_SDIW624_UART 0 // As per datasheet/SoC design #define CARD_TYPE_SDIW624_UARTSPI 0 // As per datasheet/SoC design
/** card type PCIEIW624_USB */ /** card type SDIW624_UARTUART */
#define CARD_TYPE_PCIEIW624_USB 4 // As per datasheet/SoC design #define CARD_TYPE_SDIW624_UARTUART 2 // As per datasheet/SoC design
/** card type PCIEIW624_UART */ /** card type PCIEIW624_USBUSB */
#define CARD_TYPE_PCIEIW624_UART 7 // As per datasheet/SoC design #define CARD_TYPE_PCIEIW624_USBUSB 4 // As per datasheet/SoC design
/** card type PCIEIW624_UARTUART */
#define CARD_TYPE_PCIEIW624_UARTUART 7 // As per datasheet/SoC design
/** card type PCIEIW624_UARTSPI */
#define CARD_TYPE_PCIEIW624_UARTSPI 5 // As per datasheet/SoC design
/* Max buffer size */ /* Max buffer size */
#define MAX_BUF_LEN 512 #define MAX_BUF_LEN 512
@ -866,6 +870,7 @@ typedef enum {
CONTROL_FRAME_MATCHED, // 8. Control frame matched CONTROL_FRAME_MATCHED, // 8. Control frame matched
MANAGEMENT_FRAME_MATCHED, // 9. Management frame matched MANAGEMENT_FRAME_MATCHED, // 9. Management frame matched
GTK_REKEY_FAILURE, // 10. GTK rekey failure GTK_REKEY_FAILURE, // 10. GTK rekey failure
MGMT_FRAME_FILTER_EXT_MATCHED, // 11. Management frame filter matched
RESERVED // Others: reserved RESERVED // Others: reserved
} HSWakeupReason_t; } HSWakeupReason_t;
@ -896,6 +901,11 @@ mlan_status woal_do_dfs_cac(moal_private *priv,
/** Custom indiciation message sent to the application layer for WMM changes */ /** Custom indiciation message sent to the application layer for WMM changes */
#define WMM_CONFIG_CHANGE_INDICATION "WMM_CONFIG_CHANGE.indication" #define WMM_CONFIG_CHANGE_INDICATION "WMM_CONFIG_CHANGE.indication"
/** Custom event : IBSS STA connect attempt */
#define CUS_EVT_IBSS_CONNECT_ATTEMPT "EVENT=IBSS_CONNECT_ATTEMPT_"
/** Custom event : IBSS STA dis-connect attempt */
#define CUS_EVT_IBSS_DISCONNECT_ATTEMPT "EVENT=IBSS_DISCONNECT_ATTEMPT_"
#define CUS_EVT_FW_DUMP_DONE "EVENT=FW_DUMP_DONE" #define CUS_EVT_FW_DUMP_DONE "EVENT=FW_DUMP_DONE"
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
@ -1054,6 +1064,12 @@ typedef struct _wait_queue {
#define DEF_VIRTUAL_BSS 0 #define DEF_VIRTUAL_BSS 0
#endif #endif
#endif /* WIFI_DIRECT_SUPPORT */ #endif /* WIFI_DIRECT_SUPPORT */
/** Driver mode NAN bit */
#define DRV_MODE_NAN MBIT(4)
/** Maximum NAN BSS */
#define MAX_NAN_BSS 1
/** Default NAN BSS */
#define DEF_NAN_BSS 1
/**Driver mode 0DFS bit**/ /**Driver mode 0DFS bit**/
#define DRV_MODE_DFS MBIT(7) #define DRV_MODE_DFS MBIT(7)
@ -1182,6 +1198,7 @@ enum woal_event_type {
WOAL_EVENT_CANCEL_CHANRPT, WOAL_EVENT_CANCEL_CHANRPT,
#endif #endif
#endif #endif
WOAL_EVENT_RGPWR_KEY_MISMATCH,
}; };
/** chan_rpt_info */ /** chan_rpt_info */
@ -2423,6 +2440,8 @@ typedef struct _moal_mod_para {
int max_vir_bss; int max_vir_bss;
#endif #endif
#endif /* WIFI_DIRECT_SUPPORT */ #endif /* WIFI_DIRECT_SUPPORT */
char *nan_name;
int max_nan_bss;
int auto_ds; int auto_ds;
int net_rx; int net_rx;
int amsdu_deaggr; int amsdu_deaggr;
@ -2487,10 +2506,13 @@ typedef struct _moal_mod_para {
int rps; int rps;
#endif #endif
#endif #endif
int edmac_ctrl;
int keep_previous_scan; int keep_previous_scan;
int auto_11ax; int auto_11ax;
/** hs_auto_arp setting */ /** hs_auto_arp setting */
int hs_auto_arp; int hs_auto_arp;
/** Dual-BT **/
int dual_nb;
} moal_mod_para; } moal_mod_para;
void woal_tp_acnt_timer_func(void *context); void woal_tp_acnt_timer_func(void *context);
@ -2625,6 +2647,10 @@ struct _moal_handle {
t_u16 fw_bands; t_u16 fw_bands;
/** ECSA support */ /** ECSA support */
t_u8 fw_ecsa_enable; t_u8 fw_ecsa_enable;
/* Firmware support cmd_tx_data */
t_u8 cmd_tx_data;
/** FW support security key for rgpower table */
t_u8 sec_rgpower;
/** FW ROAMING support */ /** FW ROAMING support */
t_u8 fw_roam_enable; t_u8 fw_roam_enable;
/** FW ROAMING capability in fw */ /** FW ROAMING capability in fw */
@ -2743,10 +2769,23 @@ struct _moal_handle {
struct workqueue_struct *pcie_cmd_resp_workqueue; struct workqueue_struct *pcie_cmd_resp_workqueue;
/** pcie rx cmd resp work */ /** pcie rx cmd resp work */
struct work_struct pcie_cmd_resp_work; struct work_struct pcie_cmd_resp_work;
/** pcie delayed work */
struct delayed_work pcie_delayed_tx_work;
#ifdef TASKLET_SUPPORT
/* pcie rx data tasklet */ /* pcie rx data tasklet */
struct tasklet_struct pcie_rx_task; struct tasklet_struct pcie_rx_task;
/* pcie tx complete tasklet */ /* pcie tx complete tasklet */
struct tasklet_struct pcie_tx_complete_task; struct tasklet_struct pcie_tx_complete_task;
#else
/** Driver pcie rx workqueue */
struct workqueue_struct *pcie_rx_workqueue;
/* pcie rx work */
struct work_struct pcie_rx_work;
/** Driver pcie tx complete workqueue */
struct workqueue_struct *pcie_tx_complete_workqueue;
/* pcie tx complete work */
struct work_struct pcie_tx_complete_work;
#endif
#endif #endif
/** event spin lock */ /** event spin lock */
spinlock_t evt_lock; spinlock_t evt_lock;
@ -3019,6 +3058,7 @@ struct _moal_handle {
#endif #endif
#endif #endif
t_u32 ips_ctrl; t_u32 ips_ctrl;
BOOLEAN is_edmac_enabled;
}; };
/** /**
@ -3626,6 +3666,7 @@ void woal_init_from_dev_tree(void);
mlan_status woal_init_sw(moal_handle *handle); mlan_status woal_init_sw(moal_handle *handle);
/** update the default firmware name */ /** update the default firmware name */
void woal_update_firmware_name(moal_handle *handle); void woal_update_firmware_name(moal_handle *handle);
mlan_status woal_set_rgpower_table(moal_handle *handle);
/** cancel all works in the queue */ /** cancel all works in the queue */
void woal_terminate_workqueue(moal_handle *handle); void woal_terminate_workqueue(moal_handle *handle);
void woal_flush_workqueue(moal_handle *handle); void woal_flush_workqueue(moal_handle *handle);
@ -4047,6 +4088,11 @@ t_void woal_mclist_work_queue(struct work_struct *work);
#ifdef PCIE #ifdef PCIE
t_void woal_pcie_rx_event_work_queue(struct work_struct *work); t_void woal_pcie_rx_event_work_queue(struct work_struct *work);
t_void woal_pcie_cmd_resp_work_queue(struct work_struct *work); t_void woal_pcie_cmd_resp_work_queue(struct work_struct *work);
t_void woal_pcie_delayed_tx_work(struct work_struct *work);
#ifndef TASKLET_SUPPORT
t_void woal_pcie_rx_work_queue(struct work_struct *work);
t_void woal_pcie_tx_complete_work_queue(struct work_struct *work);
#endif
#endif #endif
#ifdef STA_CFG80211 #ifdef STA_CFG80211
@ -4148,7 +4194,8 @@ t_void woal_add_mcast_node(moal_private *priv, t_u8 *mcast_addr);
void woal_remove_mcast_node(moal_private *priv, t_u8 *mcast_addr); void woal_remove_mcast_node(moal_private *priv, t_u8 *mcast_addr);
t_u8 woal_find_mcast_node_tx(moal_private *priv, struct sk_buff *skb); t_u8 woal_find_mcast_node_tx(moal_private *priv, struct sk_buff *skb);
mlan_status woal_request_country_power_table(moal_private *priv, char *region); mlan_status woal_request_country_power_table(moal_private *priv, char *region,
t_u8 wait_option);
mlan_status woal_mc_policy_cfg(moal_private *priv, t_u16 *enable, mlan_status woal_mc_policy_cfg(moal_private *priv, t_u16 *enable,
t_u8 wait_option, t_u8 action); t_u8 wait_option, t_u8 action);
#ifdef UAP_SUPPORT #ifdef UAP_SUPPORT
@ -4255,4 +4302,12 @@ void woal_disable_oob_wakeup_irq(moal_handle *handle);
void woal_enable_oob_wakeup_irq(moal_handle *handle); void woal_enable_oob_wakeup_irq(moal_handle *handle);
irqreturn_t woal_oob_wakeup_irq_handler(int irq, void *priv); irqreturn_t woal_oob_wakeup_irq_handler(int irq, void *priv);
#endif /* IMX_SUPPORT */ #endif /* IMX_SUPPORT */
t_bool woal_secure_add(t_void *datain, t_s32 add, t_void *dataout,
data_type type);
t_bool woal_secure_sub(t_void *datain, t_s32 sub, t_void *dataout,
data_type type);
mlan_status woal_edmac_cfg(moal_private *priv, t_u8 *country_code);
#endif /* _MOAL_MAIN_H */ #endif /* _MOAL_MAIN_H */

View file

@ -116,22 +116,6 @@ static const struct pci_device_id wlan_ids[] = {
0, 0,
}, },
#endif #endif
{
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,
},
#ifdef PCIEIW624 #ifdef PCIEIW624
{ {
PCIE_VENDOR_ID_NXP, PCIE_VENDOR_ID_NXP,
@ -157,8 +141,11 @@ static moal_if_ops pcie_ops;
********************************************************/ ********************************************************/
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) || \
defined(PCIE9097) || 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
/** @brief This function updates the card types /** @brief This function updates the card types
* *
@ -226,18 +213,6 @@ static t_u16 woal_update_card_type(t_void *card)
strlen(KERN_VERSION)); strlen(KERN_VERSION));
} }
#endif #endif
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),
V17, strlen(V17),
strlen(driver_version) - strlen(INTF_CARDTYPE) -
strlen(KERN_VERSION));
}
#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;
@ -385,10 +360,12 @@ perform_init:
goto err_init_fw; goto err_init_fw;
} }
#if defined(PCIE9098)
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);
else else
#endif
/* Update pcie_int_mode in mlan adapter */ /* Update pcie_int_mode in mlan adapter */
mlan_set_int_mode(handle->pmlan_adapter, mlan_set_int_mode(handle->pmlan_adapter,
handle->params.pcie_int_mode, 0); handle->params.pcie_int_mode, 0);
@ -598,12 +575,14 @@ 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 (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 !=
woal_pcie_rdwr_firmware(handle, 0, 1)) woal_pcie_rdwr_firmware(handle, 0, 1))
PRINTM(MMSG, "wlan: start in-bound IR...\n"); PRINTM(MMSG, "wlan: start in-bound IR...\n");
} }
#endif
done: done:
handle->surprise_removed = MTRUE; handle->surprise_removed = MTRUE;
pci_disable_device(dev); pci_disable_device(dev);
@ -1439,10 +1418,12 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
break; break;
} }
#if defined(PCIE9098)
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);
else else
#endif
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 0); mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 0);
done: done:
@ -1565,20 +1546,24 @@ void woal_pcie_bus_unregister(void)
LEAVE(); LEAVE();
} }
#if defined(PCIE9098) || defined(PCIE9097) || 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
#endif
#if defined(PCIE8897) || defined(PCIE8997) #if defined(PCIE8897) || defined(PCIE8997)
#define DEBUG_DUMP_CTRL_REG 0xCF4 #define DEBUG_DUMP_CTRL_REG 0xCF4
#define DEBUG_DUMP_START_REG 0xCF8 #define DEBUG_DUMP_START_REG 0xCF8
#define DEBUG_DUMP_END_REG 0xCFF #define DEBUG_DUMP_END_REG 0xCFF
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || 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
#define PCIE9098_DUMP_REG_START 0x1C20 #define PCIE9098_DUMP_REG_START 0x1C20
#define PCIE9098_DUMP_REG_END 0x1C9C #define PCIE9098_DUMP_REG_END 0x1C9C
#endif
#if defined(PCIE8997) || defined(PCIE8897) #if defined(PCIE8997) || defined(PCIE8897)
#define PCIE_SCRATCH_12_REG 0x0CF0; #define PCIE_SCRATCH_12_REG 0x0CF0;
@ -1608,9 +1593,11 @@ 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)
/* 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;
#endif
ENTER(); ENTER();
mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE);
drv_ptr += sprintf(drv_ptr, drv_ptr += sprintf(drv_ptr,
@ -1634,6 +1621,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || 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) ||
@ -1644,6 +1632,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
scratch_14_reg = PCIE9098_SCRATCH_14_REG; scratch_14_reg = PCIE9098_SCRATCH_14_REG;
scratch_15_reg = PCIE9098_SCRATCH_15_REG; scratch_15_reg = PCIE9098_SCRATCH_15_REG;
} }
#endif
woal_pcie_read_reg(phandle, reg, &value); woal_pcie_read_reg(phandle, reg, &value);
drv_ptr += sprintf(drv_ptr, "reg:0x%x value=0x%x\n", reg, value); drv_ptr += sprintf(drv_ptr, "reg:0x%x value=0x%x\n", reg, value);
@ -1677,6 +1666,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
} }
i++; i++;
} }
#if defined(PCIE9098) || defined(PCIE9097) || 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) ||
@ -1728,6 +1718,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
drv_ptr += sprintf(drv_ptr, "%s\n", buf); drv_ptr += sprintf(drv_ptr, "%s\n", buf);
} }
} }
#endif
drv_ptr += sprintf(drv_ptr, drv_ptr += sprintf(drv_ptr,
"-----------PCIe Registers dump End-----------\n"); "-----------PCIe Registers dump End-----------\n");
mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE);
@ -1754,9 +1745,11 @@ 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)
/* 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;
#endif
mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE);
PRINTM(MMSG, "Config Space Registers:\n"); PRINTM(MMSG, "Config Space Registers:\n");
for (i = 0; i < ARRAY_SIZE(config_reg_table); i++) { for (i = 0; i < ARRAY_SIZE(config_reg_table); i++) {
@ -1776,6 +1769,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || 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) ||
@ -1786,6 +1780,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
scratch_14_reg = PCIE9098_SCRATCH_14_REG; scratch_14_reg = PCIE9098_SCRATCH_14_REG;
scratch_15_reg = PCIE9098_SCRATCH_15_REG; scratch_15_reg = PCIE9098_SCRATCH_15_REG;
} }
#endif
woal_pcie_read_reg(phandle, reg, &value); woal_pcie_read_reg(phandle, reg, &value);
PRINTM(MERROR, "reg:0x%x value=0x%x\n", reg, value); PRINTM(MERROR, "reg:0x%x value=0x%x\n", reg, value);
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
@ -1814,6 +1809,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
} }
i++; i++;
} }
#if defined(PCIE9098) || defined(PCIE9097) || 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) ||
@ -1860,6 +1856,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
PRINTM(MMSG, "%s\n", buf); PRINTM(MMSG, "%s\n", buf);
} }
} }
#endif
mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE);
} }
@ -1902,12 +1899,18 @@ static memory_type_mapping mem_type_mapping_tbl_8897[] = {
}; };
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
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
static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL, static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL,
0xDD, 0x00}; 0xDD, 0x00};
#endif
#if defined(PCIE8897) || defined(PCIE8997) || defined(PCIE9098) || \
defined(PCIE9097) || defined(PCIEIW624)
/** /**
* @brief This function reads data by 8 bit from card register * @brief This function reads data by 8 bit from card register
* *
@ -1957,6 +1960,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
} }
#endif #endif
#if defined(PCIE9098) || defined(PCIE9097) || 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) ||
@ -1969,6 +1973,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
debug_host_ready = DEBUG_HOST_RESET_READY; debug_host_ready = DEBUG_HOST_RESET_READY;
dump_ctrl_reg = PCIE9098_DUMP_CTRL_REG; dump_ctrl_reg = PCIE9098_DUMP_CTRL_REG;
} }
#endif
ret = woal_pcie_write_reg(phandle, dump_ctrl_reg, debug_host_ready); ret = woal_pcie_write_reg(phandle, dump_ctrl_reg, debug_host_ready);
if (ret) { if (ret) {
@ -1976,6 +1981,7 @@ 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 (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) ||
@ -1983,6 +1989,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
if (phandle->event_fw_dump || resetflag) if (phandle->event_fw_dump || resetflag)
return RDWR_STATUS_SUCCESS; return RDWR_STATUS_SUCCESS;
} }
#endif
ret = woal_pcie_read_reg(phandle, dump_ctrl_reg, &reg_data); ret = woal_pcie_read_reg(phandle, dump_ctrl_reg, &reg_data);
if (ret) { if (ret) {
PRINTM(MERROR, "PCIE Read DEBUG_DUMP_CTRL_REG 0x%x fail\n", PRINTM(MERROR, "PCIE Read DEBUG_DUMP_CTRL_REG 0x%x fail\n",
@ -2025,6 +2032,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
} }
return RDWR_STATUS_SUCCESS; return RDWR_STATUS_SUCCESS;
} }
#endif
#ifdef PCIE8897 #ifdef PCIE8897
/** /**
@ -2225,6 +2233,8 @@ done:
} }
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
/** /**
* @brief This function dump firmware memory to file * @brief This function dump firmware memory to file
* *
@ -2256,6 +2266,7 @@ 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 (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) ||
@ -2269,6 +2280,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
} }
} }
} }
#endif
#ifndef DUMP_TO_PROC #ifndef DUMP_TO_PROC
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
/** Create dump directory*/ /** Create dump directory*/
@ -2292,6 +2304,7 @@ 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 (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) ||
@ -2299,6 +2312,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
dump_start_reg = PCIE9098_DUMP_START_REG; dump_start_reg = PCIE9098_DUMP_START_REG;
dump_end_reg = PCIE9098_DUMP_END_REG; dump_end_reg = PCIE9098_DUMP_END_REG;
} }
#endif
#ifdef PCIE8997 #ifdef PCIE8997
if (IS_PCIE8997(phandle->card_type)) { if (IS_PCIE8997(phandle->card_type)) {
dump_start_reg = DEBUG_DUMP_START_REG; dump_start_reg = DEBUG_DUMP_START_REG;
@ -2427,6 +2441,7 @@ done:
return; return;
} }
#endif
/** /**
* @brief This function check if this is second mac * @brief This function check if this is second mac
@ -2437,10 +2452,12 @@ 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)
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))
return MTRUE; return MTRUE;
#endif
return MFALSE; return MFALSE;
} }
@ -2458,6 +2475,8 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
if (IS_PCIE8897(phandle->card_type)) if (IS_PCIE8897(phandle->card_type))
woal_pcie_dump_fw_info_v1(phandle); woal_pcie_dump_fw_info_v1(phandle);
#endif #endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
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) ||
@ -2472,6 +2491,7 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
return; return;
} }
} }
#endif
phandle->fw_dump = MFALSE; phandle->fw_dump = MFALSE;
if (!phandle->priv_num) if (!phandle->priv_num)
return; return;
@ -2485,16 +2505,24 @@ 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)
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
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
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
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
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;
t_u32 magic = 0; t_u32 magic = 0;
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
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;
@ -2651,35 +2679,6 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
} }
} }
#endif #endif
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);
}
}
}
#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);
@ -2695,13 +2694,29 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
magic, boot_mode, strap, revision_id); magic, boot_mode, strap, revision_id);
if (boot_mode == 0x03) if (boot_mode == 0x03)
PRINTM(MMSG, "wlan: PCIE-IW624 in secure-boot mode\n"); PRINTM(MMSG, "wlan: PCIE-IW624 in secure-boot mode\n");
if (strap == CARD_TYPE_PCIEIW624_UART) if (strap == CARD_TYPE_PCIEIW624_UARTUART) {
if (handle->params.dual_nb)
strcpy(handle->card_info->fw_name,
PCIEUARTUARTIW624_DEFAULT_COMBO_FW_NAME);
else
strcpy(handle->card_info->fw_name, strcpy(handle->card_info->fw_name,
PCIEUARTIW624_DEFAULT_COMBO_FW_NAME); PCIEUARTIW624_DEFAULT_COMBO_FW_NAME);
} else if (strap == CARD_TYPE_PCIEIW624_UARTSPI) {
if (handle->params.dual_nb)
strcpy(handle->card_info->fw_name,
PCIEUARTSPIIW624_DEFAULT_COMBO_FW_NAME);
else
strcpy(handle->card_info->fw_name,
PCIEUARTIW624_DEFAULT_COMBO_FW_NAME);
} else {
if (handle->params.dual_nb)
strcpy(handle->card_info->fw_name,
PCIEUSBUSBIW624_DEFAULT_COMBO_FW_NAME);
else else
strcpy(handle->card_info->fw_name, strcpy(handle->card_info->fw_name,
PCIEUSBIW624_DEFAULT_COMBO_FW_NAME); PCIEUSBIW624_DEFAULT_COMBO_FW_NAME);
} }
}
#endif #endif
done: done:
PRINTM(MCMND, "combo fw:%s wlan fw:%s \n", handle->card_info->fw_name, PRINTM(MCMND, "combo fw:%s wlan fw:%s \n", handle->card_info->fw_name,

View file

@ -47,20 +47,24 @@ Change log:
#define PCIE_DEVICE_ID_88W9097 (0x2b56) #define PCIE_DEVICE_ID_88W9097 (0x2b56)
#endif #endif
#if defined(PCIE9098)
/** 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 */
#define PCIE_DEVICE_ID_88W9098P_FN1 (0x2b44) #define PCIE_DEVICE_ID_88W9098P_FN1 (0x2b44)
#endif
#ifdef PCIEIW624 #ifdef PCIEIW624
/** PCIE device ID for IW624 card FN0 */ /** PCIE device ID for IW624 card FN0 */
#define PCIE_DEVICE_ID_88WIW624 (0x3000) #define PCIE_DEVICE_ID_88WIW624 (0x3000)
#endif #endif
#if defined(PCIE9098)
/** 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 */
#define PCIE_DEVICE_ID_88WAW693_FN1 (0x3004) #define PCIE_DEVICE_ID_88WAW693_FN1 (0x3004)
#endif
#include <linux/version.h> #include <linux/version.h>
#include <linux/pci.h> #include <linux/pci.h>
@ -87,10 +91,6 @@ 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*/
#define PCIEUARTAW693_DEFAULT_COMBO_FW_NAME "nxp/pcieuartAW693_combo.bin"
#define PCIEAW693_DEFAULT_COMBO_FW_NAME "nxp/pcieAW693_wlan.bin"
#define PCIEAW693_DEFAULT_WLAN_FW_NAME "nxp/pcieAW693_wlan.bin"
#ifdef PCIE9098 #ifdef PCIE9098
#define PCIE9098_Z1Z2 0x00 #define PCIE9098_Z1Z2 0x00
#define PCIE9098_A0 0x01 #define PCIE9098_A0 0x01
@ -124,10 +124,18 @@ Change log:
#define PCIEIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw624_combo.bin" #define PCIEIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw624_combo.bin"
#define PCIEUARTIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieuartiw624_combo.bin" #define PCIEUARTIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieuartiw624_combo.bin"
#define PCIEUSBIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw624_combo.bin" #define PCIEUSBIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw624_combo.bin"
#define PCIEUARTUARTIW624_DEFAULT_COMBO_FW_NAME \
"nxp/pcieuartuartiw624_combo.bin"
#define PCIEUARTSPIIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieuartspiiw624_combo.bin"
#define PCIEUSBUSBIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieusbusbiw624_combo.bin"
#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)
#define PCIE_NUM_MSIX_VECTORS 32 #define PCIE_NUM_MSIX_VECTORS 32
#else
#define PCIE_NUM_MSIX_VECTORS 4
#endif
typedef struct _msix_context { typedef struct _msix_context {
/** pci_dev structure pointer */ /** pci_dev structure pointer */

View file

@ -6421,10 +6421,15 @@ static int woal_set_get_tx_rx_ant(moal_private *priv, struct iwreq *wrq)
radio->param.ant_cfg.rx_antenna = data[1]; radio->param.ant_cfg.rx_antenna = data[1];
} else { } else {
radio->param.ant_cfg_1x1.antenna = data[0]; radio->param.ant_cfg_1x1.antenna = data[0];
if (wrq->u.data.length == 2) if (wrq->u.data.length == 2) {
if (data[1] > 0xffff) {
ret = -EINVAL;
goto done;
}
radio->param.ant_cfg_1x1.evaluate_time = radio->param.ant_cfg_1x1.evaluate_time =
data[1]; data[1];
} }
}
req->action = MLAN_ACT_SET; req->action = MLAN_ACT_SET;
} else } else
req->action = MLAN_ACT_GET; req->action = MLAN_ACT_GET;

View file

@ -566,15 +566,22 @@ mlan_status woal_priv_set_tx_rx_ant(moal_handle *handle, char *line)
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type) || IS_CARD9097(priv->phandle->card_type) ||
IS_CARDIW624(priv->phandle->card_type)) { IS_CARDIW624(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
woal_cfg80211_notify_antcfg(priv, priv->phandle->wiphy, woal_cfg80211_notify_antcfg(priv, priv->phandle->wiphy,
radio); radio);
} }
#endif #endif
} else } else
radio->param.ant_cfg_1x1.antenna = data[0]; radio->param.ant_cfg_1x1.antenna = data[0];
if (user_data_len == 2) if (user_data_len == 2) {
if (data[1] > 0xffff) {
kfree(req);
LEAVE();
return MLAN_STATUS_FAILURE;
}
radio->param.ant_cfg_1x1.evaluate_time = data[1]; radio->param.ant_cfg_1x1.evaluate_time = data[1];
}
/* Send IOCTL request to MLAN */ /* Send IOCTL request to MLAN */
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_PENDING) if (status != MLAN_STATUS_PENDING)
@ -669,7 +676,7 @@ static ssize_t woal_config_write(struct file *f, const char __user *buf,
if (ref_handle) { if (ref_handle) {
priv = woal_get_priv(ref_handle, MLAN_BSS_ROLE_ANY); priv = woal_get_priv(ref_handle, MLAN_BSS_ROLE_ANY);
if (priv) { if (priv) {
handle->fw_dump_status = MTRUE; ref_handle->fw_dump_status = MTRUE;
woal_mlan_debug_info(priv); woal_mlan_debug_info(priv);
woal_moal_debug_info(priv, NULL, MFALSE); woal_moal_debug_info(priv, NULL, MFALSE);
} }

View file

@ -142,15 +142,12 @@ Change log:
#ifdef SDIW624 #ifdef SDIW624
#define SDIW624_DEFAULT_COMBO_FW_NAME "nxp/sdsdiw624_combo.bin" #define SDIW624_DEFAULT_COMBO_FW_NAME "nxp/sdsdiw624_combo.bin"
#define SDUARTIW624_COMBO_FW_NAME "nxp/sduartiw624_combo.bin" #define SDUARTIW624_COMBO_FW_NAME "nxp/sduartiw624_combo.bin"
#define SDUARTSPIIW624_COMBO_FW_NAME "nxp/sduartspiiw624_combo.bin"
#define SDUARTUARTIW624_COMBO_FW_NAME "nxp/sduartuartiw624_combo.bin"
#define SDSDIW624_COMBO_FW_NAME "sdsdiw624_combo.bin" #define SDSDIW624_COMBO_FW_NAME "sdsdiw624_combo.bin"
#define SDIW624_DEFAULT_WLAN_FW_NAME "nxp/sdiw624_wlan.bin" #define SDIW624_DEFAULT_WLAN_FW_NAME "nxp/sdiw624_wlan.bin"
#endif /* SDIW624 */ #endif /* SDIW624 */
#define SDAW693_DEFAULT_COMBO_FW_NAME "nxp/sdsd_aw693.bin"
#define SDUARTAW693_COMBO_FW_NAME "nxp/sduart_aw693.bin"
#define SDSDAW693_COMBO_FW_NAME "sdsd_aw693.bin"
#define SDAW693_DEFAULT_WLAN_FW_NAME "nxp/sd_aw693.bin"
#ifdef SD9177 #ifdef SD9177
#define SD9177_A0 0x00 #define SD9177_A0 0x00
#define SD9177_A1 0x01 #define SD9177_A1 0x01

View file

@ -71,10 +71,6 @@ 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
/** Device ID for SDAW693 */
#define SD_DEVICE_ID_AW693_FN1 (0x0211)
/** Device ID for SDAW693 */
#define SD_DEVICE_ID_AW693_FN2 (0x0212)
#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)
@ -117,8 +113,6 @@ 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
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN1)},
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN2)},
#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)},
@ -417,19 +411,6 @@ static t_u16 woal_update_card_type(t_void *card)
(strlen(INTF_CARDTYPE) + strlen(KERN_VERSION))); (strlen(INTF_CARDTYPE) + strlen(KERN_VERSION)));
} }
#endif #endif
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)));
}
#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;
@ -1375,10 +1356,10 @@ 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)
struct sdio_mmc_card *card = (struct sdio_mmc_card *)handle->card; struct sdio_mmc_card *card = (struct sdio_mmc_card *)handle->card;
#endif
if (card->func->device == SD_DEVICE_ID_AW693_FN2)
return MTRUE;
#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;
@ -1395,10 +1376,14 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
t_u32 revision_id = 0; t_u32 revision_id = 0;
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) || \
defined(SD9097) || defined(SDIW624) || defined(SD8978) || \
defined(SD9177)
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;
t_u32 strap = 0; t_u32 strap = 0;
#endif
ENTER(); ENTER();
@ -1412,6 +1397,9 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
woal_sdiommc_read_reg(handle, rev_id_reg, &revision_id); woal_sdiommc_read_reg(handle, rev_id_reg, &revision_id);
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) || \
defined(SD9097) || defined(SDIW624) || defined(SD8978) || \
defined(SD9177)
/** 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 */
@ -1420,6 +1408,7 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
magic &= 0xFF; magic &= 0xFF;
/* 1 = SDSD, 0 --SD UART */ /* 1 = SDSD, 0 --SD UART */
PRINTM(MCMND, "magic=0x%x strap=0x%x\n", magic, strap); PRINTM(MCMND, "magic=0x%x strap=0x%x\n", magic, strap);
#endif
#if defined(SD8977) #if defined(SD8977)
if (IS_SD8977(handle->card_type)) { if (IS_SD8977(handle->card_type)) {
switch (revision_id) { switch (revision_id) {
@ -1575,31 +1564,35 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
} }
} }
#endif #endif
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);
}
}
#ifdef SDIW624 #ifdef SDIW624
if (IS_SDIW624(handle->card_type)) { if (IS_SDIW624(handle->card_type)) {
magic &= 0x03; magic &= 0x03;
if (magic == 0x03) if (magic == 0x03)
PRINTM(MMSG, "wlan: SDIW624 in secure-boot mode\n"); PRINTM(MMSG, "wlan: SDIW624 in secure-boot mode\n");
if (strap == CARD_TYPE_SDIW624_UART) if (strap == CARD_TYPE_SDIW624_UARTSPI) {
if (handle->params.dual_nb)
strncpy(handle->card_info->fw_name, strncpy(handle->card_info->fw_name,
SDUARTIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN); SDUARTSPIIW624_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
else else
strncpy(handle->card_info->fw_name,
SDUARTIW624_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
} else if (strap == CARD_TYPE_SDIW624_UARTUART) {
if (handle->params.dual_nb)
strncpy(handle->card_info->fw_name,
SDUARTUARTIW624_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
else
strncpy(handle->card_info->fw_name,
SDUARTIW624_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
} else {
strncpy(handle->card_info->fw_name, strncpy(handle->card_info->fw_name,
SDSDIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN); SDSDIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN);
} }
}
#endif #endif
#ifdef SD9177 #ifdef SD9177
@ -2126,9 +2119,12 @@ void woal_dump_firmware_info_v2(moal_handle *phandle)
moal_get_system_time(phandle, &sec, &usec); moal_get_system_time(phandle, &sec, &usec);
PRINTM(MMSG, "==== DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, usec); PRINTM(MMSG, "==== DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, usec);
/* read the number of the memories which will dump */ /* read the number of the memories which will dump */
if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MFALSE)) {
if (RDWR_STATUS_FAILURE == if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE)) woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE))
goto done; goto done;
}
reg = dbg_dump_start_reg; reg = dbg_dump_start_reg;
ret = woal_sdio_readb(phandle, reg, &dump_num); ret = woal_sdio_readb(phandle, reg, &dump_num);
if (ret) { if (ret) {
@ -2305,6 +2301,13 @@ void woal_dump_firmware_info_v3(moal_handle *phandle)
#ifdef SD9177 #ifdef SD9177
if (IS_SD9177(phandle->card_type)) { if (IS_SD9177(phandle->card_type)) {
if (phandle->event_fw_dump) { if (phandle->event_fw_dump) {
if (RDWR_STATUS_FAILURE !=
woal_cmd52_rdwr_firmware(phandle, doneflag,
MFALSE)) {
PRINTM(MMSG,
"====SDIO FW DUMP EVENT MODE START ====\n");
return;
}
if (RDWR_STATUS_FAILURE != if (RDWR_STATUS_FAILURE !=
woal_cmd52_rdwr_firmware(phandle, doneflag, woal_cmd52_rdwr_firmware(phandle, doneflag,
MTRUE)) { MTRUE)) {
@ -2338,9 +2341,12 @@ void woal_dump_firmware_info_v3(moal_handle *phandle)
moal_get_system_time(phandle, &sec, &usec); moal_get_system_time(phandle, &sec, &usec);
PRINTM(MMSG, "==== DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, usec); PRINTM(MMSG, "==== DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, usec);
/* read the number of the memories which will dump */ /* read the number of the memories which will dump */
if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MFALSE)) {
if (RDWR_STATUS_FAILURE == if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE)) woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE))
goto done; goto done;
}
/** check the reg which indicate dump starting */ /** check the reg which indicate dump starting */
for (reg = dbg_dump_start_reg; reg <= dbg_dump_end_reg; reg++) { for (reg = dbg_dump_start_reg; reg <= dbg_dump_end_reg; reg++) {
@ -2524,7 +2530,7 @@ static void woal_sdiommc_reg_dbg(moal_handle *phandle)
mdelay(100); mdelay(100);
func = 1; func = 1;
reg_start = scratch_reg; reg_start = scratch_reg;
reg_end = scratch_reg + 10; reg_end = scratch_reg + 23;
} }
if (loop != 2) if (loop != 2)
ptr += snprintf(ptr, sizeof(buf), ptr += snprintf(ptr, sizeof(buf),
@ -2600,6 +2606,7 @@ static void woal_sdiommc_dump_fw_info(moal_handle *phandle)
} }
#endif #endif
phandle->fw_dump = MFALSE; phandle->fw_dump = MFALSE;
woal_sdiommc_reg_dbg(phandle);
if (!phandle->priv_num) if (!phandle->priv_num)
return; return;
woal_send_fw_dump_complete_event( woal_send_fw_dump_complete_event(
@ -2709,7 +2716,7 @@ static int woal_sdiommc_dump_reg_info(moal_handle *phandle, t_u8 *drv_buf)
mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE);
LEAVE(); LEAVE();
return drv_ptr - (char *)drv_buf; return (int)(drv_ptr - (char *)drv_buf);
} }
/** /**

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-2022 NXP * Copyright 2008-2023 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
@ -924,6 +924,8 @@ mlan_status moal_get_hw_spec_complete(t_void *pmoal, mlan_status status,
MLAN_MAX_VER_STR_LEN - 1); MLAN_MAX_VER_STR_LEN - 1);
} }
#endif #endif
if (phw->fw_cap & FW_CAPINFO_DISABLE_NAN)
handle->params.drv_mode &= ~DRV_MODE_NAN;
/** FW should only enable DFS on one mac */ /** FW should only enable DFS on one mac */
if (!(phw->fw_cap & FW_CAPINFO_ZERO_DFS)) if (!(phw->fw_cap & FW_CAPINFO_ZERO_DFS))
handle->params.drv_mode &= ~DRV_MODE_DFS; handle->params.drv_mode &= ~DRV_MODE_DFS;
@ -2561,6 +2563,31 @@ static void woal_rx_mgmt_pkt_event(moal_private *priv, t_u8 *pkt, t_u16 len)
#endif #endif
#endif #endif
/**
* @brief This function handles rgpower key mismatch event
*
* @param priv pointer to the moal_private structure.
*
* @return N/A
*/
void woal_rgpower_key_mismatch_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) {
evt->priv = priv;
evt->type = WOAL_EVENT_RGPWR_KEY_MISMATCH;
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);
}
}
/** /**
* @brief This function handles defer event receive * @brief This function handles defer event receive
* *
@ -2578,7 +2605,11 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
#ifdef PCIE #ifdef PCIE
case MLAN_EVENT_ID_DRV_DEFER_RX_DATA: case MLAN_EVENT_ID_DRV_DEFER_RX_DATA:
status = MLAN_STATUS_SUCCESS; status = MLAN_STATUS_SUCCESS;
#ifdef TASKLET_SUPPORT
tasklet_schedule(&handle->pcie_rx_task); tasklet_schedule(&handle->pcie_rx_task);
#else
queue_work(handle->pcie_rx_workqueue, &handle->pcie_rx_work);
#endif
break; break;
case MLAN_EVENT_ID_DRV_DEFER_RX_EVENT: case MLAN_EVENT_ID_DRV_DEFER_RX_EVENT:
status = MLAN_STATUS_SUCCESS; status = MLAN_STATUS_SUCCESS;
@ -2592,7 +2623,16 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
break; break;
case MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE: case MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE:
status = MLAN_STATUS_SUCCESS; status = MLAN_STATUS_SUCCESS;
#ifdef TASKLET_SUPPORT
tasklet_schedule(&handle->pcie_tx_complete_task); tasklet_schedule(&handle->pcie_tx_complete_task);
#else
queue_work(handle->pcie_tx_complete_workqueue,
&handle->pcie_tx_complete_work);
#endif
break;
case MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE:
status = MLAN_STATUS_SUCCESS;
schedule_delayed_work(&handle->pcie_delayed_tx_work, 1);
break; break;
#endif /* PCIE */ #endif /* PCIE */
@ -2604,7 +2644,11 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
} }
#ifdef PCIE #ifdef PCIE
if (IS_PCIE(handle->card_type)) { if (IS_PCIE(handle->card_type)) {
#ifdef TASKLET_SUPPORT
tasklet_kill(&handle->pcie_rx_task); tasklet_kill(&handle->pcie_rx_task);
#else
flush_workqueue(handle->pcie_rx_workqueue);
#endif
break; break;
} }
#endif #endif
@ -2628,7 +2672,12 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
} }
#ifdef PCIE #ifdef PCIE
if (IS_PCIE(handle->card_type)) { if (IS_PCIE(handle->card_type)) {
#ifdef TASKLET_SUPPORT
tasklet_schedule(&handle->pcie_rx_task); tasklet_schedule(&handle->pcie_rx_task);
#else
queue_work(handle->pcie_rx_workqueue,
&handle->pcie_rx_work);
#endif
break; break;
} }
#endif #endif
@ -2663,6 +2712,13 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
#if defined(STA_SUPPORT) || defined(UAP_SUPPORT) #if defined(STA_SUPPORT) || defined(UAP_SUPPORT)
moal_private *pmpriv = NULL; moal_private *pmpriv = NULL;
#endif #endif
#if defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
struct station_info *sinfo = NULL;
#endif
#endif
char concat_str[64], peer_mac_str[20];
#if defined(STA_WEXT) || defined(UAP_WEXT) #if defined(STA_WEXT) || defined(UAP_WEXT)
#if defined(STA_SUPPORT) || defined(UAP_WEXT) #if defined(STA_SUPPORT) || defined(UAP_WEXT)
#if defined(UAP_SUPPORT) || defined(STA_WEXT) #if defined(UAP_SUPPORT) || defined(STA_WEXT)
@ -3705,12 +3761,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
break; break;
PRINTM(MMSG, "OLD BW = %d NEW BW = %d", priv->bandwidth, PRINTM(MMSG, "OLD BW = %d NEW BW = %d", priv->bandwidth,
pchan_info->bandcfg.chanWidth); pchan_info->bandcfg.chanWidth);
#ifdef UAP_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
woal_update_uap_channel_dfs_state(priv);
#endif
#endif
priv->channel = pchan_info->channel; priv->channel = pchan_info->channel;
priv->bandwidth = pchan_info->bandcfg.chanWidth; priv->bandwidth = pchan_info->bandcfg.chanWidth;
@ -4070,10 +4120,18 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
PRINTM(MCMND, "deauth reason code =0x%x\n", PRINTM(MCMND, "deauth reason code =0x%x\n",
reason_code); reason_code);
/** BIT 14 indicate deauth is initiated by FW */ /** BIT 14 indicate deauth is initiated by FW */
if (reason_code & MBIT(14)) if (reason_code & MBIT(14)) {
if (reason_code & MBIT(1)) {
reason_code =
MLAN_REASON_DISASSOC_DUE_TO_INACTIVITY;
woal_host_mlme_disconnect(
priv, reason_code,
pmevent->event_buf + 2);
} else
woal_host_mlme_disconnect( woal_host_mlme_disconnect(
priv, 0, priv, 0,
pmevent->event_buf + 2); pmevent->event_buf + 2);
}
} else } else
#endif #endif
if (priv->netdev && priv->wdev) if (priv->netdev && priv->wdev)
@ -4118,7 +4176,7 @@ 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 (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) { if (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) {
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 39)
if (priv->netdev && if (priv->netdev && priv->netdev->ieee80211_ptr &&
priv->netdev->ieee80211_ptr->wiphy->mgmt_stypes && priv->netdev->ieee80211_ptr->wiphy->mgmt_stypes &&
priv->mgmt_subtype_mask) { priv->mgmt_subtype_mask) {
/* frmctl + durationid + addr1 + addr2 + addr3 + /* frmctl + durationid + addr1 + addr2 + addr3 +
@ -4356,6 +4414,82 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
woal_broadcast_event(priv, pmevent->event_buf, woal_broadcast_event(priv, pmevent->event_buf,
pmevent->event_len); pmevent->event_len);
break; break;
case MLAN_EVENT_ID_FW_IBSS_CONNECT:
PRINTM(MINFO, "STA Connect attempt\n");
DBG_HEXDUMP(MCMD_D, "IBSS Connect", pmevent->event_buf,
pmevent->event_len);
memset(concat_str, 0, sizeof(concat_str));
snprintf(peer_mac_str, sizeof(peer_mac_str),
"%02x%02x%02x%02x%02x%02x", *(pmevent->event_buf + 6),
*(pmevent->event_buf + 7), *(pmevent->event_buf + 8),
*(pmevent->event_buf + 9), *(pmevent->event_buf + 10),
*(pmevent->event_buf + 11));
peer_mac_str[ETH_ALEN * 2] = '\0';
#if defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
if (IS_STA_CFG80211(cfg80211_wext)) {
sinfo = kzalloc(sizeof(struct station_info),
GFP_KERNEL);
if (sinfo) {
/* Notify user space about new station */
cfg80211_new_sta(priv->netdev,
pmevent->event_buf + 6, sinfo,
GFP_KERNEL);
kfree(sinfo);
} else {
PRINTM(MERROR,
"IBSS:Failed to allocate memory to new station");
}
}
#endif
#endif
snprintf(concat_str, sizeof(concat_str), "%s%s",
CUS_EVT_IBSS_CONNECT_ATTEMPT, peer_mac_str);
woal_broadcast_event(priv, concat_str, strlen(concat_str));
#ifdef STA_WEXT
#ifdef STA_SUPPORT
if (IS_STA_WEXT(cfg80211_wext)) {
woal_send_iwevcustom_event(priv, concat_str);
}
#endif
#endif
break;
case MLAN_EVENT_ID_FW_IBSS_DISCONNECT:
PRINTM(MINFO, "STA Disconnect attempt\n");
DBG_HEXDUMP(MCMD_D, "IBSS DisConnect", pmevent->event_buf,
pmevent->event_len);
memset(concat_str, 0, sizeof(concat_str));
snprintf(peer_mac_str, sizeof(peer_mac_str),
"%02x%02x%02x%02x%02x%02x", *(pmevent->event_buf + 6),
*(pmevent->event_buf + 7), *(pmevent->event_buf + 8),
*(pmevent->event_buf + 9), *(pmevent->event_buf + 10),
*(pmevent->event_buf + 11));
peer_mac_str[ETH_ALEN * 2] = '\0';
snprintf(concat_str, sizeof(concat_str), "%s%s",
CUS_EVT_IBSS_DISCONNECT_ATTEMPT, peer_mac_str);
woal_broadcast_event(priv, concat_str, strlen(concat_str));
#ifdef STA_WEXT
#ifdef STA_SUPPORT
if (IS_STA_WEXT(cfg80211_wext)) {
woal_send_iwevcustom_event(priv, concat_str);
}
#endif
#endif
#if defined(STA_CFG80211)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
if (IS_STA_CFG80211(cfg80211_wext)) {
cfg80211_del_sta(priv->netdev, pmevent->event_buf + 6,
GFP_KERNEL);
}
#endif
#endif
break;
case MLAN_EVENT_ID_DRV_ASSOC_FAILURE_REPORT: case MLAN_EVENT_ID_DRV_ASSOC_FAILURE_REPORT:
PRINTM(MINFO, "Assoc result\n"); PRINTM(MINFO, "Assoc result\n");
@ -4700,6 +4834,10 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
custom_len + csi_len); custom_len + csi_len);
priv->csi_seq++; priv->csi_seq++;
break; break;
case MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH:
if (handle->sec_rgpower)
woal_rgpower_key_mismatch_event(priv);
break;
default: default:
break; break;
} }

View file

@ -462,9 +462,12 @@ static const struct ieee80211_txrx_stypes
ieee80211_mgmt_stypes[NUM_NL80211_IFTYPES] = { ieee80211_mgmt_stypes[NUM_NL80211_IFTYPES] = {
[NL80211_IFTYPE_STATION] = { [NL80211_IFTYPE_STATION] = {
.tx = MBIT(IEEE80211_STYPE_ACTION >> 4) | .tx = MBIT(IEEE80211_STYPE_ACTION >> 4) |
MBIT(IEEE80211_STYPE_PROBE_RESP >> 4), MBIT(IEEE80211_STYPE_PROBE_RESP >> 4)|
MBIT(IEEE80211_STYPE_AUTH >> 4)|
MBIT(IEEE80211_STYPE_DEAUTH >> 4),
.rx = MBIT(IEEE80211_STYPE_ACTION >> 4) | .rx = MBIT(IEEE80211_STYPE_ACTION >> 4) |
MBIT(IEEE80211_STYPE_PROBE_REQ >> 4), MBIT(IEEE80211_STYPE_PROBE_REQ >> 4)|
MBIT(IEEE80211_STYPE_AUTH >> 4),
}, },
[NL80211_IFTYPE_AP] = { [NL80211_IFTYPE_AP] = {
.tx = 0xffff, .tx = 0xffff,
@ -1067,6 +1070,8 @@ static int woal_cfg80211_assoc_ies_cfg(moal_private *priv, t_u8 *ie,
pcurrent_ptr, &total_ie_len, pcurrent_ptr, &total_ie_len,
wait_option)) { wait_option)) {
PRINTM(MERROR, "Fail to set GEN IE\n"); PRINTM(MERROR, "Fail to set GEN IE\n");
DBG_HEXDUMP(MCMD_D, "GEN IE", pcurrent_ptr,
total_ie_len);
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
} }
@ -1246,7 +1251,7 @@ static mlan_status woal_send_domain_info_cmd_fw(moal_private *priv,
priv->phandle->country_code[1]; priv->phandle->country_code[1];
} }
cfg_11d->param.domain_info.country_code[2] = ' '; cfg_11d->param.domain_info.country_code[2] = ' ';
cfg_11d->param.domain_info.band = band; cfg_11d->param.domain_info.band = woal_ieee_band_to_radio_type(band);
sband = priv->wdev->wiphy->bands[band]; sband = priv->wdev->wiphy->bands[band];
for (i = 0; (i < sband->n_channels) && for (i = 0; (i < sband->n_channels) &&
@ -2152,6 +2157,43 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
return ret; return ret;
} }
/**
* @brief Send set host_mlme request to MLAN
*
* @param priv A pointer to moal_private structure
*
* @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING
* -- success, otherwise fail
*/
mlan_status woal_request_set_host_mlme(moal_private *priv)
{
mlan_ioctl_req *req = NULL;
mlan_ds_bss *bss = NULL;
mlan_status status;
ENTER();
/* Allocate an IOCTL request buffer */
req = (mlan_ioctl_req *)woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_bss));
if (req == NULL) {
status = MLAN_STATUS_FAILURE;
goto done;
}
/* Fill request buffer */
bss = (mlan_ds_bss *)req->pbuf;
bss->sub_command = MLAN_OID_BSS_HOST_MLME;
req->req_id = MLAN_IOCTL_BSS;
req->action = MLAN_ACT_SET;
/* Send IOCTL request to MLAN */
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
done:
if (status != MLAN_STATUS_PENDING)
kfree(req);
LEAVE();
return status;
}
/** /**
* @brief This function is authentication handler when host MLME * @brief This function is authentication handler when host MLME
* enable. * enable.
@ -2173,12 +2215,14 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
IEEE80211_MGMT *mgmt = NULL; IEEE80211_MGMT *mgmt = NULL;
mlan_status status = MLAN_STATUS_SUCCESS; mlan_status status = MLAN_STATUS_SUCCESS;
pmlan_buffer pmbuf = NULL; pmlan_buffer pmbuf = NULL;
mlan_ioctl_req *ioctl_req = NULL;
mlan_ds_misc_cfg *misc = NULL;
t_u8 *pbuf = NULL;
t_u32 pkt_type, tx_control; t_u32 pkt_type, tx_control;
t_u16 packet_len = 0, auth_alg; t_u16 packet_len = 0, auth_alg;
t_u16 pkt_len; t_u16 pkt_len;
t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
int ret = 0; int ret = 0;
t_u8 trans = 1, status_code = 0; t_u8 trans = 1, status_code = 0;
t_u8 *varptr = NULL; t_u8 *varptr = NULL;
moal_handle *handle = priv->phandle; moal_handle *handle = priv->phandle;
@ -2295,31 +2339,9 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
woal_mgmt_frame_register(priv, IEEE80211_STYPE_DISASSOC, MTRUE); woal_mgmt_frame_register(priv, IEEE80211_STYPE_DISASSOC, MTRUE);
} }
#define HEADER_SIZE 8
// frmctl + durationid + addr1 + addr2 + addr3 + seqctl + addr4
#define MGMT_HEADER_LEN (2 + 2 + 6 + 6 + 6 + 2 + 6)
// 6 = auth_alg + auth_transaction +auth_status
#define AUTH_BODY_LEN 6
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
packet_len = (t_u16)req->ie_len + req->auth_data_len + MGMT_HEADER_LEN +
AUTH_BODY_LEN;
#else
packet_len = (t_u16)req->ie_len + req->sae_data_len + MGMT_HEADER_LEN +
AUTH_BODY_LEN;
#endif
pmbuf = woal_alloc_mlan_buffer(priv->phandle,
MLAN_MIN_DATA_HEADER_LEN + HEADER_SIZE +
packet_len + sizeof(packet_len));
if (!pmbuf) {
PRINTM(MERROR, "Fail to allocate mlan_buffer\n");
ret = -ENOMEM;
goto done;
}
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0, woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0,
KEY_INDEX_CLEAR_ALL, NULL, 1, KEY_INDEX_CLEAR_ALL, NULL, 1, 0,
MOAL_IOCTL_WAIT)) { MOAL_IOCTL_WAIT)) {
/* Disable keys and clear all previous security settings */ /* Disable keys and clear all previous security settings */
PRINTM(MERROR, "Fail to clear previous keys\n"); PRINTM(MERROR, "Fail to clear previous keys\n");
@ -2401,19 +2423,54 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
dev->name, status); dev->name, status);
} }
} }
#define HEADER_SIZE 8
// frmctl + durationid + addr1 + addr2 + addr3 + seqctl + addr4
#define MGMT_HEADER_LEN (2 + 2 + 6 + 6 + 6 + 2 + 6)
// 6 = auth_alg + auth_transaction +auth_status
#define AUTH_BODY_LEN 6
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 10, 0)
packet_len = (t_u16)req->ie_len + req->auth_data_len + MGMT_HEADER_LEN +
AUTH_BODY_LEN;
#else
packet_len = (t_u16)req->ie_len + req->sae_data_len + MGMT_HEADER_LEN +
AUTH_BODY_LEN;
#endif
if (priv->phandle->cmd_tx_data) {
ioctl_req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg));
if (ioctl_req == NULL) {
ret = -ENOMEM;
goto done;
}
misc = (mlan_ds_misc_cfg *)ioctl_req->pbuf;
misc->sub_command = MLAN_OID_MISC_TX_FRAME;
ioctl_req->req_id = MLAN_IOCTL_MISC_CFG;
ioctl_req->action = MLAN_ACT_SET;
misc->param.tx_frame.bandcfg.chanBand =
woal_ieee_band_to_radio_type(req->bss->channel->band);
misc->param.tx_frame.channel = req->bss->channel->hw_value;
pbuf = misc->param.tx_frame.tx_buf;
} else {
pmbuf = woal_alloc_mlan_buffer(
priv->phandle, MLAN_MIN_DATA_HEADER_LEN + HEADER_SIZE +
packet_len + sizeof(packet_len));
if (!pmbuf) {
PRINTM(MERROR, "Fail to allocate mlan_buffer\n");
ret = -ENOMEM;
goto done;
}
pmbuf->data_offset = MLAN_MIN_DATA_HEADER_LEN; pmbuf->data_offset = MLAN_MIN_DATA_HEADER_LEN;
pbuf = pmbuf->pbuf + pmbuf->data_offset;
}
pkt_type = MRVL_PKT_TYPE_MGMT_FRAME; pkt_type = MRVL_PKT_TYPE_MGMT_FRAME;
tx_control = 0; tx_control = 0;
/* Add pkt_type and tx_control */ /* Add pkt_type and tx_control */
moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset, moal_memcpy_ext(priv->phandle, pbuf, &pkt_type, sizeof(pkt_type),
&pkt_type, sizeof(pkt_type), sizeof(pkt_type)); sizeof(pkt_type));
moal_memcpy_ext(priv->phandle, moal_memcpy_ext(priv->phandle, pbuf + sizeof(pkt_type), &tx_control,
pmbuf->pbuf + pmbuf->data_offset + sizeof(pkt_type), sizeof(tx_control), sizeof(tx_control));
&tx_control, sizeof(tx_control), sizeof(tx_control));
mgmt = (IEEE80211_MGMT *)(pmbuf->pbuf + pmbuf->data_offset + mgmt = (IEEE80211_MGMT *)(pbuf + HEADER_SIZE + sizeof(packet_len));
HEADER_SIZE + sizeof(packet_len));
memset(mgmt, 0, MGMT_HEADER_LEN); memset(mgmt, 0, MGMT_HEADER_LEN);
/**Authentication Frame: Frame Control*/ /**Authentication Frame: Frame Control*/
mgmt->frame_control = mgmt->frame_control =
@ -2463,9 +2520,8 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
#endif #endif
/*Add packet len*/ /*Add packet len*/
pkt_len = woal_cpu_to_le16(packet_len); pkt_len = woal_cpu_to_le16(packet_len);
moal_memcpy_ext(priv->phandle, moal_memcpy_ext(priv->phandle, pbuf + HEADER_SIZE, &pkt_len,
pmbuf->pbuf + pmbuf->data_offset + HEADER_SIZE, sizeof(pkt_len), sizeof(pkt_len));
&pkt_len, sizeof(pkt_len), sizeof(pkt_len));
/**Authentication Frame: Authentication Alg*/ /**Authentication Frame: Authentication Alg*/
mgmt->u.auth.auth_alg = woal_cpu_to_le16(auth_alg); mgmt->u.auth.auth_alg = woal_cpu_to_le16(auth_alg);
@ -2481,30 +2537,48 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
req->ie_len, req->ie_len); req->ie_len, req->ie_len);
} }
priv->host_mlme = MTRUE;
priv->auth_flag = HOST_MLME_AUTH_PENDING;
priv->auth_alg = woal_cpu_to_le16(auth_alg);
woal_save_auth_params(priv, req);
woal_request_set_host_mlme(priv);
PRINTM(MMSG, "wlan: HostMlme %s send auth to bssid " MACSTR "\n",
dev->name, MAC2STR(req->bss->bssid));
DBG_HEXDUMP(MDAT_D, "Auth:", pbuf,
HEADER_SIZE + packet_len + sizeof(packet_len));
if (priv->phandle->cmd_tx_data) {
misc->param.tx_frame.data_len =
HEADER_SIZE + packet_len + sizeof(packet_len);
misc->param.tx_frame.buf_type = MLAN_BUF_TYPE_RAW_DATA;
misc->param.tx_frame.priority = 7;
status = woal_request_ioctl(priv, ioctl_req, MOAL_IOCTL_WAIT);
if (status != MLAN_STATUS_SUCCESS) {
priv->host_mlme = MFALSE;
priv->auth_flag = 0;
priv->auth_alg = 0xFFFF;
ret = -EFAULT;
PRINTM(MERROR, "Fail to send packet status=%d\n",
status);
}
} else {
pmbuf->data_len = HEADER_SIZE + packet_len + sizeof(packet_len); pmbuf->data_len = HEADER_SIZE + packet_len + sizeof(packet_len);
pmbuf->buf_type = MLAN_BUF_TYPE_RAW_DATA; pmbuf->buf_type = MLAN_BUF_TYPE_RAW_DATA;
pmbuf->bss_index = priv->bss_index; pmbuf->bss_index = priv->bss_index;
pmbuf->priority = 7; pmbuf->priority = 7;
priv->host_mlme = MTRUE;
priv->auth_flag = HOST_MLME_AUTH_PENDING;
priv->auth_alg = woal_cpu_to_le16(auth_alg);
PRINTM(MMSG, "wlan: HostMlme %s send auth to bssid " MACSTR "\n",
dev->name, MAC2STR(req->bss->bssid));
DBG_HEXDUMP(MDAT_D, "Auth:", pmbuf->pbuf + pmbuf->data_offset,
pmbuf->data_len);
woal_save_auth_params(priv, req);
status = mlan_send_packet(priv->phandle->pmlan_adapter, pmbuf); status = mlan_send_packet(priv->phandle->pmlan_adapter, pmbuf);
switch (status) { switch (status) {
case MLAN_STATUS_PENDING: case MLAN_STATUS_PENDING:
atomic_inc(&priv->phandle->tx_pending); atomic_inc(&priv->phandle->tx_pending);
queue_work(priv->phandle->workqueue, &priv->phandle->main_work); queue_work(priv->phandle->workqueue,
&priv->phandle->main_work);
#define MAX_AUTH_COUNTER 5 #define MAX_AUTH_COUNTER 5
priv->auth_tx_cnt++; priv->auth_tx_cnt++;
if (priv->auth_tx_cnt >= MAX_AUTH_COUNTER) { if (priv->auth_tx_cnt >= MAX_AUTH_COUNTER) {
if (woal_reset_wifi(priv->phandle, priv->auth_tx_cnt, if (woal_reset_wifi(priv->phandle,
priv->auth_tx_cnt,
"auth timeout") == "auth timeout") ==
MLAN_STATUS_SUCCESS) { MLAN_STATUS_SUCCESS) {
priv->auth_tx_cnt = 0; priv->auth_tx_cnt = 0;
@ -2521,10 +2595,16 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
priv->auth_flag = 0; priv->auth_flag = 0;
priv->auth_alg = 0xFFFF; priv->auth_alg = 0xFFFF;
ret = -EFAULT; ret = -EFAULT;
PRINTM(MERROR, "Fail to send packet status=%d\n", status); PRINTM(MERROR, "Fail to send packet status=%d\n",
status);
break; break;
} }
}
done: done:
if (priv->phandle->cmd_tx_data) {
if (status != MLAN_STATUS_PENDING)
kfree(ioctl_req);
}
if (ret) { if (ret) {
woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MFALSE); woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MFALSE);
if (priv->phandle->remain_on_channel) { if (priv->phandle->remain_on_channel) {
@ -2777,6 +2857,13 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
mlan_status status = MLAN_STATUS_SUCCESS; mlan_status status = MLAN_STATUS_SUCCESS;
ENTER(); ENTER();
if (!priv->auth_flag && !priv->host_mlme) {
PRINTM(MINFO,
"wlan: HostMlme %s can not proceed with this Assoc, as Auth is not done yet \n",
priv->netdev->name);
ret = -EFAULT;
goto done;
}
priv->cfg_disconnect = MFALSE; priv->cfg_disconnect = MFALSE;
@ -2881,8 +2968,7 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_assoc_ies_cfg(priv, (t_u8 *)req->ie, woal_cfg80211_assoc_ies_cfg(priv, (t_u8 *)req->ie,
req->ie_len, MOAL_IOCTL_WAIT)) { req->ie_len, MOAL_IOCTL_WAIT)) {
ret = -EFAULT; PRINTM(MINFO, "Fail to woal_cfg80211_assoc_ies_cfg\n");
goto done;
} }
} }
@ -3163,7 +3249,8 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0, woal_cfg80211_set_key(priv, 0, 0, NULL, 0, NULL, 0,
KEY_INDEX_CLEAR_ALL, NULL, 1, wait_option)) { KEY_INDEX_CLEAR_ALL, NULL, 1, 0,
wait_option)) {
/* Disable keys and clear all previous security settings */ /* Disable keys and clear all previous security settings */
ret = -EFAULT; ret = -EFAULT;
goto done; goto done;
@ -3192,8 +3279,7 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_assoc_ies_cfg(priv, ie, ie_len, woal_cfg80211_assoc_ies_cfg(priv, ie, ie_len,
wait_option)) { wait_option)) {
ret = -EFAULT; PRINTM(MINFO, "Fail to woal_cfg80211_assoc_ies_cfg\n");
goto done;
} }
} }
@ -3851,7 +3937,6 @@ create_custom_regdomain(moal_private *priv,
sort(&custom_reg->cfp_tbl[custom_reg->num_bg_chan], sort(&custom_reg->cfp_tbl[custom_reg->num_bg_chan],
custom_reg->num_a_chan, sizeof(chan_freq_power_t), &compare, NULL); custom_reg->num_a_chan, sizeof(chan_freq_power_t), &compare, NULL);
regd_size = sizeof(struct ieee80211_regdomain) + regd_size = sizeof(struct ieee80211_regdomain) +
num_chan * sizeof(struct ieee80211_reg_rule); num_chan * sizeof(struct ieee80211_reg_rule);
@ -4182,8 +4267,8 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
country_code[1] = request->alpha2[1]; country_code[1] = request->alpha2[1];
} }
if (MLAN_STATUS_SUCCESS != if (MLAN_STATUS_SUCCESS !=
woal_request_country_power_table(priv, woal_request_country_power_table(priv, country_code,
country_code)) { MOAL_IOCTL_WAIT)) {
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0) #if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
return -EFAULT; return -EFAULT;
#else #else
@ -4252,6 +4337,9 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
priv->phandle->band = band; priv->phandle->band = band;
} }
if (handle->params.edmac_ctrl && IS_CARD9098(priv->phandle->card_type))
woal_edmac_cfg(priv, priv->phandle->country_code);
LEAVE(); LEAVE();
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0) #if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
return ret; return ret;
@ -6760,12 +6848,14 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
wiphy->wowlan_config->gtk_rekey_failure) wiphy->wowlan_config->gtk_rekey_failure)
wakeup_report.gtk_rekey_failure = true; wakeup_report.gtk_rekey_failure = true;
break; break;
case MGMT_FRAME_FILTER_EXT_MATCHED:
break;
default: default:
break; break;
} }
if ((wakeup_reason.hs_wakeup_reason > 0) && if ((wakeup_reason.hs_wakeup_reason > 0) &&
(wakeup_reason.hs_wakeup_reason <= 10)) { (wakeup_reason.hs_wakeup_reason <= 11)) {
cfg80211_report_wowlan_wakeup(priv->wdev, &wakeup_report, cfg80211_report_wowlan_wakeup(priv->wdev, &wakeup_report,
GFP_KERNEL); GFP_KERNEL);
} }
@ -9743,6 +9833,8 @@ mlan_status woal_register_sta_cfg80211(struct net_device *dev, t_u8 bss_type)
wdev->iftype = NL80211_IFTYPE_STATION; wdev->iftype = NL80211_IFTYPE_STATION;
#endif #endif
#endif #endif
if (bss_type == MLAN_BSS_TYPE_NAN)
wdev->iftype = NL80211_IFTYPE_STATION;
dev_net_set(dev, wiphy_net(wdev->wiphy)); dev_net_set(dev, wiphy_net(wdev->wiphy));
dev->ieee80211_ptr = wdev; dev->ieee80211_ptr = wdev;
SET_NETDEV_DEV(dev, wiphy_dev(wdev->wiphy)); SET_NETDEV_DEV(dev, wiphy_dev(wdev->wiphy));
@ -9840,7 +9932,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv,
/* Initialize parameters for 2GHz and 5GHz bands */ /* Initialize parameters for 2GHz and 5GHz bands */
if (wiphy->bands[IEEE80211_BAND_2GHZ]) { if (wiphy->bands[IEEE80211_BAND_2GHZ]) {
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type)) { IS_CARD9097(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
mcs_supp = priv->phandle->params.antcfg & 0xf; mcs_supp = priv->phandle->params.antcfg & 0xf;
if (mcs_supp != 3 && mcs_supp != 0) if (mcs_supp != 3 && mcs_supp != 0)
cfg_11n->param.supported_mcs_set[1] = 0; cfg_11n->param.supported_mcs_set[1] = 0;
@ -9861,7 +9954,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv,
/* For 2.4G band only card, this shouldn't be set */ /* For 2.4G band only card, this shouldn't be set */
if (wiphy->bands[IEEE80211_BAND_5GHZ]) { if (wiphy->bands[IEEE80211_BAND_5GHZ]) {
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type)) { IS_CARD9097(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
mcs_supp = (priv->phandle->params.antcfg & 0xf00) >> 8; mcs_supp = (priv->phandle->params.antcfg & 0xf00) >> 8;
if (mcs_supp != 3 && mcs_supp != 0) if (mcs_supp != 3 && mcs_supp != 0)
cfg_11n->param.supported_mcs_set[1] = 0; cfg_11n->param.supported_mcs_set[1] = 0;
@ -9906,7 +10000,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv,
#endif #endif
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type) || IS_CARD9097(priv->phandle->card_type) ||
IS_CARDIW624(priv->phandle->card_type)) { IS_CARDIW624(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
woal_cfg80211_notify_antcfg(priv, wiphy, radio); woal_cfg80211_notify_antcfg(priv, wiphy, radio);
} }
wiphy->available_antennas_tx = radio->param.ant_cfg.tx_antenna; wiphy->available_antennas_tx = radio->param.ant_cfg.tx_antenna;
@ -10162,7 +10257,8 @@ mlan_status woal_register_cfg80211(moal_private *priv)
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 0, 0)
if ((moal_extflg_isset(priv->phandle, EXT_CFG80211_DRCS) && if ((moal_extflg_isset(priv->phandle, EXT_CFG80211_DRCS) &&
priv->phandle->card_info->drcs) || priv->phandle->card_info->drcs) ||
IS_CARD9098(priv->phandle->card_type)) { IS_CARD9098(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
cfg80211_iface_comb_ap_sta.num_different_channels = 2; cfg80211_iface_comb_ap_sta.num_different_channels = 2;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
cfg80211_iface_comb_ap_sta.radar_detect_widths = 0; cfg80211_iface_comb_ap_sta.radar_detect_widths = 0;
@ -10252,6 +10348,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
#endif #endif
wiphy->flags |= WIPHY_FLAG_4ADDR_AP; wiphy->flags |= WIPHY_FLAG_4ADDR_AP;
wiphy->flags |= WIPHY_FLAG_4ADDR_STATION; wiphy->flags |= WIPHY_FLAG_4ADDR_STATION;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
wiphy->features |= NL80211_FEATURE_NEED_OBSS_SCAN; wiphy->features |= NL80211_FEATURE_NEED_OBSS_SCAN;
#endif #endif

View file

@ -1928,7 +1928,8 @@ static int woal_uap_antenna_cfg(struct net_device *dev, struct ifreq *req)
#if defined(STA_CFG80211) || defined(UAP_CFG80211) #if defined(STA_CFG80211) || defined(UAP_CFG80211)
if (IS_CARD9098(priv->phandle->card_type) || if (IS_CARD9098(priv->phandle->card_type) ||
IS_CARD9097(priv->phandle->card_type) || IS_CARD9097(priv->phandle->card_type) ||
IS_CARDIW624(priv->phandle->card_type)) { IS_CARDIW624(priv->phandle->card_type) ||
IS_CARDAW693(priv->phandle->card_type)) {
if (IS_STA_CFG80211( if (IS_STA_CFG80211(
priv->phandle->params.cfg80211_wext)) priv->phandle->params.cfg80211_wext))
woal_cfg80211_notify_antcfg( woal_cfg80211_notify_antcfg(
@ -3861,10 +3862,6 @@ int woal_uap_set_11ax_status(moal_private *priv, t_u8 action, t_u8 band,
&hecap_ie->ext_id, he_cfg.he_cap.len, &hecap_ie->ext_id, he_cfg.he_cap.len,
he_cfg.he_cap.len); he_cfg.he_cap.len);
} }
#define HE_MAC_CAP_TWT_REQ_SUPPORT MBIT(1)
/* uap mode clear TWT request bit */
he_cfg.he_cap.he_mac_cap[0] &= ~HE_MAC_CAP_TWT_REQ_SUPPORT;
if (action == MLAN_ACT_DISABLE) { if (action == MLAN_ACT_DISABLE) {
if (he_cfg.he_cap.len && if (he_cfg.he_cap.len &&
(he_cfg.he_cap.ext_id == HE_CAPABILITY)) { (he_cfg.he_cap.ext_id == HE_CAPABILITY)) {

View file

@ -2975,6 +2975,11 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
LEAVE(); LEAVE();
return ret; return ret;
} }
#ifdef UAP_CFG80211
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
woal_update_uap_channel_dfs_state(priv);
#endif
#endif
priv->uap_host_based = MFALSE; priv->uap_host_based = MFALSE;
PRINTM(MMSG, "wlan: Stoping AP\n"); PRINTM(MMSG, "wlan: Stoping AP\n");
#ifdef STA_SUPPORT #ifdef STA_SUPPORT
@ -3042,7 +3047,6 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
} }
} }
#endif #endif
priv->cipher = 0; priv->cipher = 0;
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;
@ -3628,20 +3632,7 @@ int woal_cfg80211_set_radar_background(struct wiphy *wiphy,
} }
chan_rpt_req.startFreq = START_FREQ_11A_BAND; chan_rpt_req.startFreq = START_FREQ_11A_BAND;
chan_rpt_req.chanNum = (t_u8)chandef->chan->hw_value; chan_rpt_req.chanNum = (t_u8)chandef->chan->hw_value;
chan_rpt_req.bandcfg.chanBand = BAND_5GHZ; woal_convert_chan_to_bandconfig(priv, &chan_rpt_req.bandcfg, chandef);
switch (chandef->width) {
case NL80211_CHAN_WIDTH_40:
chan_rpt_req.bandcfg.chanWidth = CHAN_BW_40MHZ;
break;
case NL80211_CHAN_WIDTH_80:
chan_rpt_req.bandcfg.chanWidth = CHAN_BW_80MHZ;
break;
case NL80211_CHAN_WIDTH_20:
case NL80211_CHAN_WIDTH_20_NOHT:
default:
chan_rpt_req.bandcfg.chanWidth = CHAN_BW_20MHZ;
break;
}
chan_rpt_req.millisec_dwell_time = cac_time_ms; chan_rpt_req.millisec_dwell_time = cac_time_ms;
chan_rpt_req.host_based = MTRUE; chan_rpt_req.host_based = MTRUE;
moal_memcpy_ext(priv->phandle, &priv->chan_rpt_req, &chan_rpt_req, moal_memcpy_ext(priv->phandle, &priv->chan_rpt_req, &chan_rpt_req,

View file

@ -1237,6 +1237,7 @@ static int woal_usb_suspend(struct usb_interface *intf, pm_message_t message)
{ {
struct usb_card_rec *cardp = usb_get_intfdata(intf); struct usb_card_rec *cardp = usb_get_intfdata(intf);
moal_handle *handle = NULL; moal_handle *handle = NULL;
mlan_ds_ps_info pm_info;
int i; int i;
int ret = 0; int ret = 0;
@ -1261,6 +1262,27 @@ static int woal_usb_suspend(struct usb_interface *intf, pm_message_t message)
woal_cancel_scan(handle->priv[i], MOAL_IOCTL_WAIT); woal_cancel_scan(handle->priv[i], MOAL_IOCTL_WAIT);
} }
#endif #endif
memset(&pm_info, 0, sizeof(pm_info));
#define MAX_RETRY_USB 8
for (i = 0; i < MAX_RETRY_USB; i++) {
if (MLAN_STATUS_SUCCESS ==
woal_get_pm_info(woal_get_priv(handle, MLAN_BSS_ROLE_ANY),
&pm_info)) {
if (pm_info.is_suspend_allowed == MTRUE)
break;
else
PRINTM(MMSG,
"Suspend not allowed and retry again\n");
}
woal_sched_timeout(100);
}
if (pm_info.is_suspend_allowed == MFALSE) {
PRINTM(MMSG, "Suspend not allowed\n");
ret = -EBUSY;
goto done;
}
/* Enable Host Sleep */ /* Enable Host Sleep */
woal_enable_hs(woal_get_priv(handle, MLAN_BSS_ROLE_ANY)); woal_enable_hs(woal_get_priv(handle, MLAN_BSS_ROLE_ANY));