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
CONFIG_SDIO_SUSPEND_RESUME=y
#endif
# DFS testing support
CONFIG_DFS_TESTING_SUPPORT=y
@ -106,6 +104,8 @@ CONFIG_MULTI_CHAN_SUPPORT=y
CONFIG_DUMP_TO_PROC=y
CONFIG_TASKLET_SUPPORT=y
#32bit app over 64bit kernel support
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
endif
#ifdef SDIO_MMC
ifeq ($(CONFIG_SDIO_SUSPEND_RESUME),y)
ccflags-y += -DSDIO_SUSPEND_RESUME
endif
#endif
ifeq ($(CONFIG_MULTI_CHAN_SUPPORT),y)
ccflags-y += -DMULTI_CHAN_SUPPORT
@ -221,6 +219,10 @@ ifeq ($(CONFIG_DUMP_TO_PROC), y)
ccflags-y += -DDUMP_TO_PROC
endif
ifeq ($(CONFIG_TASKLET_SUPPORT), y)
ccflags-y += -DTASKLET_SUPPORT
endif
ifeq ($(CONFIG_OPENWRT_SUPPORT), y)
ccflags-y += -DOPENWRT
endif
@ -327,12 +329,10 @@ ifeq ($(CONFIG_PCIEIW624),y)
CONFIG_PCIE=y
ccflags-y += -DPCIEIW624
endif
#ifdef PCIEAW693_OPT
ifeq ($(CONFIG_PCIEAW693),y)
CONFIG_PCIE=y
ccflags-y += -DPCIEAW693
endif
#endif
ifeq ($(CONFIG_SDIO),y)
ccflags-y += -DSDIO
ccflags-y += -DSDIO_MMC

View file

@ -9,7 +9,7 @@
Goto source code directory wlan_src/.
make [clean] build
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

View file

@ -214,8 +214,12 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
t_u32 cfg_value = 0;
t_u32 hw_value = 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 tx_nss = 0;
#endif
ENTER();
@ -294,9 +298,13 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
/** update the RX MCS map */
if (cfg->param.vht_cfg.txrx & MLAN_RADIO_RX) {
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(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) {
rx_nss = GET_RXMCSSUPP(
pmadapter->user_htstream >> 8);
@ -314,6 +322,7 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
0x0f;
}
}
#endif
/* use the previous user value */
if (cfg->param.vht_cfg.vht_rx_mcs == 0xffffffff)
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(
pmadapter->hw_dot_11ac_mcs_support,
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))
cfg_value = NO_NSS_SUPPORT;
#endif
if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT))
SET_VHTNSSMCS(
@ -348,8 +361,12 @@ static mlan_status wlan_11ac_ioctl_vhtcfg(pmlan_adapter pmadapter,
hw_value = GET_DEVNSSTXMCS(
pmadapter->hw_dot_11ac_mcs_support,
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))
cfg_value = NO_NSS_SUPPORT;
#endif
if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == NO_NSS_SUPPORT))
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_resp = 0;
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;
#endif
ENTER();
/* Fill VHT cap info */
@ -788,9 +809,13 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
if (flag)
mcs_map_resp =
wlan_le16_to_cpu(pvht_cap->vht_cap.mcs_sets.rx_mcs_map);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(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) {
rx_nss = GET_RXMCSSUPP(priv->adapter->user_htstream >>
8);
@ -806,12 +831,17 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap,
if (bw_80p80)
rx_nss = tx_nss = 1;
}
#endif
mcs_map_result = 0;
for (nss = 1; nss <= 8; nss++) {
mcs_user = GET_VHTNSSMCS(mcs_map_user, nss);
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss))
mcs_user = NO_NSS_SUPPORT;
#endif
if ((mcs_user == NO_NSS_SUPPORT) ||
(mcs_resp == 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++) {
mcs_user = GET_VHTNSSMCS(mcs_map_user, nss);
mcs_resp = GET_VHTNSSMCS(mcs_map_resp, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss))
mcs_user = NO_NSS_SUPPORT;
#endif
if ((mcs_user == NO_NSS_SUPPORT) ||
(mcs_resp == 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 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;
IEEEtypes_VHTCap_t *pvht_cap = pbss_desc->pvht_cap;
MrvlIEtypes_He_cap_t *phecap = MNULL;
IEEEtypes_HECap_t *pBsshecap = MNULL;
#endif
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) &&
!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;
/** check 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
ret = MFALSE;
}
#endif
LEAVE();
return ret;
}
@ -1110,7 +1153,11 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
t_u16 nss;
int ret_len = 0;
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;
#endif
ENTER();
@ -1178,9 +1225,13 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
} else {
/** set default bandwidth:80M*/
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) ||
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)
rx_nss = GET_RXMCSSUPP(
pmadapter->user_htstream >> 8);
@ -1188,16 +1239,22 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
rx_nss =
GET_RXMCSSUPP(pmadapter->user_htstream);
}
#endif
mcs_map_user =
GET_DEVRXMCSMAP(pmpriv->usr_dot_11ac_mcs_support);
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) ||
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);
nss = MIN(rx_nss, nss);
}
#endif
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;
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;
#endif
MrvlIEtypes_He_cap_t *phecap = MNULL;
t_u8 nss = 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->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) ||
IS_CARD9097(pmpriv->adapter->card_type)) {
IS_CARD9097(pmpriv->adapter->card_type) ||
IS_CARDAW693(pmpriv->adapter->card_type)) {
if (band & BAND_AAX) {
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
8);
@ -335,12 +343,17 @@ t_u16 wlan_fill_he_cap_tlv(mlan_private *pmpriv, t_u16 band,
0x0f;
}
}
#endif
phecap = (MrvlIEtypes_He_cap_t *)phe_cap;
for (nss = 1; nss <= 8; nss++) {
cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss);
hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss))
cfg_value = NO_NSS_SUPPORT;
#endif
if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == 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++) {
cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss);
hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss))
cfg_value = NO_NSS_SUPPORT;
#endif
if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == 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;
int len = 0;
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;
#endif
t_u8 nss = 0;
t_u16 cfg_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->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) ||
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) {
rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >>
8);
@ -443,11 +468,16 @@ int wlan_cmd_append_11ax_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc,
if (bw_80p80)
rx_nss = tx_nss = 1;
}
#endif
for (nss = 1; nss <= 8; nss++) {
cfg_value = GET_HE_NSSMCS(phecap->rx_mcs_80, nss);
hw_value = GET_HE_NSSMCS(phw_hecap->rx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((rx_nss != 0) && (nss > rx_nss))
cfg_value = NO_NSS_SUPPORT;
#endif
if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == 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++) {
cfg_value = GET_HE_NSSMCS(phecap->tx_mcs_80, nss);
hw_value = GET_HE_NSSMCS(phw_hecap->tx_mcs_80, nss);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((tx_nss != 0) && (nss > tx_nss))
cfg_value = NO_NSS_SUPPORT;
#endif
if ((hw_value == NO_NSS_SUPPORT) ||
(cfg_value == 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;
t_u8 no_of_sub_band = pmadapter->domain_reg.no_of_sub_band;
MrvlIEtypes_Rgn_dom_code_t *rgn = MNULL;
t_u8 *tlv = MNULL;
t_u8 i;
ENTER();
@ -881,7 +883,10 @@ mlan_status wlan_cmd_802_11d_domain_info(mlan_private *pmpriv,
return MLAN_STATUS_SUCCESS;
}
tlv = (t_u8 *)&pdomain_info->domain;
/* Set domain info fields */
domain = (MrvlIEtypes_DomainParamSet_t *)tlv;
domain->header.type = wlan_cpu_to_le16(TLV_TYPE_DOMAIN);
memcpy_ext(pmadapter, domain->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 *
sizeof(IEEEtypes_SubbandSet_t));
pcmd->size = sizeof(pdomain_info->action) + domain->header.len +
sizeof(MrvlIEtypesHeader_t) + S_DS_GEN;
pcmd->size += sizeof(pdomain_info->action) +
domain->header.len + sizeof(MrvlIEtypesHeader_t) +
S_DS_GEN;
tlv += domain->header.len + sizeof(MrvlIEtypesHeader_t);
if (pmadapter->domain_reg.dfs_region != NXP_DFS_UNKNOWN) {
rgn = (MrvlIEtypes_Rgn_dom_code_t
*)((t_u8 *)&pdomain_info->domain +
domain->header.len +
sizeof(MrvlIEtypesHeader_t));
rgn = (MrvlIEtypes_Rgn_dom_code_t *)tlv;
rgn->header.type =
wlan_cpu_to_le16(TLV_TYPE_REGION_DOMAIN_CODE);
rgn->header.len = 2;
rgn->domain_code = pmadapter->domain_reg.dfs_region;
pcmd->size += sizeof(MrvlIEtypes_Rgn_dom_code_t);
tlv += sizeof(MrvlIEtypes_Rgn_dom_code_t);
}
} else {
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();
/* 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,
ds_11hcfg->param.ch_dfs_state.channel);
} 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(
priv, BAND_A,
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);
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) ||
IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type)) {
IS_CARD9097(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type)) {
if (bands & BAND_A)
rx_mcs_supp = MIN(
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,
GET_RXMCSSUPP(pmadapter->user_htstream));
}
#endif
memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff,
rx_mcs_supp);
/* 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);
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) ||
IS_CARDIW624(pmadapter->card_type) ||
IS_CARD9097(pmadapter->card_type)) {
IS_CARD9097(pmadapter->card_type) ||
IS_CARDAW693(pmadapter->card_type)) {
if (bands & BAND_A)
rx_mcs_supp = MIN(
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,
GET_RXMCSSUPP(pmadapter->user_htstream));
}
#endif
memset(pmadapter, (t_u8 *)pht_cap->ht_cap.supported_mcs_set, 0xff,
rx_mcs_supp);
/* 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 */
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;
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 */
rx_reor_tbl_ptr->bitmap = rx_reor_tbl_ptr->bitmap >> i;
if (i < (8 * sizeof(rx_reor_tbl_ptr->bitmap)))
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 + 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 =
MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE;
#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
if (priv->bss_type == MLAN_BSS_TYPE_UAP)
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;
#endif
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 (pmbuf) {
if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP)
pmadapter->ps_state = PS_STATE_SLEEP_CFM;
#ifdef STA_SUPPORT
@ -1558,8 +1546,19 @@ static mlan_status wlan_dnld_sleep_confirm_cmd(mlan_adapter *pmadapter)
else
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:
LEAVE();
return ret;
@ -2373,6 +2372,16 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter)
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 &&
cmdresp_result == HostCmd_RESULT_PRE_ASLEEP) {
@ -2429,7 +2438,9 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter)
if (IS_PCIE(pmadapter->card_type) &&
cmdresp_no == HostCmd_CMD_FUNC_SHUTDOWN &&
pmadapter->pwarm_reset_ioctl_req) {
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->use_adma)
#endif
wlan_pcie_init_fw(pmadapter);
}
#endif
@ -3537,14 +3548,16 @@ t_void wlan_check_ps_cond(mlan_adapter *pmadapter)
if (!pmadapter->cmd_sent && !pmadapter->curr_cmd &&
!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);
} 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->curr_cmd) ? "C" : "",
(pmadapter->event_cause) ? "V" : "",
(wlan_is_tx_pending(pmadapter)) ? "T" : "",
(wlan_is_rx_pending(pmadapter)) ? "P" : "",
(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->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 */
if ((pmadapter->pcal_data) && (pmadapter->cal_data_len > 0)) {
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:
offset = wlan_le32_to_cpu(ind->offset);
block_len = wlan_le16_to_cpu(ind->block_len);
PRINTM(MEVENT, "VDLL_IND: type=%d offset = 0x%x, len = %d\n",
wlan_le16_to_cpu(ind->type), offset, block_len);
PRINTM(MEVENT,
"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) {
block_len = MIN(block_len, ctrl->vdll_len - offset);
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:
PRINTM(MERROR, "VDLL_IND (ID ERR).\n");
break;
case VDLL_IND_TYPE_SEC_ERR_ID:
PRINTM(MERROR, "VDLL_IND (SECURE ERR).\n");
break;
default:
PRINTM(MERROR, "unknow vdll ind type=%d\n", ind->type);
break;
@ -5524,6 +5532,7 @@ mlan_status wlan_handle_event_multi_chan_info(pmlan_private pmpriv,
#ifdef USB
if (IS_USB(pmadapter->card_type)) {
wlan_resync_usb_port(pmadapter);
}
#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_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;
/** separate stream config for 2.4G and 5G, will be changed according to
* antenna cfg*/
if (pmadapter->fw_bands & BAND_A)
pmadapter->user_htstream |= (pmadapter->user_htstream << 8);
PRINTM(MCMND, "user_htstream=0x%x\n", pmadapter->user_htstream);
#endif
if (ISSUPP_BEAMFORMING(pmadapter->hw_dot_11n_dev_cap)) {
PRINTM(MCMND, "Enable Beamforming\n");
@ -7217,75 +7230,6 @@ mlan_status wlan_ret_tx_rx_pkt_stats(pmlan_private pmpriv,
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.
*
@ -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;
t_u16 tx_ant_mode = wlan_le16_to_cpu(pantenna->tx_antenna_mode);
t_u16 rx_ant_mode = wlan_le16_to_cpu(pantenna->rx_antenna_mode);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
mlan_adapter *pmadapter = pmpriv->adapter;
#endif
typedef struct _HostCmd_DS_802_11_RF_ANTENNA_1X1 {
/** 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",
wlan_le16_to_cpu(pantenna->action_tx), tx_ant_mode,
wlan_le16_to_cpu(pantenna->action_rx), rx_ant_mode);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(SD9097) || defined(USB9097) || \
defined(SDIW624) || defined(PCIEIW624) || defined(USBIW624)
if (IS_CARD9098(pmadapter->card_type) ||
IS_CARDIW624(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,
rx_ant_mode);
}
#endif
} else
PRINTM(MINFO,
"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)
{
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;
mlan_adapter *pmadapter = pmpriv->adapter;
#endif
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->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
mac_reg->value = wlan_cpu_to_le32(reg_rw->value);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_MAC2) &&
(IS_CARD9098(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(MrvlIEtypes_Reg_type_t));
}
#endif
break;
}
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->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
bbp_reg->value = (t_u8)reg_rw->value;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_BBP2) &&
(IS_CARD9098(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(MrvlIEtypes_Reg_type_t));
}
#endif
break;
}
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->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
rf_reg->value = (t_u8)reg_rw->value;
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_RF2) &&
(IS_CARD9098(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(MrvlIEtypes_Reg_type_t));
}
#endif
break;
}
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->offset = wlan_cpu_to_le16((t_u16)reg_rw->offset);
bca_reg->value = wlan_cpu_to_le32(reg_rw->value);
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if ((reg_rw->type == MLAN_REG_BCA2) &&
(IS_CARD9098(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(MrvlIEtypes_Reg_type_t));
}
#endif
break;
}
default:
@ -7814,6 +7786,69 @@ mlan_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
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
@ -8511,6 +8546,7 @@ mlan_status wlan_ret_chan_region_cfg(pmlan_private pmpriv,
/* Add FW cfp tables and region info */
wlan_add_fw_cfp_tables(pmpriv, tlv_buf, tlv_buf_left);
if (pmadapter->otp_region) {
if (wlan_set_regiontable(pmpriv, (t_u8)pmadapter->region_code,
pmadapter->fw_bands)) {
@ -10310,6 +10346,74 @@ mlan_status wlan_ret_range_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
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
*
@ -10365,3 +10469,35 @@ mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
LEAVE();
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_
/** MLAN release version */
#define MLAN_RELEASE_VERSION "408.p2"
#define MLAN_RELEASE_VERSION "423.p1"
/** Re-define generic data types for MLAN/MOAL */
/** Signed char (1-byte) */
@ -157,10 +157,6 @@ typedef t_s32 t_sval;
/** This is current limit on Maximum Rx AMPDU allowed */
#define MLAN_MAX_RX_BASTREAM_SUPPORTED 16
#ifndef UINT_MAX
#define UINT_MAX (~0U)
#endif
#ifdef STA_SUPPORT
/** Default Win size attached during ADDBA request */
#define MLAN_STA_AMPDU_DEF_TXWINSIZE 64
@ -185,6 +181,11 @@ typedef t_s32 t_sval;
#define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16
#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 */
#define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff
/** Maximum Tx Win size configured for ADDBA request [10 bits] */
@ -273,9 +274,14 @@ typedef t_s32 t_sval;
/** pcie inband reset */
#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
/* 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
#ifdef USB
#define MLAN_USB_BLOCK_SIZE (512)
@ -747,6 +753,7 @@ typedef enum _mlan_bss_type {
#ifdef WIFI_DIRECT_SUPPORT
MLAN_BSS_TYPE_WIFIDIRECT = 2,
#endif
MLAN_BSS_TYPE_NAN = 4,
MLAN_BSS_TYPE_DFS = 8,
MLAN_BSS_TYPE_ANY = 0xff,
} mlan_bss_type;
@ -803,6 +810,8 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
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,
#ifdef UAP_SUPPORT
@ -845,6 +854,7 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
#endif
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_ASSOC_FAILURE_LOGGER = 0x80000026,
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_CMDRESP = 0x80000034,
MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035,
MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE = 0x80000036,
#endif
MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH = 0x80000037,
} mlan_event_id;
/** Data Structures */
@ -907,7 +919,9 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t {
#define OID_TYPE_CAL 0x2
#define OID_TYPE_DPD 0xa
#define NONE_TYPE_DPD 0xb
#define UNKNOW_DPD_LENGTH 0xffffffff
#define NONE_DPD_LENGTH 0xfafafafa
/** Custom data structure */
typedef struct _mlan_init_param {
@ -1291,7 +1305,19 @@ typedef MLAN_PACK_START struct _mc_txcontrol {
/** mc_pkt_flags */
t_u8 mc_pkt_flags;
} 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 */
typedef struct _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
/** 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_ */

View file

@ -189,6 +189,8 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
/** Event ID: Tx status */
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_VDLL_IND, 0x0081),
@ -205,6 +207,7 @@ ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001),
ENUM_ELEMENT(EVENT_CSI, 0x008D),
ENUM_ELEMENT(EVENT_FW_HANG_REPORT, 0x008F),
ENUM_ELEMENT(EVENT_DPD_LOG, 0x0091),
/** Card Event definition : RESET PN */
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),
/* 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)
/** FW cap info bit 14: 6G Support */
#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 */
#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)
/** Check if 6G supported by firmware */
#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 */
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) \
(_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 */
#define TLV_TYPE_REG_ACCESS_CTRL (PROPRIETARY_TLV_BASE_ID + 0x13C) /* 0x023c*/
/** MrvlIEtypes_Reg_type_t*/
@ -1357,6 +1368,7 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Reg_type_t {
/** type: 0x81/0x82/0x83 */
t_u8 type;
} MLAN_PACK_END MrvlIEtypes_Reg_type_t;
#endif
/* mod_grp */
typedef enum _mod_grp {
@ -1445,7 +1457,6 @@ typedef enum _ENH_PS_MODES {
#define HostCmd_ACT_GEN_REMOVE 0x0004
/** General purpose action : Reset */
#define HostCmd_ACT_GEN_RESET 0x0005
/** Host command action : Set Rx */
#define HostCmd_ACT_SET_RX 0x0001
/** Host command action : Set Tx */
@ -1476,6 +1487,8 @@ typedef enum _ENH_PS_MODES {
#define HostCmd_RESULT_BLOCK 0x0006
/** cmd is blocked by pre_asleep */
#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 */
/** MAC action : Rx on */
@ -1564,6 +1577,12 @@ enum host_fw_event_id {
#undef ENUM_ELEMENT
#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 {
WLS_SUB_EVENT_FTM_COMPLETE = 0,
WLS_SUB_EVENT_RADIO_RECEIVED = 1,
@ -1656,6 +1675,12 @@ typedef enum _tdls_error_code_e {
TDLS_PEER_STA_UNREACHABLE = 25,
} 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_UCAST_PKT (1 << 3)
@ -5461,24 +5486,11 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CHAN_REGION_CFG {
t_u16 action;
} MLAN_PACK_END HostCmd_DS_CHAN_REGION_CFG;
/** HostCmd_CMD_CW_MODE_CTRL */
typedef MLAN_PACK_START struct _HostCmd_DS_CW_MODE_CTRL {
/** Action for CW Tone Control */
/** HostCmd_DS_REGION_POWER_CFG */
typedef MLAN_PACK_START struct _HostCmd_DS_REGION_POWER_CFG {
/** Action */
t_u16 action;
/** Mode of Operation 0: Disbale 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 HostCmd_DS_CW_MODE_CTRL;
} MLAN_PACK_END HostCmd_DS_REGION_POWER_CFG;
/** HostCmd_CMD_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;
} 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 */
typedef MLAN_PACK_START struct _HostCmd_DS_TARGET_ACCESS {
/** Action */
@ -5887,23 +5911,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_MacAddr_t {
t_u8 mac[MLAN_MAC_ADDR_LENGTH];
} 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
/** TLV type : AP Channel 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;
} 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 */
typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
/** Command Header : Command */
@ -7809,8 +7846,6 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND {
/** RF antenna */
HostCmd_DS_802_11_RF_ANTENNA antenna;
/** CW Mode: Tx CW Level control */
HostCmd_DS_CW_MODE_CTRL cwmode;
/** Enhanced power save command */
HostCmd_DS_802_11_PS_MODE_ENH psmode_enh;
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_ROAM_OFFLOAD roam_offload;
HostCmd_DS_CHAN_REGION_CFG reg_cfg;
HostCmd_DS_REGION_POWER_CFG rg_power_cfg;
HostCmd_DS_AUTO_TX auto_tx;
HostCmd_DS_FTM_CONFIG_SESSION_PARAMS ftm_config;
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_GET_CH_LOAD ch_load;
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;
} 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
/** notify vdll download error: ID error */
#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 */
typedef MLAN_PACK_START struct _vdll_ind {
/*VDLL ind type*/
t_u16 type;
/*reserved*/
t_u16 reserved;
/*vdllId*/
t_u16 vdllId;
/*indicate the offset downloaded so far*/
t_u32 offset;
/*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 */
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 */
ENUM_ELEMENT(HostCmd_CMD_802_11_KEY_MATERIAL, 0x005e),
/** Host Command ID : 802.11 Ad-Hoc stop */
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 */
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 */
ENUM_ELEMENT(HostCmd_CMD_802_11_EAPOL_PKT, 0x012e),
ENUM_ELEMENT(HostCmd_CMD_EDMAC_CFG, 0x0130),
/** Host Command ID :MIMO SWITCH **/
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*/
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 */
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_NAV_MITIGATION_CFG, 0x0282),
/** Host Command ID: Tx Frame */
ENUM_ELEMENT(HostCmd_CMD_802_11_TX_FRAME, 0x0283),
/* Always keep this last */
ENUM_ELEMENT_LAST(__HostCmd_CMD_Last)

View file

@ -319,6 +319,27 @@ typedef MLAN_PACK_START struct {
t_u8 variablep[];
} 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*/
typedef MLAN_PACK_START struct {
/** 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->rxbd_rdptr = 0;
pmadapter->pcard_pcie->evtbd_rdptr = 0;
pmadapter->pcard_pcie->txbd_pending = 0;
#if defined(PCIE8997) || defined(PCIE8897)
if (!pmadapter->pcard_pcie->reg->use_adma) {
pmadapter->pcard_pcie->rxbd_wrptr =
@ -984,11 +985,15 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter)
EVT_RW_PTR_ROLLOVER_IND;
}
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (pmadapter->pcard_pcie->reg->use_adma) {
pmadapter->pcard_pcie->rxbd_wrptr =
pmadapter->pcard_pcie->txrx_bd_size;
pmadapter->pcard_pcie->evtbd_wrptr = MLAN_MAX_EVT_BD;
pmadapter->pcard_pcie->last_write_index_with_irq =
0xffffffff;
}
#endif
}
#endif
LEAVE();

View file

@ -89,6 +89,7 @@ enum _mlan_ioctl_req_id {
#ifdef UAP_SUPPORT
MLAN_OID_ACTION_CHAN_SWITCH = 0x0002001E,
#endif
MLAN_OID_BSS_HOST_MLME = 0x0002001F,
/* Radio Configuration Group */
MLAN_IOCTL_RADIO_CFG = 0x00030000,
@ -376,6 +377,10 @@ enum _mlan_ioctl_req_id {
MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F,
MLAN_OID_MISC_NAV_MITIGATION = 0x00200090,
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 */
@ -390,7 +395,6 @@ enum _mlan_act_ioctl {
MLAN_ACT_RESET,
MLAN_ACT_DEFAULT
};
/** Enumeration for generic enable/disable */
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 */
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;
/** 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 peakULrate; // cap peak UL rate
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_failcnt;
t_u16 basic_trigger_successcnt;
@ -4286,11 +4295,20 @@ enum _mlan_reg_type {
MLAN_REG_CAU = 5,
MLAN_REG_PSU = 6,
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,
#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_BBP2 = 0x82,
MLAN_REG_RF2 = 0x83,
MLAN_REG_BCA2 = 0x87
#endif
};
/** 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];
} 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 */
#define MLAN_MAX_CLK_NUM 16
@ -4766,6 +4804,18 @@ typedef struct _mlan_ds_misc_country_code {
t_u8 country_code[COUNTRY_CODE_LEN];
} 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 */
#define SUBSCRIBE_EVT_ACT_BITWISE_SET 0x0002
/** action for clear */
@ -5490,22 +5540,6 @@ typedef MLAN_PACK_START struct _mlan_ds_misc_tx_rx_histogram {
t_u8 value[1];
} 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)
/** Struct for per-packet configuration */
typedef struct _mlan_per_pkt_cfg {
@ -6124,6 +6158,20 @@ typedef struct _mlan_ds_reorder_flush_time {
t_u16 flush_time_ac_vi_vo;
} 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 */
typedef struct _mlan_ds_misc_cfg {
/** Sub-command */
@ -6140,6 +6188,8 @@ typedef struct _mlan_ds_misc_cfg {
#endif
/** Hostcmd for MLAN_OID_MISC_HOST_CMD */
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 */
mlan_ds_misc_sys_clock sys_clock;
/** 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_rx keep_alive_rx;
mlan_ds_misc_tx_rx_histogram tx_rx_histogram;
mlan_ds_cw_mode_ctrl cwmode;
/** Tx/Rx per-packet control */
t_u8 txrx_pkt_ctrl;
mlan_ds_misc_robustcoex_params robustcoexparams;
@ -6294,6 +6343,8 @@ typedef struct _mlan_ds_misc_cfg {
mlan_ds_ch_load ch_load;
mlan_ds_cross_chip_synch cross_chip_synch;
mlan_ds_reorder_flush_time flush_time;
mlan_ds_ed_mac_cfg edmac_cfg;
mlan_ds_gpio_cfg_ops gpio_cfg_ops;
} param;
} 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_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) ||
((!ap_mfpc) && ap_mfpr) ||
(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;
mlan_ds_bss *bss;
IEEEtypes_MgmtHdr_t *hdr;
t_u16 sub_type = 0;
ENTER();
if (pmpriv->curr_bss_params.host_mlme) {
hdr = (IEEEtypes_MgmtHdr_t *)&resp->params;
if (!memcmp(pmpriv->adapter, hdr->BssId,
pmpriv->pattempted_bss_desc->mac_address,
MLAN_MAC_ADDR_LENGTH))
passoc_rsp = (IEEEtypes_AssocRsp_t
*)((t_u8 *)(&resp->params) +
hdr = (IEEEtypes_MgmtHdr_t *)&resp->params;
sub_type = IEEE80211_GET_FC_MGMT_FRAME_SUBTYPE(hdr->FrmCtl);
if (!memcmp(pmpriv->adapter, hdr->BssId,
pmpriv->pattempted_bss_desc->mac_address,
MLAN_MAC_ADDR_LENGTH) &&
((sub_type == SUBTYPE_ASSOC_RESP) ||
(sub_type == SUBTYPE_REASSOC_RESP))) {
passoc_rsp =
(IEEEtypes_AssocRsp_t *)((t_u8 *)(&resp->params) +
sizeof(IEEEtypes_MgmtHdr_t));
else
passoc_rsp = (IEEEtypes_AssocRsp_t *)&resp->params;
pmpriv->curr_bss_params.host_mlme = MTRUE;
} else
passoc_rsp = (IEEEtypes_AssocRsp_t *)&resp->params;
passoc_rsp->status_code = wlan_le16_to_cpu(passoc_rsp->status_code);
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);
}
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(
(t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_START) + S_DS_GEN +
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(
(t_u16)(sizeof(HostCmd_DS_802_11_AD_HOC_JOIN) + S_DS_GEN +
cmd_append_size));

View file

@ -560,7 +560,14 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond);
#ifdef SDIO
#define MAX_SUPPORT_AMSDU_SIZE 4096
/** 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
#else
/* upto 0xB7 */
#define MAX_MP_REGS 184
#endif
/** Maximum port */
#define MAX_PORT 32
/** Maximum port 16 */
@ -2189,6 +2196,8 @@ typedef struct _mlan_pcie_card {
t_u32 pcie_int_mode;
/** PCIE function number */
t_u8 func_num;
/** rx interrupt pending */
t_u8 rx_pending;
/** pending num of tx ring buffer in firmware */
t_u8 txbd_pending;
/** Write pointer for TXBD ring */
@ -2252,8 +2261,11 @@ typedef struct _mlan_pcie_card {
mlan_buffer *cmdrsp_buf;
/** Command buffer */
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 */
t_u32 last_tx_pkt_size[MLAN_MAX_TXRX_BD];
} mlan_pcie_card, *pmlan_pcie_card;
#endif
@ -2351,6 +2363,16 @@ struct _mlan_adapter {
#ifdef PCIE
/** rx data lock to synchronize wlan_pcie_process_recv_data */
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 */
t_void *pmlan_tx_lock;
/** event lock to synchronize process_event and event_ready */
@ -2424,9 +2446,13 @@ struct _mlan_adapter {
t_u32 fw_cap_info;
/** Extended firmware capability information */
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
* 2G */
t_u16 user_htstream;
#endif
/** vdll ctrl */
vdll_dnld_ctrl vdll_ctrl;
#if defined(SDIO) || defined(PCIE)
@ -2731,6 +2757,8 @@ struct _mlan_adapter {
t_u8 wakeup_fw_timer_is_set;
/** Number of wake up timeouts */
t_u32 pm_wakeup_timeout;
/** Card wakeup flag */
t_u8 pm_wakeup_flag;
/** Host Sleep configured flag */
t_u8 is_hs_configured;
@ -2988,6 +3016,21 @@ static inline t_u8 wlan_is_tx_pending(mlan_adapter *pmadapter)
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 */
mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter,
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_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 */
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_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,
HostCmd_DS_COMMAND *cmd,
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_status wlan_ret_mem_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp,
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,
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);
mlan_status wlan_cmd_mem_access(HostCmd_DS_COMMAND *cmd, t_u16 cmd_action,
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,
HostCmd_DS_COMMAND *cmd,
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,
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,
mef_cfg_data *pmef);
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,
pmlan_ioctl_req pioctl_req);
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);
mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
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,
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,
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,
pmlan_ioctl_req pioctl_req);
@ -4352,6 +4400,11 @@ mlan_status wlan_ret_get_sensor_temp(pmlan_private pmpriv,
HostCmd_DS_COMMAND *resp,
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 */
mlan_status wlan_misc_ioctl_country_code(pmlan_adapter pmadapter,
mlan_ioctl_req *pioctl_req);
@ -4714,4 +4767,10 @@ wlan_get_privs_by_two_cond(mlan_adapter *pmadapter,
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_ */

View file

@ -330,6 +330,35 @@ mlan_status wlan_misc_ioctl_host_cmd(pmlan_adapter pmadapter,
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
*
@ -693,7 +722,9 @@ t_void wlan_wakeup_card_timeout_func(void *function_context)
PRINTM(MERROR, "Wakeup card timeout(%d)!\n",
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;
@ -1636,15 +1667,27 @@ mlan_status wlan_reg_mem_ioctl_reg_rw(pmlan_adapter pmadapter,
switch (reg_mem->param.reg_rw.type) {
case MLAN_REG_MAC:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_MAC2:
#endif
cmd_no = HostCmd_CMD_MAC_REG_ACCESS;
break;
case MLAN_REG_BBP:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_BBP2:
#endif
cmd_no = HostCmd_CMD_BBP_REG_ACCESS;
break;
case MLAN_REG_RF:
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
case MLAN_REG_RF2:
#endif
cmd_no = HostCmd_CMD_RF_REG_ACCESS;
break;
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;
break;
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:
#endif
cmd_no = HostCmd_CMD_BCA_REG_ACCESS;
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:
cmd_no = HostCmd_CMD_REG_ACCESS;
break;
#endif
default:
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;
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) {
/* User input validation */
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) ||
IS_CARD9097(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->rx_antenna);
} else {
#endif
ant_cfg->tx_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 ||
bitcount(ant_cfg->tx_antenna & 0x00FF) >
pmadapter->number_of_antenna ||
@ -5338,41 +5399,6 @@ mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter,
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
*
@ -6209,6 +6235,32 @@ mlan_status wlan_misc_ioctl_get_tsf(pmlan_adapter pmadapter,
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
*
@ -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[1] != '\0') {
/* 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
*/
pmadapter->country_code[0] =
@ -6250,7 +6302,7 @@ mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter,
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,
0, (t_void *)pioctl_req, MNULL);
@ -6595,6 +6647,41 @@ mlan_status wlan_misc_ioctl_net_monitor(pmlan_adapter pmadapter,
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
*
@ -7551,3 +7638,226 @@ mlan_status wlan_misc_ioctl_reorder_flush_time(pmlan_adapter pmadapter,
LEAVE();
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 */
#define ADMA_MSIX_PF_BIT 24
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/** PCIE9098 dev_id/vendor id reg */
#define PCIE9098_DEV_ID_REG 0x0000
/** PCIE revision ID register */
@ -322,6 +323,7 @@ Change log:
#define PCIE9098_HOST_INTR_SEL_MASK \
(PCIE9098_HOST_INTR_DNLD_DONE | PCIE9098_HOST_INTR_UPLD_RDY | \
PCIE9098_HOST_INTR_CMD_DONE | PCIE9098_HOST_INTR_EVENT_RDY)
#endif
#if defined(PCIE8997) || defined(PCIE8897)
/* PCIE INTERNAL REGISTERS */

View file

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

View file

@ -223,6 +223,9 @@ static const struct _mlan_card_info mlan_card_info_sd8897 = {
};
#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 = {
.start_rd_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,
.winner_check_reg = 0xFC,
};
#endif
#ifdef 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
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
static const struct _mlan_card_info mlan_card_info_sd9098 = {
.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;
}
#endif
#if defined(SD9097) || defined(SD9177) || defined(SDIW624)
if (IS_SD9097(pmadapter->card_type) ||
IS_SDIW624(pmadapter->card_type) ||
IS_SDAW693(pmadapter->card_type) || IS_SD9177(pmadapter->card_type))
check_fw_status = MTRUE;
#endif
/* Perform firmware data transfer */
do {
@ -2411,10 +2408,6 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter)
pmadapter->pcard_info = &mlan_card_info_sdiw624;
break;
#endif
case CARD_TYPE_SDAW693:
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
pmadapter->pcard_info = &mlan_card_info_sdaw693;
break;
#ifdef SD9177
case CARD_TYPE_SD9177:
pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997;
@ -3024,6 +3017,7 @@ exit:
return ret;
}
#if (defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177))
/**
* @brief This function sends vdll data to the card.
*
@ -3065,6 +3059,7 @@ static mlan_status wlan_sdio_send_vdll(mlan_adapter *pmadapter,
LEAVE();
return ret;
}
#endif
/**
* @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_adapter *pmadapter = pmpriv->adapter;
#if (defined(SD9098) || defined(SD9097) || defined(SDIW624) || defined(SD9177))
if (type == MLAN_TYPE_VDLL)
return wlan_sdio_send_vdll(pmadapter, pmbuf);
#endif
ret = wlan_sdio_host_to_card(pmadapter, type, pmbuf, tx_param);
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;
pmlan_callbacks pcb = &pmadapter->callbacks;
t_u32 buf_size = 0;
t_u8 mp_aggr_pkt_limit = pmadapter->pcard_sd->mp_aggr_pkt_limit;
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) ||
(pmadapter->pcard_sd->max_seg_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(
pmadapter->pmoal_handle,
mpa_tx_buf_size + DMA_ALIGNMENT,
pmadapter->pmoal_handle, buf_size,
MLAN_MEM_DEF | MLAN_MEM_DMA,
(t_u8 **)&pmadapter->pcard_sd->mpa_tx.head_ptr);
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) ||
(pmadapter->pcard_sd->max_seg_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(
pmadapter->pmoal_handle,
mpa_rx_buf_size + DMA_ALIGNMENT,
pmadapter->pmoal_handle, buf_size,
MLAN_MEM_DEF | MLAN_MEM_DMA,
(t_u8 **)&pmadapter->pcard_sd->mpa_rx.head_ptr);
if (ret != MLAN_STATUS_SUCCESS ||
@ -3384,6 +3388,9 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
ret = MLAN_STATUS_FAILURE;
goto done;
}
#if defined(SD8997) || defined(SD8977) || defined(SD8987) || \
defined(SD9098) || defined(SD9097) || defined(SDIW624) || \
defined(SD8978) || defined(SD9177)
if (MFALSE
#ifdef SD8997
|| IS_SD8997(pmadapter->card_type)
@ -3406,7 +3413,6 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
#ifdef SDIW624
|| IS_SDIW624(pmadapter->card_type)
#endif
|| IS_SDAW693(pmadapter->card_type)
#ifdef SD9177
|| IS_SD9177(pmadapter->card_type)
#endif
@ -3417,6 +3423,7 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter)
HOST_TO_CARD_EVENT_REG,
value | HOST_POWER_UP);
}
#endif
/* Poll register around 100 ms */
for (tries = 0; tries < MAX_POLL_TRIES; ++tries) {
pcb->moal_read_reg(pmadapter->pmoal_handle, reset_reg, &value);

View file

@ -1194,7 +1194,29 @@ process_start:
}
}
#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 ? */
if ((pmadapter->ps_state == PS_STATE_SLEEP) &&
(pmadapter->pm_wakeup_card_req &&
@ -1363,7 +1385,19 @@ process_start:
break;
}
#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);
pcb->moal_spin_lock(pmadapter->pmoal_handle,
@ -1417,10 +1451,9 @@ mlan_status mlan_send_packet(t_void *padapter, pmlan_buffer pmbuf)
eth_type =
mlan_ntohs(*(t_u16 *)&pmbuf->pbuf[pmbuf->data_offset +
MLAN_ETHER_PKT_TYPE_OFFSET]);
if (((pmadapter->priv[pmbuf->bss_index]->port_ctrl_mode == MTRUE) &&
((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) ||
(eth_type == MLAN_ETHER_PKT_TYPE_ARP) ||
(eth_type == MLAN_ETHER_PKT_TYPE_WAPI))) ||
if ((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) ||
(eth_type == MLAN_ETHER_PKT_TYPE_ARP) ||
(eth_type == MLAN_ETHER_PKT_TYPE_WAPI) ||
(eth_type == MLAN_ETHER_PKT_TYPE_TDLS_ACTION) ||
(pmbuf->buf_type == MLAN_BUF_TYPE_RAW_DATA)
@ -1868,6 +1901,12 @@ void mlan_process_pcie_interrupt_cb(t_void *padapter, int type)
ENTER();
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) {
pcb->moal_tp_accounting_rx_param(
pmadapter->pmoal_handle, 2, 0);
@ -1880,6 +1919,9 @@ void mlan_process_pcie_interrupt_cb(t_void *padapter, int type)
LEAVE();
return;
}
} else if (type == TX_COMPLETE && !wlan_is_tx_pending(pmadapter)) {
LEAVE();
return;
}
pmadapter->ops.process_int_status(pmadapter, type);
switch (type) {
@ -1891,11 +1933,24 @@ void mlan_process_pcie_interrupt_cb(t_void *padapter, int type)
mlan_rx_process(pmadapter, MNULL);
}
break;
case RX_EVENT: // Rx event
case TX_COMPLETE: // Tx data complete
case RX_CMD_RESP: // Rx CMD Resp
mlan_main_process(pmadapter);
wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY),
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;
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:
break;
}

View file

@ -1169,7 +1169,7 @@ static mlan_status wlan_cmd_802_11_key_material(pmlan_private pmpriv,
PRINTM(MCMND, "Remove Key\n");
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.type =
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,
pdata_buf);
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:
ret = wlan_cmd_tx_power_cfg(pmpriv, cmd_ptr, cmd_action,
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:
ret = wlan_cmd_mem_access(cmd_ptr, cmd_action, pdata_buf);
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:
ret = wlan_cmd_inactivity_timeout(cmd_ptr, cmd_action,
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);
cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action);
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:
ret = wlan_cmd_auto_tx(pmpriv, cmd_ptr, cmd_action, cmd_oid,
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,
pdata_buf);
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:
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
ret = MLAN_STATUS_FAILURE;

View file

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

View file

@ -62,6 +62,49 @@ static t_void wlan_handle_disconnect_event(pmlan_private pmpriv)
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
*
@ -334,6 +377,75 @@ static void wlan_send_tdls_tear_down_request(pmlan_private priv)
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
********************************************************/
@ -377,10 +489,6 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect)
else
#endif
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) {
@ -887,6 +995,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
wlan_clean_txrx(pmpriv);
wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_ADHOC_LINK_LOST,
MNULL);
/* Notify IBSS disconnect handler to delete stations if any. */
wlan_notify_stations(pmpriv, MLAN_EVENT_ID_FW_IBSS_DISCONNECT);
break;
case EVENT_ASSOC_REQ_IE:
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);
/* Send OBSS scan param to the application */
wlan_2040_coex_event(pmpriv);
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break;
case EVENT_STOP_TX:
@ -1296,8 +1402,22 @@ mlan_status wlan_ops_sta_process_event(t_void *priv)
break;
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;
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;
case EVENT_SAD_REPORT: {
#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");
wlan_bt_coex_wlan_param_update_event(pmpriv, pmbuf);
break;
case EVENT_NAN_GENERIC:
PRINTM(MEVENT, "EVENT: NAN_GENERIC_EVENT\n");
wlan_process_nan_event(pmpriv, pmbuf);
break;
#if defined(PCIE)
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;
pget_info->param.fw_info.rtt_support =
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;
case MLAN_OID_GET_BSS_INFO:
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_ds_bss *bss = MNULL;
mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index];
ENTER();
@ -1519,6 +1524,9 @@ static mlan_status wlan_bss_ioctl(pmlan_adapter pmadapter,
bss = (mlan_ds_bss *)pioctl_req->pbuf;
switch (bss->sub_command) {
case MLAN_OID_BSS_HOST_MLME:
pmpriv->curr_bss_params.host_mlme = MTRUE;
break;
case MLAN_OID_BSS_START:
status = wlan_bss_ioctl_start(pmadapter, pioctl_req);
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,
HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req,
pioctl_req->action, 0, (t_void *)pioctl_req,
&sec->param.encrypt_key);
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;
ENTER();
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)
status = wlan_sec_ioctl_set_wapi_key(pmadapter,
pioctl_req);
@ -5208,9 +5217,6 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_PMIC_CFG:
status = wlan_misc_ioctl_pmic_configure(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_CWMODE_CTRL:
status = wlan_misc_ioctl_cwmode_ctrl(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_MEF_FLT_CFG:
status = wlan_misc_ioctl_mef_flt_cfg(pmadapter, pioctl_req);
break;
@ -5266,6 +5272,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_GET_CHAN_REGION_CFG:
status = wlan_misc_chan_reg_cfg(pmadapter, pioctl_req);
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:
status = wlan_misc_cloud_keep_alive(pmadapter, pioctl_req);
break;
@ -5299,6 +5308,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
case MLAN_OID_MISC_GET_TX_RX_HISTOGRAM:
status = wlan_get_tx_rx_histogram(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_GPIO_CFG:
status = wlan_misc_gpiocfg(pmadapter, pioctl_req);
break;
case MLAN_OID_MISC_BOOT_SLEEP:
status = wlan_misc_bootsleep(pmadapter, pioctl_req);
break;
@ -5386,7 +5398,12 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter,
status = wlan_misc_ioctl_reorder_flush_time(pmadapter,
pioctl_req);
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:
if (pioctl_req)
pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID;

View file

@ -89,7 +89,85 @@ done:
LEAVE();
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
*
@ -112,6 +190,7 @@ mlan_status wlan_process_tx(pmlan_private priv, pmlan_buffer pmbuf,
#ifdef STA_SUPPORT
PTxPD plocal_tx_pd = MNULL;
#endif
t_u8 dest_mac_first_octet = 0;
ENTER();
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)
plocal_tx_pd = (TxPD *)(head_ptr + priv->intf_hr_len);
#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)
pmadapter->callbacks.moal_tp_accounting(pmadapter->pmoal_handle,
pmbuf, 4);

View file

@ -197,7 +197,8 @@ static mlan_status uap_process_cmdresp_error(mlan_private *pmpriv,
ENTER();
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",
resp->command, resp->result);
if (pioctl_buf)
@ -291,6 +292,10 @@ static mlan_status uap_process_cmdresp_error(mlan_private *pmpriv,
ret = MLAN_STATUS_SUCCESS;
PRINTM(MCMND, "FW don't support chan region cfg command!\n");
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:
if (resp->result == HostCmd_RESULT_BUSY)
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_u16 i;
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;
#endif
ENTER();
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,
bss->param.bss_config.supported_mcs_set, 16,
sizeof(tlv_htcap->ht_cap.supported_mcs_set));
#if defined(PCIE9098) || defined(SD9098) || defined(USB9098) || \
defined(PCIE9097) || defined(USB9097) || defined(SDIW624) || \
defined(PCIEIW624) || defined(USBIW624) || defined(SD9097)
if (IS_CARD9098(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.bandcfg.chanBand ==
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 =
wlan_cpu_to_le16(bss->param.bss_config.ht_ext_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");
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.type =
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;
}
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
*
@ -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;
*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 {
cmd->size =
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;
mlan_ds_misc_cfg *misc_cfg = MNULL;
Stats_Cfg_Params_TLV_t *stats_param = MNULL;
t_u8 *pBuf = (t_u8 *)&cfg_cmd->tlv_buffer;
int len = resp->size;
@ -4636,6 +4661,29 @@ static mlan_status wlan_ret_stats(pmlan_private pmpriv,
len);
misc_cfg->param.stats.tlv_len = len;
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();
@ -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);
cmd_ptr->params.reg_cfg.action = wlan_cpu_to_le16(cmd_action);
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:
ret = wlan_cmd_net_monitor(pmpriv, cmd_ptr, cmd_action,
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);
break;
#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:
PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no);
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_coex_ampdu_rxwinsize(pmadapter);
pmpriv->uap_host_based = 0;
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break;
case HostCmd_CMD_APCMD_BSS_START:
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_host_based = 0;
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_coex_ampdu_rxwinsize(pmadapter);
#if defined(USB)
if (IS_USB(pmadapter->card_type))
wlan_resync_usb_port(pmadapter);
#endif
break;
case HostCmd_CMD_APCMD_SYS_INFO:
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:
ret = wlan_ret_chan_region_cfg(pmpriv, resp, pioctl_buf);
break;
case HostCmd_CMD_REGION_POWER_CFG:
break;
case HostCmd_CMD_PACKET_AGGR_CTRL:
ret = wlan_ret_packet_aggr_ctrl(pmpriv, resp, pioctl_buf);
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;
break;
#endif
case HostCmd_CMD_802_11_TX_FRAME:
break;
case HostCmd_CMD_EDMAC_CFG:
break;
default:
PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n",
resp->command);
@ -5567,10 +5630,6 @@ mlan_status wlan_ops_uap_process_event(t_void *priv)
wlan_coex_ampdu_rxwinsize(pmadapter);
if (wlan_11h_radar_detect_required(pmpriv, pmpriv->uap_channel))
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;
case EVENT_MICRO_AP_BSS_ACTIVE:
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();
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;
LEAVE();
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,
HostCmd_ACT_GEN_SET, KEY_INFO_ENABLED,
pioctl_req->action, KEY_INFO_ENABLED,
(t_void *)pioctl_req, &sec->param.encrypt_key);
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;
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.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)
status = wlan_ioctl_link_statistic(pmpriv, pioctl_req);
break;
@ -2305,6 +2312,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req)
pioctl_req);
if (misc->sub_command == MLAN_OID_MISC_GET_REGIONPWR_CFG)
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)
status = wlan_get_cfp_table(pmadapter, pioctl_req);
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);
if (misc->sub_command == MLAN_OID_MISC_EXT_CAP_CFG)
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;
case MLAN_IOCTL_POWER_CFG:
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;
}
#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
if (priv->bss_type == MLAN_BSS_TYPE_UAP) {
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_u32 out_ts_sec, out_ts_usec;
t_s32 queue_delay;
t_s32 temp_delay = 0;
ENTER();
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->pmoal_handle, pmbuf, 11);
}
queue_delay = (t_s32)(out_ts_sec - pmbuf->in_ts_sec) * 1000;
queue_delay += (t_s32)(out_ts_usec - pmbuf->in_ts_usec) / 1000;
if (!wlan_secure_sub(&out_ts_sec, pmbuf->in_ts_sec, &temp_delay,
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
* by 1). Min value (other than 0) is therefore 2ms, max is 510ms.

View file

@ -24,7 +24,7 @@
#define _MLAN_DECL_H_
/** MLAN release version */
#define MLAN_RELEASE_VERSION "408.p2"
#define MLAN_RELEASE_VERSION "423.p1"
/** Re-define generic data types for MLAN/MOAL */
/** Signed char (1-byte) */
@ -157,10 +157,6 @@ typedef t_s32 t_sval;
/** This is current limit on Maximum Rx AMPDU allowed */
#define MLAN_MAX_RX_BASTREAM_SUPPORTED 16
#ifndef UINT_MAX
#define UINT_MAX (~0U)
#endif
#ifdef STA_SUPPORT
/** Default Win size attached during ADDBA request */
#define MLAN_STA_AMPDU_DEF_TXWINSIZE 64
@ -185,6 +181,11 @@ typedef t_s32 t_sval;
#define MLAN_WFD_COEX_AMPDU_DEF_RXWINSIZE 16
#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 */
#define MLAN_DEFAULT_BLOCK_ACK_TIMEOUT 0xffff
/** Maximum Tx Win size configured for ADDBA request [10 bits] */
@ -273,9 +274,14 @@ typedef t_s32 t_sval;
/** pcie inband reset */
#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
/* 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
#ifdef USB
#define MLAN_USB_BLOCK_SIZE (512)
@ -747,6 +753,7 @@ typedef enum _mlan_bss_type {
#ifdef WIFI_DIRECT_SUPPORT
MLAN_BSS_TYPE_WIFIDIRECT = 2,
#endif
MLAN_BSS_TYPE_NAN = 4,
MLAN_BSS_TYPE_DFS = 8,
MLAN_BSS_TYPE_ANY = 0xff,
} mlan_bss_type;
@ -803,6 +810,8 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_FW_RADAR_DETECTED = 0x00000024,
MLAN_EVENT_ID_FW_CHANNEL_REPORT_RDY = 0x00000025,
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,
#ifdef UAP_SUPPORT
@ -845,6 +854,7 @@ typedef enum _mlan_event_id {
MLAN_EVENT_ID_DRV_UAP_CHAN_INFO = 0x80000020,
#endif
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_ASSOC_FAILURE_LOGGER = 0x80000026,
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_CMDRESP = 0x80000034,
MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035,
MLAN_EVENT_ID_DRV_DELAY_TX_COMPLETE = 0x80000036,
#endif
MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH = 0x80000037,
} mlan_event_id;
/** Data Structures */
@ -907,7 +919,9 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t {
#define OID_TYPE_CAL 0x2
#define OID_TYPE_DPD 0xa
#define NONE_TYPE_DPD 0xb
#define UNKNOW_DPD_LENGTH 0xffffffff
#define NONE_DPD_LENGTH 0xfafafafa
/** Custom data structure */
typedef struct _mlan_init_param {
@ -1291,7 +1305,19 @@ typedef MLAN_PACK_START struct _mc_txcontrol {
/** mc_pkt_flags */
t_u8 mc_pkt_flags;
} 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 */
typedef struct _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
/** 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_ */

View file

@ -319,6 +319,27 @@ typedef MLAN_PACK_START struct {
t_u8 variablep[];
} 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*/
typedef MLAN_PACK_START struct {
/** frame control */

View file

@ -89,6 +89,7 @@ enum _mlan_ioctl_req_id {
#ifdef UAP_SUPPORT
MLAN_OID_ACTION_CHAN_SWITCH = 0x0002001E,
#endif
MLAN_OID_BSS_HOST_MLME = 0x0002001F,
/* Radio Configuration Group */
MLAN_IOCTL_RADIO_CFG = 0x00030000,
@ -376,6 +377,10 @@ enum _mlan_ioctl_req_id {
MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F,
MLAN_OID_MISC_NAV_MITIGATION = 0x00200090,
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 */
@ -390,7 +395,6 @@ enum _mlan_act_ioctl {
MLAN_ACT_RESET,
MLAN_ACT_DEFAULT
};
/** Enumeration for generic enable/disable */
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 */
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;
/** 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 peakULrate; // cap peak UL rate
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_failcnt;
t_u16 basic_trigger_successcnt;
@ -4286,11 +4295,20 @@ enum _mlan_reg_type {
MLAN_REG_CAU = 5,
MLAN_REG_PSU = 6,
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,
#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_BBP2 = 0x82,
MLAN_REG_RF2 = 0x83,
MLAN_REG_BCA2 = 0x87
#endif
};
/** 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];
} 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 */
#define MLAN_MAX_CLK_NUM 16
@ -4766,6 +4804,18 @@ typedef struct _mlan_ds_misc_country_code {
t_u8 country_code[COUNTRY_CODE_LEN];
} 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 */
#define SUBSCRIBE_EVT_ACT_BITWISE_SET 0x0002
/** action for clear */
@ -5490,22 +5540,6 @@ typedef MLAN_PACK_START struct _mlan_ds_misc_tx_rx_histogram {
t_u8 value[1];
} 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)
/** Struct for per-packet configuration */
typedef struct _mlan_per_pkt_cfg {
@ -6124,6 +6158,20 @@ typedef struct _mlan_ds_reorder_flush_time {
t_u16 flush_time_ac_vi_vo;
} 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 */
typedef struct _mlan_ds_misc_cfg {
/** Sub-command */
@ -6140,6 +6188,8 @@ typedef struct _mlan_ds_misc_cfg {
#endif
/** Hostcmd for MLAN_OID_MISC_HOST_CMD */
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 */
mlan_ds_misc_sys_clock sys_clock;
/** 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_rx keep_alive_rx;
mlan_ds_misc_tx_rx_histogram tx_rx_histogram;
mlan_ds_cw_mode_ctrl cwmode;
/** Tx/Rx per-packet control */
t_u8 txrx_pkt_ctrl;
mlan_ds_misc_robustcoex_params robustcoexparams;
@ -6294,6 +6343,8 @@ typedef struct _mlan_ds_misc_cfg {
mlan_ds_ch_load ch_load;
mlan_ds_cross_chip_synch cross_chip_synch;
mlan_ds_reorder_flush_time flush_time;
mlan_ds_ed_mac_cfg edmac_cfg;
mlan_ds_gpio_cfg_ops gpio_cfg_ops;
} param;
} 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 addr Mac for which key is to be set
* @param disable Key disabled or not
* @param pairwise pairwise flag
* @param wait_option wait option
*
* @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,
t_u32 cipher, const t_u8 *key, int key_len,
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)
{
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)
sec->param.encrypt_key.key_flags =
KEY_FLAG_GROUP_KEY;
else
sec->param.encrypt_key.key_flags =
KEY_FLAG_SET_TX_KEY;
else {
#if KERNEL_VERSION(2, 6, 36) < CFG80211_VERSION_CODE
if (!pairwise)
sec->param.encrypt_key.key_flags =
KEY_FLAG_GROUP_KEY;
else
#endif
sec->param.encrypt_key.key_flags =
KEY_FLAG_SET_TX_KEY;
}
} else {
moal_memcpy_ext(priv->phandle,
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
cipher = WLAN_CIPHER_SUITE_WEP104;
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 {
/* No key provided so it is enable key. We
* want to just set the transmit key index
*/
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)
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)
{
moal_private *priv = (moal_private *)woal_get_netdev_priv(netdev);
t_u8 pairwise_key = MFALSE;
ENTER();
if (priv->ft_pre_connect) {
@ -1533,9 +1542,25 @@ int woal_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
/** cancel pending scan */
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,
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");
LEAVE();
return -EFAULT;
@ -1595,7 +1620,7 @@ int woal_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
*/
if (MLAN_STATUS_FAILURE ==
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");
LEAVE();
return -EFAULT;
@ -2659,6 +2684,242 @@ t_u8 woal_check_mgmt_tx_channel(moal_private *priv,
}
#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, 3, 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
moal_private *priv = (moal_private *)woal_get_netdev_priv(dev);
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
t_u8 channel_status;
t_u32 duration;
moal_private *remain_priv = NULL;
#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;
ENTER();
if (buf == NULL || len == 0) {
@ -2856,7 +3105,8 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
case IEEE80211_STYPE_DEAUTH:
case IEEE80211_STYPE_DISASSOC:
#ifdef UAP_SUPPORT
if (!priv->bss_started) {
if ((priv->bss_role == MLAN_BSS_ROLE_UAP) &&
!priv->bss_started) {
PRINTM(MCMND,
"Drop deauth packet before AP started\n");
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)
@ -2997,17 +3247,6 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
}
#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
*cookie = random32() | 1;
#else
@ -3017,133 +3256,9 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy,
*cookie = get_random_u32() | 1;
#endif
#endif
pmbuf->data_offset = MLAN_MIN_DATA_HEADER_LEN;
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;
}
ret = woal_mgmt_tx(priv, buf, len, chan, *cookie, wait);
done:
if (status != MLAN_STATUS_PENDING) {
if (tx_info)
woal_remove_tx_info(priv, tx_info->tx_seq_num);
}
LEAVE();
return ret;
}
@ -4596,6 +4711,7 @@ Bit18: 0x1 (STBC Tx <= 80 MHz)
Bit19: 0x1 (STBC Rx <= 80 MHz)
Bit20: 0x1 (Doppler Tx)
Bit21: 0x1 (Doppler Rx)
Bit24-25: 0x1 (DCM Max Constellation Tx)
Bit27-28: 0x1 (DCM Max Constellation Rx)
Bit31: 0x1 (SU Beamformer)
Bit32: 0x1 (SU BeamFormee)
@ -4609,16 +4725,16 @@ Bit59-61: 0x1 (Max Nc)
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_CAP2_MASK 0x00
#define UAP_HE_MAC_CAP2_MASK 0x10
#define UAP_HE_MAC_CAP3_MASK 0x02
#define UAP_HE_MAC_CAP4_MASK 0x00
#define UAP_HE_MAC_CAP5_MASK 0x00
#define UAP_HE_PHY_CAP0_MASK 0x04
#define UAP_HE_PHY_CAP1_MASK 0x23
#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_CAP5_MASK 0x01
#define UAP_HE_PHY_CAP6_MASK 0xA0
@ -4645,6 +4761,7 @@ Bit18: 0x1 (STBC Tx <= 80 MHz)
Bit19: 0x1 (STBC Rx <= 80 MHz)
Bit20: 0x1 (Doppler Tx)
Bit21: 0x1 (Doppler Rx)
Bit24-25: 0x1 (DCM Max Constellation Tx)
Bit27-28: 0x1 (DCM Max Constellation Rx)
Bit31: 0x1 (SU Beamformer)
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_CAP1_MASK 0x20
#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_CAP5_MASK 0x01
#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,
t_u32 cipher, const t_u8 *key, int key_len,
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);
mlan_status woal_cfg80211_set_wep_keys(moal_private *priv, const t_u8 *key,

View file

@ -146,10 +146,9 @@ static const struct nla_policy woal_attr_policy[ATTR_WIFI_MAX + 1] = {
[ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX] = {.type = NLA_U32},
[ATTR_SCAN_BAND_SET] = {.type = NLA_U8},
};
// clang-format off
static const struct nla_policy
woal_nd_offload_policy[ATTR_ND_OFFLOAD_MAX + 1] = {
woal_nd_offload_policy[ATTR_ND_OFFLOAD_MAX + 1] = {
[ATTR_ND_OFFLOAD_CONTROL] = {.type = NLA_U8},
};
// clang-format on
@ -3935,9 +3934,8 @@ done:
LEAVE();
return ret;
}
/**
* @brief vendor command to set scan band
* @brief vendor command to
*
* @param wiphy A pointer to wiphy 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_MAX = ATTR_WIFI_AFTER_LAST - 1
} wifi_attr_t;
enum mrvl_wlan_vendor_attr_wifi_logger {
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;
#endif
gfp_t flag;
t_u32 temp_count = 0;
ENTER();
@ -1210,7 +1211,11 @@ static ssize_t woal_debug_write(struct file *f, const char __user *buf,
return MLAN_STATUS_FAILURE;
}
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) {
MODULE_PUT;
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;
char buf[MLAN_MAX_VER_STR_LEN];
t_u32 temp_buf_len = 0;
ENTER();
@ -340,9 +341,13 @@ static int woal_get_priv_driver_version(moal_private *priv, t_u8 *respbuf,
len = strlen(buf);
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 */
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,
respbuflen - 1);
} else {
@ -450,7 +455,7 @@ static int woal_setget_priv_11axcmdcfg(moal_private *priv, t_u8 *respbuf,
int ret = 0;
mlan_status status = MLAN_STATUS_SUCCESS;
int header_len = 0, user_data_len = 0;
int data[8] = {0};
int data[10] = {0};
ENTER();
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],
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");
ret = -EFAULT;
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.peakULrate = data[5];
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;
default:
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 */
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) {
ret = -ENOMEM;
goto done;
@ -12283,7 +12291,8 @@ static void woal_get_dfs_chan_list(moal_private *priv)
for (i = 0; i < sband->n_channels; i++) {
if ((sband->channels[i].flags &
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.num_of_chan] =
sband->channels[i].hw_value;
@ -13428,16 +13437,22 @@ static int woal_priv_set_get_tx_rx_ant(moal_private *priv, t_u8 *respbuf,
#if defined(STA_CFG80211) || defined(UAP_CFG80211)
if (IS_CARD9098(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, radio);
}
#endif
} else {
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 =
data[1];
}
}
req->action = MLAN_ACT_SET;
}
@ -13472,79 +13487,6 @@ done:
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
*
@ -14643,6 +14585,92 @@ done:
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
* @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;
}
ssid_passphrase->ssid.ssid_len = strlen(item);
strncpy((char *)ssid_passphrase->ssid.ssid,
item,
MIN(strlen(item),
MLAN_MAX_SSID_LENGTH));
moal_memcpy_ext(
priv->phandle,
(char *)ssid_passphrase->ssid.ssid,
item, strlen(item),
MLAN_MAX_SSID_LENGTH);
PRINTM(MINFO, "ssid=%s, len=%d\n",
ssid_passphrase->ssid.ssid,
(int)ssid_passphrase->ssid.ssid_len);
@ -19521,7 +19550,8 @@ static int woal_priv_set_get_lpm(moal_private *priv, t_u8 *respbuf,
ENTER();
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);
if ((int)strlen(respbuf) == header_len) {
/* GET operation */
@ -20495,6 +20525,10 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req)
/* Memory Read/Write */
len = woal_priv_memrdwr(priv, buf, priv_cmd.total_len);
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
} else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_SDCMD52RW,
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 */
len = woal_priv_cfp_code(priv, buf, priv_cmd.total_len);
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,
strlen(PRIV_CMD_ANT_CFG)) == 0) {
/* 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);
if (priv->phandle->params.cntry_txpwr) {
if (MLAN_STATUS_SUCCESS !=
woal_request_country_power_table(priv,
country_code)) {
woal_request_country_power_table(priv, country_code,
MOAL_IOCTL_WAIT)) {
ret = -EFAULT;
goto done;
}

View file

@ -151,6 +151,7 @@ typedef struct _chan_stats {
#define PRIV_CMD_REGRDWR "regrdwr"
#define PRIV_CMD_RDEEPROM "rdeeprom"
#define PRIV_CMD_MEMRDWR "memrdwr"
#define PRIV_CMD_GPIOCFG "gpiocfg"
#ifdef SDIO
#define PRIV_CMD_SDCMD52RW "sdcmd52rw"
#endif
@ -229,7 +230,6 @@ typedef struct _chan_stats {
#define PRIV_CMD_DFS_CAC "dfs_cac"
#define PRIV_CMD_AUTODFS "autodfs"
#define PRIV_CMD_CFP_CODE "cfpcode"
#define PRIV_CMD_CWMODE "cwmode"
#define PRIV_CMD_ANT_CFG "antcfg"
#define PRIV_CMD_SYSCLOCK "sysclock"
#define PRIV_CMD_GET_KEY "getkey"
@ -737,13 +737,6 @@ typedef struct _tx_rx_histogram {
t_u8 action;
} __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 */
typedef struct {
/** center freq */

View file

@ -29,7 +29,11 @@ extern pmoal_handle m_handle[];
static char *fw_name;
static int req_fw_nowait;
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;
@ -78,7 +82,7 @@ static int auto_ds;
/** net_rx mode*/
static int net_rx;
/** amsdu deaggr mode */
static int amsdu_deaggr;
static int amsdu_deaggr = 1;
static int ext_scan;
@ -122,6 +126,11 @@ static int max_vir_bss = DEF_VIRTUAL_BSS;
#endif
#endif
/** Max NAN interfaces */
static int max_nan_bss = DEF_NAN_BSS;
/** NAN interface name */
static char *nan_name;
/** PM keep power */
static int pm_keep_power = 1;
#ifdef SDIO_SUSPEND_RESUME
@ -152,6 +161,12 @@ static int rps = 0;
#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;
#ifdef IMX_SUPPORT
static int pmqos = 1;
@ -301,6 +316,8 @@ static int mon_filter = DEFAULT_NETMON_FILTER;
#endif
#endif
int dual_nb;
#ifdef DEBUG_LEVEL1
#ifdef DEBUG_LEVEL2
#define DEFAULT_DEBUG_MASK (0xffffffff)
@ -345,7 +362,6 @@ static card_type_entry card_type_map_tbl[] = {
#ifdef SDIW624
{CARD_TYPE_SDIW624, 0, CARD_SDIW624},
#endif
{CARD_TYPE_SDAW693, 0, CARD_SDAW693},
#ifdef PCIE8897
{CARD_TYPE_PCIE8897, 0, CARD_PCIE8897},
#endif
@ -358,7 +374,6 @@ static card_type_entry card_type_map_tbl[] = {
#ifdef PCIE9098
{CARD_TYPE_PCIE9098, 0, CARD_PCIE9098},
#endif
{CARD_TYPE_PCIEAW693, 0, CARD_PCIEAW693},
#ifdef PCIEIW624
{CARD_TYPE_PCIEIW624, 0, CARD_PCIEIW624},
#endif
@ -553,7 +568,9 @@ static mlan_status parse_line_read_card_info(t_u8 *line, char **type,
p = strstr(line, "_");
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;
} else {
*if_id = NULL;
@ -772,7 +789,20 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
}
#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) !=
MLAN_STATUS_SUCCESS)
goto err;
@ -1237,8 +1267,17 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
}
#endif
#endif
else if (strncmp(line, "tx_skb_clone",
strlen("tx_skb_clone")) == 0) {
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) {
if (parse_line_read_int(line, &out_data) !=
MLAN_STATUS_SUCCESS)
goto err;
@ -1452,6 +1491,12 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size,
goto err;
params->auto_11ax = out_data;
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)
@ -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;
#endif
#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;
if (params)
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);
#endif
#endif
handle->params.edmac_ctrl = edmac_ctrl;
if (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.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;
}
#endif /* WIFI_DIRECT_SUPPORT */
if (params->nan_name) {
kfree(params->nan_name);
params->nan_name = NULL;
}
if (params->dpd_data_cfg) {
kfree(params->dpd_data_cfg);
params->dpd_data_cfg = NULL;
@ -1987,8 +2046,14 @@ void woal_init_from_dev_tree(void)
}
#endif
#endif
else if (!strncmp(prop->name, "tx_skb_clone",
strlen("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"))) {
if (!of_property_read_u32(dt_node, prop->name, &data)) {
PRINTM(MIOCTL, "tx_skb_clone=0x%x\n", data);
tx_skb_clone = data;
@ -2551,8 +2616,9 @@ MODULE_PARM_DESC(fw_reload,
"0: disable fw_reload; 1: enable fw reload feature");
module_param(auto_fw_reload, int, 0);
#ifdef PCIE
MODULE_PARM_DESC(auto_fw_reload,
"BIT0: enable auto fw_reload; BIT1:enable PCIe in-band reset");
MODULE_PARM_DESC(
auto_fw_reload,
"BIT0: enable auto fw_reload; BIT1: 0: enable PCIE FLR, 1: enable PCIe in-band reset");
#else
MODULE_PARM_DESC(auto_fw_reload, "BIT0: enable auto fw_reload");
#endif
@ -2573,8 +2639,9 @@ MODULE_PARM_DESC(
rf_test_mode,
"0: Download normal firmware; 1: Download RF_TEST_MODE firmware");
module_param(drv_mode, int, 0660);
MODULE_PARM_DESC(drv_mode,
"Bit 0: STA; Bit 1: uAP; Bit 2: WIFIDIRECT; Bit 7: ZERO_DFS");
MODULE_PARM_DESC(
drv_mode,
"Bit 0: STA; Bit 1: uAP; Bit 2: WIFIDIRECT; Bit 4: NAN; Bit 7: ZERO_DFS");
#ifdef STA_SUPPORT
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)");
#endif
#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
module_param(drvdbg, uint, 0660);
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");
#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_PARM_DESC(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,
"0: use netif_rx_ni in rx; 1: use netif_receive_skb in rx");
module_param(amsdu_deaggr, int, 0);
MODULE_PARM_DESC(amsdu_deaggr,
"0: default; 1: Try to avoid buf copy in amsud deaggregation");
MODULE_PARM_DESC(
amsdu_deaggr,
"0: buf copy in amsud deaggregation; 1: avoid buf copy in amsud deaggregation (default)");
#ifdef SDIO
#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");
#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;
priv->phandle->fw_ecsa_enable = info->param.fw_info.ecsa_enable;
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 =
info->param.fw_info.getlog_enable;
priv->phandle->fw_roaming_support =
@ -2583,6 +2585,43 @@ done:
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
*
@ -2596,6 +2635,7 @@ int woal_send_host_packet(struct net_device *dev, struct ifreq *req)
t_u32 packet_len = 0;
int ret = 0;
pmlan_buffer pmbuf = NULL;
IEEE80211_MGMT *mgmt = NULL;
mlan_status status;
ENTER();
@ -2619,6 +2659,7 @@ int woal_send_host_packet(struct net_device *dev, struct ifreq *req)
goto done;
}
#define PACKET_HEADER_LEN 8
#define FRAME_LEN 2
#define MV_ETH_FRAME_LEN 1514
if (packet_len > MV_ETH_FRAME_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->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);
switch (status) {
case MLAN_STATUS_PENDING:
@ -3862,6 +3912,34 @@ done:
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
*
* @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 TRIGGER_FRAME_STR_LEN 250
#define HE_TB_TX_STR_LEN 30
#define MAX_RADIO_MODE 21
/*
* @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)
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;
kfree(tmp);
@ -8214,7 +8293,6 @@ static int parse_radio_mode_string(const char *s, size_t len,
return ret;
}
#ifdef SD9177
/*
* @brief PowerLevelToDUT11Bits
*
@ -8238,7 +8316,6 @@ static void PowerLevelToDUT11Bits(int Pwr, t_u32 *PowerLevel)
return;
}
#endif
/*
* @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 *pos = NULL;
gfp_t flag;
#ifdef SD9177
t_u32 tx_pwr_converted = 0xffffffff;
int tx_pwr_local = 0;
t_u8 fc_card = MFALSE;
#endif
t_u8 pow_conv = MFALSE;
t_u32 pow_limit = 24;
t_u8 card_type;
ENTER();
if (!s || !d) {
LEAVE();
return -EINVAL;
}
#ifdef SD9177
if (IS_SD9177(handle->card_type))
fc_card = MTRUE;
#endif
card_type = (handle->card_type) & 0xff;
if ((card_type == CARD_TYPE_9098) || (card_type == CARD_TYPE_9097) ||
(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;
string = kzalloc(TX_PWR_STR_LEN, flag);
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 */
pos = strsep(&string, " \t");
#ifdef SD9177
if (fc_card && pos) {
/* for sd9177 we need to convert user power vals including -ve
* vals as per labtool */
if (pow_conv && pos) {
/* for SH and later chipsets we need to convert user power vals
* including -ve vals to 1/16dbm resolution*/
tx_pwr_local = woal_string_to_number(pos);
PowerLevelToDUT11Bits(tx_pwr_local, &tx_pwr_converted);
d->data1 = tx_pwr_converted;
} else
#endif
if (pos) {
pow_limit = 384;
} else if (pos) {
d->data1 = (t_u32)woal_string_to_number(pos);
}
/* modulation */
@ -8310,12 +8388,8 @@ static int parse_tx_pwr_string(moal_handle *handle, const char *s, size_t len,
if (pos)
d->data3 = (t_u32)woal_string_to_number(pos);
#ifdef SD9177
if (((!fc_card) && ((d->data1 > 24) && (d->data1 != 0xffffffff))) ||
if (((d->data1 > pow_limit) && (d->data1 != 0xffffffff)) ||
(d->data2 > 2))
#else
if (((d->data1 > 24) && (d->data1 != 0xffffffff)) || (d->data2 > 2))
#endif
ret = -EINVAL;
kfree(tmp);
@ -9112,3 +9186,59 @@ done:
return ret;
}
#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>
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 5, 0)
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 6, 0)
#include <net/netdev_rx_queue.h>
#endif
@ -292,12 +292,16 @@ typedef t_u8 BOOLEAN;
#define CARD_TYPE_PCIE_USB 7
/** card type SD9177_UART */
#define CARD_TYPE_SD9177_UART 1 // As per datasheet/SoC design
/** card type SDIW624_UART */
#define CARD_TYPE_SDIW624_UART 0 // As per datasheet/SoC design
/** card type PCIEIW624_USB */
#define CARD_TYPE_PCIEIW624_USB 4 // As per datasheet/SoC design
/** card type PCIEIW624_UART */
#define CARD_TYPE_PCIEIW624_UART 7 // As per datasheet/SoC design
/** card type SDIW624_UARTSPI */
#define CARD_TYPE_SDIW624_UARTSPI 0 // As per datasheet/SoC design
/** card type SDIW624_UARTUART */
#define CARD_TYPE_SDIW624_UARTUART 2 // As per datasheet/SoC design
/** card type PCIEIW624_USBUSB */
#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 */
#define MAX_BUF_LEN 512
@ -866,6 +870,7 @@ typedef enum {
CONTROL_FRAME_MATCHED, // 8. Control frame matched
MANAGEMENT_FRAME_MATCHED, // 9. Management frame matched
GTK_REKEY_FAILURE, // 10. GTK rekey failure
MGMT_FRAME_FILTER_EXT_MATCHED, // 11. Management frame filter matched
RESERVED // Others: reserved
} 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 */
#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"
#ifdef UAP_SUPPORT
@ -1054,6 +1064,12 @@ typedef struct _wait_queue {
#define DEF_VIRTUAL_BSS 0
#endif
#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**/
#define DRV_MODE_DFS MBIT(7)
@ -1182,6 +1198,7 @@ enum woal_event_type {
WOAL_EVENT_CANCEL_CHANRPT,
#endif
#endif
WOAL_EVENT_RGPWR_KEY_MISMATCH,
};
/** chan_rpt_info */
@ -2423,6 +2440,8 @@ typedef struct _moal_mod_para {
int max_vir_bss;
#endif
#endif /* WIFI_DIRECT_SUPPORT */
char *nan_name;
int max_nan_bss;
int auto_ds;
int net_rx;
int amsdu_deaggr;
@ -2487,10 +2506,13 @@ typedef struct _moal_mod_para {
int rps;
#endif
#endif
int edmac_ctrl;
int keep_previous_scan;
int auto_11ax;
/** hs_auto_arp setting */
int hs_auto_arp;
/** Dual-BT **/
int dual_nb;
} moal_mod_para;
void woal_tp_acnt_timer_func(void *context);
@ -2625,6 +2647,10 @@ struct _moal_handle {
t_u16 fw_bands;
/** ECSA support */
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 */
t_u8 fw_roam_enable;
/** FW ROAMING capability in fw */
@ -2743,10 +2769,23 @@ struct _moal_handle {
struct workqueue_struct *pcie_cmd_resp_workqueue;
/** pcie rx 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 */
struct tasklet_struct pcie_rx_task;
/* pcie tx complete tasklet */
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
/** event spin lock */
spinlock_t evt_lock;
@ -3019,6 +3058,7 @@ struct _moal_handle {
#endif
#endif
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);
/** update the default firmware name */
void woal_update_firmware_name(moal_handle *handle);
mlan_status woal_set_rgpower_table(moal_handle *handle);
/** cancel all works in the queue */
void woal_terminate_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
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_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
#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);
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,
t_u8 wait_option, t_u8 action);
#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);
irqreturn_t woal_oob_wakeup_irq_handler(int irq, void *priv);
#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 */

View file

@ -116,22 +116,6 @@ static const struct pci_device_id wlan_ids[] = {
0,
},
#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
{
PCIE_VENDOR_ID_NXP,
@ -157,8 +141,11 @@ static moal_if_ops pcie_ops;
********************************************************/
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,
t_u8 resetflag);
#endif
/** @brief This function updates the card types
*
@ -226,18 +213,6 @@ static t_u16 woal_update_card_type(t_void *card)
strlen(KERN_VERSION));
}
#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
if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WIW624) {
card_type = CARD_TYPE_PCIEIW624;
@ -385,10 +360,12 @@ perform_init:
goto err_init_fw;
}
#if defined(PCIE9098)
if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) ||
(card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1))
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1);
else
#endif
/* Update pcie_int_mode in mlan adapter */
mlan_set_int_mode(handle->pmlan_adapter,
handle->params.pcie_int_mode, 0);
@ -598,12 +575,14 @@ static void woal_pcie_shutdown(struct pci_dev *dev)
handle = card->handle;
if (handle->second_mac)
goto done;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(handle->card_type) || IS_PCIEIW624(handle->card_type) ||
IS_PCIEAW693(handle->card_type) || IS_PCIE9097(handle->card_type)) {
if (RDWR_STATUS_FAILURE !=
woal_pcie_rdwr_firmware(handle, 0, 1))
PRINTM(MMSG, "wlan: start in-bound IR...\n");
}
#endif
done:
handle->surprise_removed = MTRUE;
pci_disable_device(dev);
@ -1439,10 +1418,12 @@ static mlan_status woal_pcie_register_dev(moal_handle *handle)
break;
}
#if defined(PCIE9098)
if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) ||
(card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1))
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 1);
else
#endif
mlan_set_int_mode(handle->pmlan_adapter, pcie_int_mode, 0);
done:
@ -1565,20 +1546,24 @@ void woal_pcie_bus_unregister(void)
LEAVE();
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#define PCIE9098_DUMP_CTRL_REG 0x1C94
#define PCIE9098_DUMP_START_REG 0x1C98
#define PCIE9098_DUMP_END_REG 0x1C9F
#endif
#if defined(PCIE8897) || defined(PCIE8997)
#define DEBUG_DUMP_CTRL_REG 0xCF4
#define DEBUG_DUMP_START_REG 0xCF8
#define DEBUG_DUMP_END_REG 0xCFF
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#define PCIE9098_SCRATCH_12_REG 0x1C90
#define PCIE9098_SCRATCH_14_REG 0x1C98
#define PCIE9098_SCRATCH_15_REG 0x1C9C
#define PCIE9098_DUMP_REG_START 0x1C20
#define PCIE9098_DUMP_REG_END 0x1C9C
#endif
#if defined(PCIE8997) || defined(PCIE8897)
#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 scratch_14_reg = 0;
t_u32 scratch_15_reg = 0;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/* Tx/Rx/Event AMDA start address */
t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080};
t_u8 j;
#endif
ENTER();
mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE);
drv_ptr += sprintf(drv_ptr,
@ -1634,6 +1621,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer)
}
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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_15_reg = PCIE9098_SCRATCH_15_REG;
}
#endif
woal_pcie_read_reg(phandle, 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++;
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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);
}
}
#endif
drv_ptr += sprintf(drv_ptr,
"-----------PCIe Registers dump End-----------\n");
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 scratch_14_reg = 0;
t_u32 scratch_15_reg = 0;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
/* Tx/Rx/Event AMDA start address */
t_u32 adma_reg_table[] = {0x10000, 0x10800, 0x10880, 0x11000, 0x11080};
t_u8 j;
#endif
mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE);
PRINTM(MMSG, "Config Space Registers:\n");
for (i = 0; i < ARRAY_SIZE(config_reg_table); i++) {
@ -1776,6 +1769,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
}
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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_15_reg = PCIE9098_SCRATCH_15_REG;
}
#endif
woal_pcie_read_reg(phandle, reg, &value);
PRINTM(MERROR, "reg:0x%x value=0x%x\n", reg, value);
for (i = 0; i < 2; i++) {
@ -1814,6 +1809,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle)
}
i++;
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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);
}
}
#endif
mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE);
}
@ -1902,12 +1899,18 @@ static memory_type_mapping mem_type_mapping_tbl_8897[] = {
};
#endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
#define DEBUG_HOST_READY_8997 0xCC
#define DEBUG_HOST_EVENT_READY 0xAA
#define DEBUG_HOST_RESET_READY 0x99
static memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL,
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
*
@ -1957,6 +1960,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag,
}
#endif
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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;
dump_ctrl_reg = PCIE9098_DUMP_CTRL_REG;
}
#endif
ret = woal_pcie_write_reg(phandle, dump_ctrl_reg, debug_host_ready);
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);
return RDWR_STATUS_FAILURE;
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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)
return RDWR_STATUS_SUCCESS;
}
#endif
ret = woal_pcie_read_reg(phandle, dump_ctrl_reg, &reg_data);
if (ret) {
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;
}
#endif
#ifdef PCIE8897
/**
@ -2225,6 +2233,8 @@ done:
}
#endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
/**
* @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");
return;
}
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)
/** Create dump directory*/
@ -2292,6 +2304,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle)
if (RDWR_STATUS_FAILURE ==
woal_pcie_rdwr_firmware(phandle, doneflag, 0))
goto done;
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
if (IS_PCIE9098(phandle->card_type) ||
IS_PCIEIW624(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_end_reg = PCIE9098_DUMP_END_REG;
}
#endif
#ifdef PCIE8997
if (IS_PCIE8997(phandle->card_type)) {
dump_start_reg = DEBUG_DUMP_START_REG;
@ -2427,6 +2441,7 @@ done:
return;
}
#endif
/**
* @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)
{
#if defined(PCIE9098)
pcie_service_card *card = (pcie_service_card *)handle->card;
if ((card->dev->device == PCIE_DEVICE_ID_88W9098P_FN1) ||
(card->dev->device == PCIE_DEVICE_ID_88WAW693_FN1))
return MTRUE;
#endif
return MFALSE;
}
@ -2458,6 +2475,8 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
if (IS_PCIE8897(phandle->card_type))
woal_pcie_dump_fw_info_v1(phandle);
#endif
#if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) || \
defined(PCIEIW624)
if (IS_PCIE8997(phandle->card_type) ||
IS_PCIEAW693(phandle->card_type) ||
IS_PCIEIW624(phandle->card_type) ||
@ -2472,6 +2491,7 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle)
return;
}
}
#endif
phandle->fw_dump = MFALSE;
if (!phandle->priv_num)
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)
{
mlan_status ret = MLAN_STATUS_SUCCESS;
#if defined(PCIE9098)
pcie_service_card *card = (pcie_service_card *)handle->card;
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 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 magic_reg = handle->card_info->magic_reg;
t_u32 strap = 0;
t_u32 magic = 0;
#endif
#ifdef PCIEIW624
t_u32 boot_mode_reg = handle->card_info->boot_mode_reg;
t_u32 boot_mode;
@ -2651,35 +2679,6 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
}
}
#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
if (IS_PCIEIW624(handle->card_type)) {
woal_pcie_read_reg(handle, rev_id_reg, &revision_id);
@ -2695,12 +2694,28 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle)
magic, boot_mode, strap, revision_id);
if (boot_mode == 0x03)
PRINTM(MMSG, "wlan: PCIE-IW624 in secure-boot mode\n");
if (strap == CARD_TYPE_PCIEIW624_UART)
strcpy(handle->card_info->fw_name,
PCIEUARTIW624_DEFAULT_COMBO_FW_NAME);
else
strcpy(handle->card_info->fw_name,
PCIEUSBIW624_DEFAULT_COMBO_FW_NAME);
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,
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
strcpy(handle->card_info->fw_name,
PCIEUSBIW624_DEFAULT_COMBO_FW_NAME);
}
}
#endif
done:

View file

@ -47,20 +47,24 @@ Change log:
#define PCIE_DEVICE_ID_88W9097 (0x2b56)
#endif
#if defined(PCIE9098)
/** PCIE device ID for 9098 card FN0 */
#define PCIE_DEVICE_ID_88W9098P_FN0 (0x2b43)
/** PCIE device ID for 9098 card FN1 */
#define PCIE_DEVICE_ID_88W9098P_FN1 (0x2b44)
#endif
#ifdef PCIEIW624
/** PCIE device ID for IW624 card FN0 */
#define PCIE_DEVICE_ID_88WIW624 (0x3000)
#endif
#if defined(PCIE9098)
/** PCIE device ID for AW693 card FN0 */
#define PCIE_DEVICE_ID_88WAW693_FN0 (0x3003)
/** PCIE device ID for AW693 card FN1 */
#define PCIE_DEVICE_ID_88WAW693_FN1 (0x3004)
#endif
#include <linux/version.h>
#include <linux/pci.h>
@ -87,10 +91,6 @@ Change log:
#define PCIE8897_DEFAULT_WLAN_FW_NAME "nxp/pcie8897_wlan.bin"
#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
#define PCIE9098_Z1Z2 0x00
#define PCIE9098_A0 0x01
@ -124,10 +124,18 @@ Change log:
#define PCIEIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw624_combo.bin"
#define PCIEUARTIW624_DEFAULT_COMBO_FW_NAME "nxp/pcieuartiw624_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"
#endif /* PCIEIW624 */
#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624)
#define PCIE_NUM_MSIX_VECTORS 32
#else
#define PCIE_NUM_MSIX_VECTORS 4
#endif
typedef struct _msix_context {
/** pci_dev structure pointer */

View file

@ -6421,9 +6421,14 @@ static int woal_set_get_tx_rx_ant(moal_private *priv, struct iwreq *wrq)
radio->param.ant_cfg.rx_antenna = data[1];
} else {
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 =
data[1];
}
}
req->action = MLAN_ACT_SET;
} else

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 (IS_CARD9098(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,
radio);
}
#endif
} else
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];
}
/* Send IOCTL request to MLAN */
status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT);
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) {
priv = woal_get_priv(ref_handle, MLAN_BSS_ROLE_ANY);
if (priv) {
handle->fw_dump_status = MTRUE;
ref_handle->fw_dump_status = MTRUE;
woal_mlan_debug_info(priv);
woal_moal_debug_info(priv, NULL, MFALSE);
}

View file

@ -142,15 +142,12 @@ Change log:
#ifdef SDIW624
#define SDIW624_DEFAULT_COMBO_FW_NAME "nxp/sdsdiw624_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 SDIW624_DEFAULT_WLAN_FW_NAME "nxp/sdiw624_wlan.bin"
#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
#define SD9177_A0 0x00
#define SD9177_A1 0x01

View file

@ -71,10 +71,6 @@ static moal_if_ops sdiommc_ops;
/** Device ID for SD8987 */
#define SD_DEVICE_ID_8987 (0x9149)
#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
/** Device ID for SD9098 */
#define SD_DEVICE_ID_9098_FN1 (0x914D)
@ -117,8 +113,6 @@ static const struct sdio_device_id wlan_ids[] = {
#ifdef SD8987
{SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_8987)},
#endif
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN1)},
{SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_AW693_FN2)},
#ifdef SD9098
{SDIO_DEVICE(MRVL_VENDOR_ID, SD_DEVICE_ID_9098_FN1)},
{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)));
}
#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
if (cardp_sd->func->device == SD_DEVICE_ID_9097) {
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)
{
#if defined(SD9098)
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
if (card->func->device == SD_DEVICE_ID_9098_FN2)
return MTRUE;
@ -1395,10 +1376,14 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
t_u32 revision_id = 0;
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 = 0;
t_u32 host_strap_reg = handle->card_info->host_strap_reg;
t_u32 strap = 0;
#endif
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);
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 */
woal_sdiommc_read_reg(handle, magic_reg, &magic);
/** Revision ID register */
@ -1420,6 +1408,7 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
magic &= 0xFF;
/* 1 = SDSD, 0 --SD UART */
PRINTM(MCMND, "magic=0x%x strap=0x%x\n", magic, strap);
#endif
#if defined(SD8977)
if (IS_SD8977(handle->card_type)) {
switch (revision_id) {
@ -1575,30 +1564,34 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle)
}
}
#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
if (IS_SDIW624(handle->card_type)) {
magic &= 0x03;
if (magic == 0x03)
PRINTM(MMSG, "wlan: SDIW624 in secure-boot mode\n");
if (strap == CARD_TYPE_SDIW624_UART)
strncpy(handle->card_info->fw_name,
SDUARTIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN);
else
if (strap == CARD_TYPE_SDIW624_UARTSPI) {
if (handle->params.dual_nb)
strncpy(handle->card_info->fw_name,
SDUARTSPIIW624_COMBO_FW_NAME,
FW_NAMW_MAX_LEN);
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,
SDSDIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN);
}
}
#endif
@ -2127,8 +2120,11 @@ void woal_dump_firmware_info_v2(moal_handle *phandle)
PRINTM(MMSG, "==== DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, usec);
/* read the number of the memories which will dump */
if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE))
goto done;
woal_cmd52_rdwr_firmware(phandle, doneflag, MFALSE)) {
if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE))
goto done;
}
reg = dbg_dump_start_reg;
ret = woal_sdio_readb(phandle, reg, &dump_num);
if (ret) {
@ -2305,6 +2301,13 @@ void woal_dump_firmware_info_v3(moal_handle *phandle)
#ifdef SD9177
if (IS_SD9177(phandle->card_type)) {
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 !=
woal_cmd52_rdwr_firmware(phandle, doneflag,
MTRUE)) {
@ -2339,8 +2342,11 @@ void woal_dump_firmware_info_v3(moal_handle *phandle)
PRINTM(MMSG, "==== DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, usec);
/* read the number of the memories which will dump */
if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE))
goto done;
woal_cmd52_rdwr_firmware(phandle, doneflag, MFALSE)) {
if (RDWR_STATUS_FAILURE ==
woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE))
goto done;
}
/** check the reg which indicate dump starting */
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);
func = 1;
reg_start = scratch_reg;
reg_end = scratch_reg + 10;
reg_end = scratch_reg + 23;
}
if (loop != 2)
ptr += snprintf(ptr, sizeof(buf),
@ -2600,6 +2606,7 @@ static void woal_sdiommc_dump_fw_info(moal_handle *phandle)
}
#endif
phandle->fw_dump = MFALSE;
woal_sdiommc_reg_dbg(phandle);
if (!phandle->priv_num)
return;
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);
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
*
*
* Copyright 2008-2022 NXP
* Copyright 2008-2023 NXP
*
* This software file (the File) is distributed by NXP
* 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);
}
#endif
if (phw->fw_cap & FW_CAPINFO_DISABLE_NAN)
handle->params.drv_mode &= ~DRV_MODE_NAN;
/** FW should only enable DFS on one mac */
if (!(phw->fw_cap & FW_CAPINFO_ZERO_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
/**
* @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
*
@ -2578,7 +2605,11 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
#ifdef PCIE
case MLAN_EVENT_ID_DRV_DEFER_RX_DATA:
status = MLAN_STATUS_SUCCESS;
#ifdef TASKLET_SUPPORT
tasklet_schedule(&handle->pcie_rx_task);
#else
queue_work(handle->pcie_rx_workqueue, &handle->pcie_rx_work);
#endif
break;
case MLAN_EVENT_ID_DRV_DEFER_RX_EVENT:
status = MLAN_STATUS_SUCCESS;
@ -2592,7 +2623,16 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
break;
case MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE:
status = MLAN_STATUS_SUCCESS;
#ifdef TASKLET_SUPPORT
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;
#endif /* PCIE */
@ -2604,7 +2644,11 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
}
#ifdef PCIE
if (IS_PCIE(handle->card_type)) {
#ifdef TASKLET_SUPPORT
tasklet_kill(&handle->pcie_rx_task);
#else
flush_workqueue(handle->pcie_rx_workqueue);
#endif
break;
}
#endif
@ -2628,7 +2672,12 @@ static mlan_status wlan_process_defer_event(moal_handle *handle,
}
#ifdef PCIE
if (IS_PCIE(handle->card_type)) {
#ifdef TASKLET_SUPPORT
tasklet_schedule(&handle->pcie_rx_task);
#else
queue_work(handle->pcie_rx_workqueue,
&handle->pcie_rx_work);
#endif
break;
}
#endif
@ -2663,6 +2712,13 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
#if defined(STA_SUPPORT) || defined(UAP_SUPPORT)
moal_private *pmpriv = NULL;
#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_SUPPORT) || defined(UAP_WEXT)
#if defined(UAP_SUPPORT) || defined(STA_WEXT)
@ -3705,12 +3761,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
break;
PRINTM(MMSG, "OLD BW = %d NEW BW = %d", priv->bandwidth,
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->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",
reason_code);
/** BIT 14 indicate deauth is initiated by FW */
if (reason_code & MBIT(14))
woal_host_mlme_disconnect(
priv, 0,
pmevent->event_buf + 2);
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(
priv, 0,
pmevent->event_buf + 2);
}
} else
#endif
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 (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) {
#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->mgmt_subtype_mask) {
/* 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,
pmevent->event_len);
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:
PRINTM(MINFO, "Assoc result\n");
@ -4700,6 +4834,10 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent)
custom_len + csi_len);
priv->csi_seq++;
break;
case MLAN_EVENT_ID_DRV_RGPWR_KEY_MISMATCH:
if (handle->sec_rgpower)
woal_rgpower_key_mismatch_event(priv);
break;
default:
break;
}

View file

@ -462,9 +462,12 @@ static const struct ieee80211_txrx_stypes
ieee80211_mgmt_stypes[NUM_NL80211_IFTYPES] = {
[NL80211_IFTYPE_STATION] = {
.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) |
MBIT(IEEE80211_STYPE_PROBE_REQ >> 4),
MBIT(IEEE80211_STYPE_PROBE_REQ >> 4)|
MBIT(IEEE80211_STYPE_AUTH >> 4),
},
[NL80211_IFTYPE_AP] = {
.tx = 0xffff,
@ -1067,6 +1070,8 @@ static int woal_cfg80211_assoc_ies_cfg(moal_private *priv, t_u8 *ie,
pcurrent_ptr, &total_ie_len,
wait_option)) {
PRINTM(MERROR, "Fail to set GEN IE\n");
DBG_HEXDUMP(MCMD_D, "GEN IE", pcurrent_ptr,
total_ie_len);
ret = -EFAULT;
goto done;
}
@ -1246,7 +1251,7 @@ static mlan_status woal_send_domain_info_cmd_fw(moal_private *priv,
priv->phandle->country_code[1];
}
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];
for (i = 0; (i < sband->n_channels) &&
@ -2152,6 +2157,43 @@ static int woal_cfg80211_auth_scan(moal_private *priv,
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
* enable.
@ -2173,12 +2215,14 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
IEEE80211_MGMT *mgmt = NULL;
mlan_status status = MLAN_STATUS_SUCCESS;
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_u16 packet_len = 0, auth_alg;
t_u16 pkt_len;
t_u8 addr[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
int ret = 0;
t_u8 trans = 1, status_code = 0;
t_u8 *varptr = NULL;
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);
}
#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 !=
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)) {
/* Disable keys and clear all previous security settings */
PRINTM(MERROR, "Fail to clear previous keys\n");
@ -2401,19 +2423,54 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
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));
pmbuf->data_offset = MLAN_MIN_DATA_HEADER_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;
/* Add pkt_type and tx_control */
moal_memcpy_ext(priv->phandle, pmbuf->pbuf + pmbuf->data_offset,
&pkt_type, sizeof(pkt_type), sizeof(pkt_type));
moal_memcpy_ext(priv->phandle,
pmbuf->pbuf + pmbuf->data_offset + sizeof(pkt_type),
&tx_control, sizeof(tx_control), sizeof(tx_control));
moal_memcpy_ext(priv->phandle, pbuf, &pkt_type, sizeof(pkt_type),
sizeof(pkt_type));
moal_memcpy_ext(priv->phandle, pbuf + sizeof(pkt_type), &tx_control,
sizeof(tx_control), sizeof(tx_control));
mgmt = (IEEE80211_MGMT *)(pmbuf->pbuf + pmbuf->data_offset +
HEADER_SIZE + sizeof(packet_len));
mgmt = (IEEE80211_MGMT *)(pbuf + HEADER_SIZE + sizeof(packet_len));
memset(mgmt, 0, MGMT_HEADER_LEN);
/**Authentication Frame: Frame Control*/
mgmt->frame_control =
@ -2463,9 +2520,8 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
#endif
/*Add packet len*/
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), sizeof(pkt_len));
moal_memcpy_ext(priv->phandle, pbuf + HEADER_SIZE, &pkt_len,
sizeof(pkt_len), sizeof(pkt_len));
/**Authentication Frame: Authentication Alg*/
mgmt->u.auth.auth_alg = woal_cpu_to_le16(auth_alg);
@ -2481,50 +2537,74 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy,
req->ie_len, req->ie_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;
pmbuf->priority = 7;
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:", pmbuf->pbuf + pmbuf->data_offset,
pmbuf->data_len);
woal_save_auth_params(priv, req);
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);
#define MAX_AUTH_COUNTER 5
priv->auth_tx_cnt++;
if (priv->auth_tx_cnt >= MAX_AUTH_COUNTER) {
if (woal_reset_wifi(priv->phandle, priv->auth_tx_cnt,
"auth timeout") ==
MLAN_STATUS_SUCCESS) {
priv->auth_tx_cnt = 0;
}
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->buf_type = MLAN_BUF_TYPE_RAW_DATA;
pmbuf->bss_index = priv->bss_index;
pmbuf->priority = 7;
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);
#define MAX_AUTH_COUNTER 5
priv->auth_tx_cnt++;
if (priv->auth_tx_cnt >= MAX_AUTH_COUNTER) {
if (woal_reset_wifi(priv->phandle,
priv->auth_tx_cnt,
"auth timeout") ==
MLAN_STATUS_SUCCESS) {
priv->auth_tx_cnt = 0;
}
}
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);
priv->host_mlme = MFALSE;
priv->auth_flag = 0;
priv->auth_alg = 0xFFFF;
ret = -EFAULT;
PRINTM(MERROR, "Fail to send packet status=%d\n",
status);
break;
}
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);
priv->host_mlme = MFALSE;
priv->auth_flag = 0;
priv->auth_alg = 0xFFFF;
ret = -EFAULT;
PRINTM(MERROR, "Fail to send packet status=%d\n", status);
break;
}
done:
if (priv->phandle->cmd_tx_data) {
if (status != MLAN_STATUS_PENDING)
kfree(ioctl_req);
}
if (ret) {
woal_mgmt_frame_register(priv, IEEE80211_STYPE_AUTH, MFALSE);
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;
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;
@ -2881,8 +2968,7 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,
if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_assoc_ies_cfg(priv, (t_u8 *)req->ie,
req->ie_len, MOAL_IOCTL_WAIT)) {
ret = -EFAULT;
goto done;
PRINTM(MINFO, "Fail to woal_cfg80211_assoc_ies_cfg\n");
}
}
@ -3163,7 +3249,8 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
if (MLAN_STATUS_SUCCESS !=
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 */
ret = -EFAULT;
goto done;
@ -3192,8 +3279,7 @@ int woal_cfg80211_assoc(moal_private *priv, void *sme, t_u8 wait_option,
if (MLAN_STATUS_SUCCESS !=
woal_cfg80211_assoc_ies_cfg(priv, ie, ie_len,
wait_option)) {
ret = -EFAULT;
goto done;
PRINTM(MINFO, "Fail to woal_cfg80211_assoc_ies_cfg\n");
}
}
@ -3851,7 +3937,6 @@ create_custom_regdomain(moal_private *priv,
sort(&custom_reg->cfp_tbl[custom_reg->num_bg_chan],
custom_reg->num_a_chan, sizeof(chan_freq_power_t), &compare, NULL);
regd_size = sizeof(struct ieee80211_regdomain) +
num_chan * sizeof(struct ieee80211_reg_rule);
@ -4182,8 +4267,8 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
country_code[1] = request->alpha2[1];
}
if (MLAN_STATUS_SUCCESS !=
woal_request_country_power_table(priv,
country_code)) {
woal_request_country_power_table(priv, country_code,
MOAL_IOCTL_WAIT)) {
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
return -EFAULT;
#else
@ -4252,6 +4337,9 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy,
priv->phandle->band = band;
}
if (handle->params.edmac_ctrl && IS_CARD9098(priv->phandle->card_type))
woal_edmac_cfg(priv, priv->phandle->country_code);
LEAVE();
#if CFG80211_VERSION_CODE < KERNEL_VERSION(3, 9, 0)
return ret;
@ -6760,12 +6848,14 @@ int woal_cfg80211_resume(struct wiphy *wiphy)
wiphy->wowlan_config->gtk_rekey_failure)
wakeup_report.gtk_rekey_failure = true;
break;
case MGMT_FRAME_FILTER_EXT_MATCHED:
break;
default:
break;
}
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,
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;
#endif
#endif
if (bss_type == MLAN_BSS_TYPE_NAN)
wdev->iftype = NL80211_IFTYPE_STATION;
dev_net_set(dev, wiphy_net(wdev->wiphy));
dev->ieee80211_ptr = wdev;
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 */
if (wiphy->bands[IEEE80211_BAND_2GHZ]) {
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;
if (mcs_supp != 3 && mcs_supp != 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 */
if (wiphy->bands[IEEE80211_BAND_5GHZ]) {
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;
if (mcs_supp != 3 && mcs_supp != 0)
cfg_11n->param.supported_mcs_set[1] = 0;
@ -9906,7 +10000,8 @@ static mlan_status woal_cfg80211_init_wiphy(moal_private *priv,
#endif
if (IS_CARD9098(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);
}
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 ((moal_extflg_isset(priv->phandle, EXT_CFG80211_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;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0)
cfg80211_iface_comb_ap_sta.radar_detect_widths = 0;
@ -10252,6 +10348,7 @@ mlan_status woal_register_cfg80211(moal_private *priv)
#endif
wiphy->flags |= WIPHY_FLAG_4ADDR_AP;
wiphy->flags |= WIPHY_FLAG_4ADDR_STATION;
#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0)
wiphy->features |= NL80211_FEATURE_NEED_OBSS_SCAN;
#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 (IS_CARD9098(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(
priv->phandle->params.cfg80211_wext))
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,
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 (he_cfg.he_cap.len &&
(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();
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;
PRINTM(MMSG, "wlan: Stoping AP\n");
#ifdef STA_SUPPORT
@ -3042,7 +3047,6 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev)
}
}
#endif
priv->cipher = 0;
memset(priv->uap_wep_key, 0, sizeof(priv->uap_wep_key));
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.chanNum = (t_u8)chandef->chan->hw_value;
chan_rpt_req.bandcfg.chanBand = BAND_5GHZ;
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;
}
woal_convert_chan_to_bandconfig(priv, &chan_rpt_req.bandcfg, chandef);
chan_rpt_req.millisec_dwell_time = cac_time_ms;
chan_rpt_req.host_based = MTRUE;
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);
moal_handle *handle = NULL;
mlan_ds_ps_info pm_info;
int i;
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);
}
#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 */
woal_enable_hs(woal_get_priv(handle, MLAN_BSS_ROLE_ANY));