diff --git a/mxm_wifiex/wlan_src/Makefile b/mxm_wifiex/wlan_src/Makefile index 74d9904..1cd2774 100644 --- a/mxm_wifiex/wlan_src/Makefile +++ b/mxm_wifiex/wlan_src/Makefile @@ -1,6 +1,6 @@ # File: Makefile # -# 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 @@ -20,8 +20,6 @@ CONFIG_COMPATDIR=n ifeq ($(CONFIG_COMPATDIR), y) COMPATDIR=/lib/modules/$(KERNELVERSION_X86)/build/compat-wireless-3.2-rc1-1/include CC ?= $(CROSS_COMPILE)gcc -I$(COMPATDIR) -else -CC ?= $(CROSS_COMPILE)gcc -I$(COMPATDIR) endif LD ?= $(CROSS_COMPILE)ld @@ -54,10 +52,10 @@ CONFIG_PCIE9097=n CONFIG_SD9098=y CONFIG_USB9098=n CONFIG_PCIE9098=y -CONFIG_SDIW62X=n +CONFIG_SDIW624=n CONFIG_SDAW693=n -CONFIG_PCIEIW62X=n -CONFIG_USBIW62X=n +CONFIG_PCIEIW624=n +CONFIG_USBIW624=n CONFIG_PCIEAW693=n @@ -92,23 +90,8 @@ CONFIG_OPENWRT_SUPPORT=n # Big-endian platform CONFIG_BIG_ENDIAN=n -#ifdef EMBEDDED_AUTH -# Enable driver based authenticator -CONFIG_DRV_EMBEDDED_AUTHENTICATOR=n -#endif -#ifdef EMBEDDED_SUPP -# Enable driver based supplicant -CONFIG_DRV_EMBEDDED_SUPPLICANT=n -#endif -ifeq ($(CONFIG_DRV_EMBEDDED_SUPPLICANT), y) -CONFIG_EMBEDDED_SUPP_AUTH=y -else -ifeq ($(CONFIG_DRV_EMBEDDED_AUTHENTICATOR), y) -CONFIG_EMBEDDED_SUPP_AUTH=y -endif -endif #ifdef SDIO_MMC # SDIO suspend/resume @@ -123,6 +106,8 @@ CONFIG_MULTI_CHAN_SUPPORT=y +CONFIG_DUMP_TO_PROC=y + #32bit app over 64bit kernel support CONFIG_USERSPACE_32BIT_OVER_KERNEL_64BIT=n @@ -139,12 +124,6 @@ ccflags-y += -DLINUX KERNELDIR ?= $(KERNEL_SRC) -#if defined(EMBEDDED_SUPP) || defined(EMBEDDED_AUTH) -ifeq ($(CONFIG_EMBEDDED_SUPP_AUTH), y) -ccflags-y += -I$(M)/mlan/esa -ccflags-y += -I$(M)/mlan/esa/common -endif -#endif @@ -158,8 +137,6 @@ ccflags-y += -Wno-implicit-fallthrough CONFIG_ANDROID_KERNEL=y endif endif -KERNELDIR ?= /usr/src/arm/linux_5_10_y_kernel/linux-nxp -CROSS_COMPILE ?= /opt/fsl-imx-internal-xwayland/5.10-gatesgarth/sysroots/x86_64-pokysdk-linux/usr/bin/aarch64-poky-linux/aarch64-poky-linux- LD += -S @@ -240,6 +217,11 @@ endif ifeq ($(CONFIG_ANDROID_KERNEL), y) ccflags-y += -DANDROID_KERNEL + CONFIG_DUMP_TO_PROC=y +endif + +ifeq ($(CONFIG_DUMP_TO_PROC), y) + ccflags-y += -DDUMP_TO_PROC endif ifeq ($(CONFIG_OPENWRT_SUPPORT), y) @@ -280,9 +262,9 @@ ifeq ($(CONFIG_SD9097),y) CONFIG_SDIO=y ccflags-y += -DSD9097 endif -ifeq ($(CONFIG_SDIW62X),y) +ifeq ($(CONFIG_SDIW624),y) CONFIG_SDIO=y - ccflags-y += -DSDIW62X + ccflags-y += -DSDIW624 endif ifeq ($(CONFIG_SDAW693),y) CONFIG_SDIO=y @@ -320,9 +302,9 @@ ifeq ($(CONFIG_USB9097),y) CONFIG_MUSB=y ccflags-y += -DUSB9097 endif -ifeq ($(CONFIG_USBIW62X),y) +ifeq ($(CONFIG_USBIW624),y) CONFIG_MUSB=y - ccflags-y += -DUSBIW62X + ccflags-y += -DUSBIW624 endif ifeq ($(CONFIG_USB9098),y) CONFIG_MUSB=y @@ -344,9 +326,9 @@ ifeq ($(CONFIG_PCIE9098),y) CONFIG_PCIE=y ccflags-y += -DPCIE9098 endif -ifeq ($(CONFIG_PCIEIW62X),y) +ifeq ($(CONFIG_PCIEIW624),y) CONFIG_PCIE=y - ccflags-y += -DPCIEIW62X + ccflags-y += -DPCIEIW624 endif #ifdef PCIEAW693_OPT ifeq ($(CONFIG_PCIEAW693),y) @@ -513,17 +495,7 @@ endif endif -#ifdef EMBEDDED_AUTH -ifeq ($(CONFIG_DRV_EMBEDDED_AUTHENTICATOR), y) - ccflags-y += -DDRV_EMBEDDED_AUTHENTICATOR -endif -#endif -#ifdef EMBEDDED_SUPP -ifeq ($(CONFIG_DRV_EMBEDDED_SUPPLICANT), y) - ccflags-y += -DDRV_EMBEDDED_SUPPLICANT -endif -#endif MOALOBJS = mlinux/moal_main.o \ mlinux/moal_ioctl.o \ @@ -602,37 +574,9 @@ endif -#if defined(EMBEDDED_SUPP) || defined(EMBEDDED_AUTH) -ifeq ($(CONFIG_EMBEDDED_SUPP_AUTH), y) -MLANOBJS += mlan/esa/common/crypto_api.o \ - mlan/esa/common/aes_cmac_rom.o \ - mlan/esa/common/crypt_new_rom.o \ - mlan/esa/common/pmkCache.o \ - mlan/esa/common/pmkCache_rom.o \ - mlan/esa/common/parser.o \ - mlan/esa/common/parser_rom.o \ - mlan/esa/keyMgmtApStaCommon.o \ - mlan/esa/hostsa_init.o \ - mlan/esa/authenticator_api.o -endif -#endif -#ifdef EMBEDDED_SUPP -ifeq ($(CONFIG_DRV_EMBEDDED_SUPPLICANT),y) -MLANOBJS += mlan/esa/keyMgmtSta.o \ - mlan/esa/keyMgmtSta_rom.o \ - mlan/esa/supplicant.o -endif -#endif -#ifdef EMBEDDED_AUTH -ifeq ($(CONFIG_DRV_EMBEDDED_AUTHENTICATOR),y) -MLANOBJS += mlan/esa/AssocAp_srv_rom.o \ - mlan/esa/keyMgmtAp_rom.o \ - mlan/esa/keyMgmtAp.o -endif -#endif obj-m := mlan.o mlan-objs := $(MLANOBJS) diff --git a/mxm_wifiex/wlan_src/README b/mxm_wifiex/wlan_src/README index 08ca659..df7ead3 100755 --- a/mxm_wifiex/wlan_src/README +++ b/mxm_wifiex/wlan_src/README @@ -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.0.0. + The driver code supports Linux kernel from 2.6.32 to 6.3.0. 2) FOR DRIVER INSTALL @@ -662,6 +662,7 @@ #if defined(STA_CFG80211) || defined(UAP_CFG80211) host_mlme=0|1 for supplicant/authenticator running on host side, WPA3 support is available only in host_mlme mode + for chipset 89xx FP-92, 90xx and later, host_mlme restricted to 1 #endif #endif #if defined(STA_CFG80211) || defined(UAP_CFG80211) diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11ac.c b/mxm_wifiex/wlan_src/mlan/mlan_11ac.c index 298629c..ae3fb6b 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11ac.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11ac.c @@ -295,7 +295,7 @@ 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 (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (cfg->param.vht_cfg.band == BAND_SELECT_A) { rx_nss = GET_RXMCSSUPP( @@ -789,7 +789,7 @@ void wlan_fill_vht_cap_tlv(mlan_private *priv, MrvlIETypes_VHTCap_t *pvht_cap, mcs_map_resp = wlan_le16_to_cpu(pvht_cap->vht_cap.mcs_sets.rx_mcs_map); if (IS_CARD9098(priv->adapter->card_type) || - IS_CARDIW62X(priv->adapter->card_type) || + IS_CARDIW624(priv->adapter->card_type) || IS_CARD9097(priv->adapter->card_type)) { if (bands & BAND_A) { rx_nss = GET_RXMCSSUPP(priv->adapter->user_htstream >> @@ -1060,7 +1060,7 @@ t_u8 wlan_is_80_80_support(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc) ENTER(); if (!IS_CARD9098(pmpriv->adapter->card_type) && - !IS_CARDIW62X(pmpriv->adapter->card_type) && + !IS_CARDIW624(pmpriv->adapter->card_type) && !IS_CARD9097(pmpriv->adapter->card_type)) return ret; /** check band A */ @@ -1179,7 +1179,7 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, /** set default bandwidth:80M*/ SET_OPER_MODE_80M(pmrvl_oper_mode->oper_mode); if (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (pbss_desc->bss_band & BAND_A) rx_nss = GET_RXMCSSUPP( @@ -1193,7 +1193,7 @@ int wlan_cmd_append_11ac_tlv(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, nss = wlan_get_nss_num_vht_mcs(mcs_map_user); if (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { PRINTM(MCMND, "rx_nss=%d nss=%d\n", rx_nss, nss); nss = MIN(rx_nss, nss); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11ax.c b/mxm_wifiex/wlan_src/mlan/mlan_11ax.c index 4599535..5e88d0d 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11ax.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11ax.c @@ -426,7 +426,7 @@ 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 (IS_CARD9098(pmpriv->adapter->card_type) || - IS_CARDIW62X(pmpriv->adapter->card_type) || + IS_CARDIW624(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type)) { if (pbss_desc->bss_band & band_selected) { rx_nss = GET_RXMCSSUPP(pmpriv->adapter->user_htstream >> @@ -892,6 +892,10 @@ mlan_status wlan_cmd_11ax_cmd(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, (mlan_ds_11ax_txomi_cmd *)&ds_11ax_cmd->param; mlan_ds_11ax_toltime_cmd *toltime_cmd = (mlan_ds_11ax_toltime_cmd *)&ds_11ax_cmd->param; + mlan_ds_11ax_set_bsrp_cmd *set_bsrp_cmd = + (mlan_ds_11ax_set_bsrp_cmd *)&ds_11ax_cmd->param; + mlan_ds_11ax_llde_cmd *llde_cmd = + (mlan_ds_11ax_llde_cmd *)&ds_11ax_cmd->param; MrvlIEtypes_Data_t *tlv = MNULL; ENTER(); @@ -934,6 +938,16 @@ mlan_status wlan_cmd_11ax_cmd(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, sizeof(t_u32), sizeof(t_u32)); cmd->size += sizeof(t_u32); break; + case MLAN_11AXCMD_SET_BSRP_SUBID: + axcmd->val[0] = set_bsrp_cmd->value; + cmd->size += sizeof(t_u8); + break; + case MLAN_11AXCMD_LLDE_SUBID: + memcpy_ext(pmadapter, axcmd->val, &llde_cmd->llde, + sizeof(mlan_ds_11ax_llde_cmd), + sizeof(mlan_ds_11ax_llde_cmd)); + cmd->size += sizeof(mlan_ds_11ax_llde_cmd); + break; default: PRINTM(MERROR, "Unknown subcmd %x\n", ds_11ax_cmd->sub_id); break; @@ -1010,6 +1024,14 @@ mlan_status wlan_ret_11ax_cmd(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, memcpy_ext(pmadapter, &cfg->param.toltime_cfg.tol_time, axcmd->val, sizeof(t_u32), sizeof(t_u32)); break; + case MLAN_11AXCMD_SET_BSRP_SUBID: + cfg->param.setbsrp_cfg.value = *axcmd->val; + break; + case MLAN_11AXCMD_LLDE_SUBID: + memcpy_ext(pmadapter, &cfg->param.llde_cfg.llde, axcmd->val, + sizeof(mlan_ds_11ax_llde_cmd), + sizeof(mlan_ds_11ax_llde_cmd)); + break; default: PRINTM(MERROR, "Unknown subcmd %x\n", axcmd->sub_id); break; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11h.c b/mxm_wifiex/wlan_src/mlan/mlan_11h.c index f5d8ea6..7453dd9 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11h.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11h.c @@ -286,6 +286,31 @@ t_void wlan_11h_set_chan_dfs_state(mlan_private *priv, t_u8 chan, t_u8 bw, wlan_set_chan_dfs_state(priv, BAND_A, chan_list[i], dfs_state); } +/** + * @brief reset dfs_checking_chan's dfs state + * + * @param priv Private driver information structure + * @param dfs_state dfs state + * + * @return N/A + */ +t_void wlan_11h_reset_dfs_checking_chan_dfs_state(mlan_private *priv, + dfs_state_t dfs_state) +{ + wlan_dfs_device_state_t *pstate_dfs = &priv->adapter->state_dfs; + dfs_state_t state; + ENTER(); + if (pstate_dfs->dfs_check_channel) { + state = wlan_get_chan_dfs_state(priv, BAND_A, + pstate_dfs->dfs_check_channel); + if (state == DFS_AVAILABLE) + wlan_11h_set_chan_dfs_state( + priv, pstate_dfs->dfs_check_channel, + pstate_dfs->dfs_check_bandwidth, dfs_state); + } + LEAVE(); +} + #ifdef STA_SUPPORT /** * @brief Setup the IBSS DFS element passed to the firmware in adhoc start @@ -3814,7 +3839,8 @@ void wlan_dfs_rep_disconnect(mlan_adapter *pmadapter) if (wlan_11h_radar_detect_required(pmpriv, pmadapter->dfsr_channel)) { mlan_status ret = MLAN_STATUS_SUCCESS; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_BSS_STOP, + ret = wlan_prepare_cmd(pmpriv, + HostCmd_CMD_APCMD_BSS_STOP, HostCmd_ACT_GEN_SET, 0, MNULL, MNULL); if (ret) { @@ -3863,7 +3889,8 @@ void wlan_dfs_rep_bw_change(mlan_adapter *pmadapter) pmpriv, pmadapter->dfsr_channel)) return; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_BSS_STOP, + ret = wlan_prepare_cmd(pmpriv, + HostCmd_CMD_APCMD_BSS_STOP, HostCmd_ACT_GEN_SET, 0, MNULL, MNULL); if (ret) { @@ -3877,7 +3904,8 @@ void wlan_dfs_rep_bw_change(mlan_adapter *pmadapter) pmpriv = priv_list[i]; if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP) { - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_BSS_START, + ret = wlan_prepare_cmd(pmpriv, + HostCmd_CMD_APCMD_BSS_START, HostCmd_ACT_GEN_SET, 0, MNULL, MNULL); if (ret) { @@ -4174,10 +4202,9 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter, __func__); #ifdef UAP_SUPPORT if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP) { - ret = wlan_prepare_cmd(pmpriv, - HOST_CMD_APCMD_BSS_STOP, - HostCmd_ACT_GEN_SET, 0, - MNULL, MNULL); + ret = wlan_prepare_cmd( + pmpriv, HostCmd_CMD_APCMD_BSS_STOP, + HostCmd_ACT_GEN_SET, 0, MNULL, MNULL); PRINTM(MERROR, "STOP UAP and exit radar handling...\n"); pstate_rdh->stage = RDH_OFF; @@ -4410,10 +4437,9 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter, pstate_rdh->priv_list[pstate_rdh->priv_curr_idx]; #ifdef UAP_SUPPORT if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP) { - ret = wlan_prepare_cmd(pmpriv, - HOST_CMD_APCMD_BSS_STOP, - HostCmd_ACT_GEN_SET, 0, - MNULL, MNULL); + ret = wlan_prepare_cmd( + pmpriv, HostCmd_CMD_APCMD_BSS_STOP, + HostCmd_ACT_GEN_SET, 0, MNULL, MNULL); break; /* leads to exit case */ } #endif @@ -4519,10 +4545,9 @@ mlan_status wlan_11h_radar_detected_handling(mlan_adapter *pmadapter, ret = wlan_11h_check_update_radar_det_state( pmpriv); } - ret = wlan_prepare_cmd(pmpriv, - HOST_CMD_APCMD_BSS_START, - HostCmd_ACT_GEN_SET, 0, - MNULL, MNULL); + ret = wlan_prepare_cmd( + pmpriv, HostCmd_CMD_APCMD_BSS_START, + HostCmd_ACT_GEN_SET, 0, MNULL, MNULL); break; /* leads to exit case */ } #endif diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11h.h b/mxm_wifiex/wlan_src/mlan/mlan_11h.h index 4d0f563..21ea742 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11h.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_11h.h @@ -169,6 +169,8 @@ extern mlan_status wlan_11h_ioctl_chan_switch_count(pmlan_adapter pmadapter, /** get/set channel dfs state */ mlan_status wlan_11h_ioctl_chan_dfs_state(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); +t_void wlan_11h_reset_dfs_checking_chan_dfs_state(mlan_private *priv, + dfs_state_t dfs_state); /** get/set dfs w53 cfg */ mlan_status wlan_11h_ioctl_dfs_w53_cfg(pmlan_adapter pmadapter, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n.c b/mxm_wifiex/wlan_src/mlan/mlan_11n.c index ce5e49b..a50540a 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n.c @@ -398,6 +398,7 @@ void wlan_11n_send_delba_to_peer(mlan_private *priv, t_u8 *ra) MLAN_MAC_ADDR_LENGTH)) { PRINTM(MIOCTL, "Tx:Send delba to tid=%d, " MACSTR "\n", ptx_tbl->tid, MAC2STR(ptx_tbl->ra)); + ptx_tbl->ba_status = BA_STREAM_SENT_DELBA; wlan_send_delba(priv, MNULL, ptx_tbl->tid, ptx_tbl->ra, 1); } @@ -469,6 +470,7 @@ static void wlan_11n_update_addba_request(mlan_private *priv) } while (ptx_tbl != (TxBAStreamTbl *)&priv->tx_ba_stream_tbl_ptr) { + ptx_tbl->ba_status = BA_STREAM_SETUP_SENT_ADDBA; wlan_send_addba(priv, ptx_tbl->tid, ptx_tbl->ra); ptx_tbl = ptx_tbl->pnext; } @@ -759,6 +761,8 @@ static mlan_status wlan_send_delba_to_entry_in_txbastream_tbl( !memcmp(pmadapter, peer_address, tx_ba_stream_tbl_ptr->ra, MLAN_MAC_ADDR_LENGTH))) { + tx_ba_stream_tbl_ptr->ba_status = + BA_STREAM_SENT_DELBA; if (last_tx_ba_to_delete && (tx_ba_stream_tbl_ptr == last_tx_ba_to_delete)) @@ -1022,6 +1026,8 @@ static void wlan_send_delba_txbastream_tbl(pmlan_private priv, t_u8 tid) PRINTM(MIOCTL, "Tx:Send delba to tid=%d, " MACSTR "\n", tid, MAC2STR(tx_ba_stream_tbl_ptr->ra)); + tx_ba_stream_tbl_ptr->ba_status = + BA_STREAM_SENT_DELBA; wlan_release_ralist_lock(priv); wlan_send_delba(priv, MNULL, tx_ba_stream_tbl_ptr->tid, @@ -1531,7 +1537,7 @@ void wlan_fill_ht_cap_tlv(mlan_private *priv, MrvlIETypes_HTCap_t *pht_cap, rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support); if (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (bands & BAND_A) rx_mcs_supp = MIN( @@ -1604,7 +1610,7 @@ void wlan_fill_ht_cap_ie(mlan_private *priv, IEEEtypes_HTCap_t *pht_cap, rx_mcs_supp = GET_RXMCSSUPP(priv->usr_dev_mcs_support); if (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { if (bands & BAND_A) rx_mcs_supp = MIN( @@ -1754,8 +1760,12 @@ mlan_status wlan_ret_11n_delba(mlan_private *priv, HostCmd_DS_COMMAND *resp) ptx_ba_tbl = wlan_11n_get_txbastream_status( priv, BA_STREAM_SETUP_INPROGRESS); wlan_release_ralist_lock(priv); - if (ptx_ba_tbl) + if (ptx_ba_tbl) { + /* mark this txba stream as waiting addba resp, in case + * we send duplicate addba req command */ + ptx_ba_tbl->ba_status = BA_STREAM_SETUP_SENT_ADDBA; wlan_send_addba(priv, ptx_ba_tbl->tid, ptx_ba_tbl->ra); + } } else { /* * In case of failure, recreate * the deleted stream in case @@ -1763,11 +1773,11 @@ mlan_status wlan_ret_11n_delba(mlan_private *priv, HostCmd_DS_COMMAND *resp) */ if (INITIATOR_BIT(pdel_ba->del_ba_param_set)) { wlan_request_ralist_lock(priv); - if (!wlan_11n_get_txbastream_tbl( - priv, tid, pdel_ba->peer_mac_addr, MFALSE)) - wlan_11n_create_txbastream_tbl( - priv, pdel_ba->peer_mac_addr, tid, - BA_STREAM_SETUP_INPROGRESS); + wlan_11n_set_txbastream_status(priv, tid, + pdel_ba->peer_mac_addr, + BA_STREAM_SETUP_COMPLETE, + MFALSE); + ptx_ba_tbl = wlan_11n_get_txbastream_status( priv, BA_STREAM_SETUP_INPROGRESS); wlan_release_ralist_lock(priv); @@ -1866,12 +1876,27 @@ mlan_status wlan_ret_11n_addba_req(mlan_private *priv, HostCmd_DS_COMMAND *resp) BA_STREAM_NOT_ALLOWED; } else { + t_u8 event_buf[256]; + mlan_event *pevent = (mlan_event *)event_buf; + addba_timeout_event *evtbuf = + (addba_timeout_event *)pevent->event_buf; if (ra_list) { ra_list->packet_count = 0; ra_list->ba_packet_threshold = wlan_get_random_ba_threshold( priv->adapter); } + memset(priv->adapter, event_buf, 0x00, + sizeof(event_buf)); + pevent->bss_index = priv->bss_index; + pevent->event_id = MLAN_EVENT_ID_DRV_ADDBA_TIMEOUT; + pevent->event_len = sizeof(addba_timeout_event); + memcpy_ext(priv->adapter, evtbuf->peer_mac_addr, + padd_ba_rsp->peer_mac_addr, + MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + evtbuf->tid = tid; + wlan_recv_event(priv, MLAN_EVENT_ID_DRV_ADDBA_TIMEOUT, + pevent); } } @@ -2870,6 +2895,58 @@ TxBAStreamTbl *wlan_11n_get_txbastream_tbl(mlan_private *priv, int tid, return MNULL; } +/** + * @brief This function will set ba_status txbastream entry with + * given RA/TID. + * + * @param priv A pointer to mlan_private + * @param ra RA to find in txbastream + * @param tid TID to find in txbastream + * @param ba_status BA stream status + * + * @return N/A + */ +void wlan_11n_set_txbastream_status(mlan_private *priv, int tid, t_u8 *ra, + baStatus_e ba_status, int lock) +{ + TxBAStreamTbl *ptx_tbl; + pmlan_adapter pmadapter = priv->adapter; + + ENTER(); + + if (lock) + wlan_request_ralist_lock(priv); + ptx_tbl = (TxBAStreamTbl *)util_peek_list(pmadapter->pmoal_handle, + &priv->tx_ba_stream_tbl_ptr, + MNULL, MNULL); + if (!ptx_tbl) { + if (lock) + wlan_release_ralist_lock(priv); + LEAVE(); + return; + } + + while (ptx_tbl != (TxBAStreamTbl *)&priv->tx_ba_stream_tbl_ptr) { + PRINTM(MDAT_D, "get_txbastream_tbl TID %d\n", ptx_tbl->tid); + DBG_HEXDUMP(MDAT_D, "RA", ptx_tbl->ra, MLAN_MAC_ADDR_LENGTH); + + if ((!memcmp(pmadapter, ptx_tbl->ra, ra, + MLAN_MAC_ADDR_LENGTH)) && + (ptx_tbl->tid == tid)) { + ptx_tbl->ba_status = ba_status; + if (lock) + wlan_release_ralist_lock(priv); + LEAVE(); + return; + } + ptx_tbl = ptx_tbl->pnext; + } + if (lock) + wlan_release_ralist_lock(priv); + LEAVE(); + return; +} + /** * @brief This function will create a entry in tx ba stream table for the * given RA/TID. @@ -2939,8 +3016,8 @@ int wlan_send_addba(mlan_private *priv, int tid, t_u8 *peer_mac) ENTER(); - PRINTM(MCMND, "Send addba: TID %d\n", tid); - DBG_HEXDUMP(MCMD_D, "Send addba RA", peer_mac, MLAN_MAC_ADDR_LENGTH); + PRINTM(MCMND, "Send addba: TID %d, " MACSTR "\n", tid, + MAC2STR(peer_mac)); add_ba_req.block_ack_param_set = (t_u16)( (tid << BLOCKACKPARAM_TID_POS) | @@ -2988,6 +3065,9 @@ int wlan_send_delba(mlan_private *priv, pmlan_ioctl_req pioctl_req, int tid, ENTER(); + PRINTM(MCMND, "Send delba: TID %d initiator=%d, " MACSTR "\n", tid, + initiator, MAC2STR(peer_mac)); + memset(priv->adapter, &delba, 0, sizeof(delba)); delba.del_ba_param_set = (tid << DELBA_TID_POS); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n.h b/mxm_wifiex/wlan_src/mlan/mlan_11n.h index 0a2a990..58427b3 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n.h @@ -87,6 +87,10 @@ void wlan_11n_deleteall_txbastream_tbl(mlan_private *priv); /** Get Tx BA stream table */ TxBAStreamTbl *wlan_11n_get_txbastream_tbl(mlan_private *priv, int tid, t_u8 *ra, int lock); +/** Set Tx BA stream table BA status */ +void wlan_11n_set_txbastream_status(mlan_private *priv, int tid, t_u8 *ra, + baStatus_e ba_status, int lock); + /** Create Tx BA stream table */ void wlan_11n_create_txbastream_tbl(mlan_private *priv, t_u8 *ra, int tid, baStatus_e ba_status); @@ -376,14 +380,14 @@ static INLINE t_u8 wlan_find_stream_to_delete(mlan_private *priv, tid = priv->aggr_prio_tbl[ptr_tid].ampdu_user; while (ptx_tbl != (TxBAStreamTbl *)&priv->tx_ba_stream_tbl_ptr) { - if (tid > priv->aggr_prio_tbl[ptx_tbl->tid].ampdu_user) { + if ((ptx_tbl->ba_status == BA_STREAM_SETUP_COMPLETE) && + (tid > priv->aggr_prio_tbl[ptx_tbl->tid].ampdu_user)) { tid = priv->aggr_prio_tbl[ptx_tbl->tid].ampdu_user; *ptid = ptx_tbl->tid; memcpy_ext(priv->adapter, ra, ptx_tbl->ra, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); ret = MTRUE; } - ptx_tbl = ptx_tbl->pnext; } LEAVE(); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c b/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c index 023700e..4cab89c 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.c @@ -134,14 +134,13 @@ static mlan_status wlan_11n_dispatch_pkt(t_void *priv, t_void *payload, static void mlan_11n_rxreorder_timer_restart(pmlan_adapter pmadapter, RxReorderTbl *rx_reor_tbl_ptr) { - t_u16 min_flush_time = DEF_FLUSH_TIME_AC_BE_BK; + t_u16 min_flush_time = pmadapter->flush_time_ac_be_bk; mlan_wmm_ac_e wmm_ac; ENTER(); wmm_ac = wlan_wmm_convert_tos_to_ac(pmadapter, rx_reor_tbl_ptr->tid); - if ((WMM_AC_VI == wmm_ac) || (WMM_AC_VO == wmm_ac)) { - min_flush_time = DEF_FLUSH_TIME_AC_VI_VO; - } + if ((WMM_AC_VI == wmm_ac) || (WMM_AC_VO == wmm_ac)) + min_flush_time = pmadapter->flush_time_ac_vi_vo; if (rx_reor_tbl_ptr->timer_context.timer_is_set) pmadapter->callbacks.moal_stop_timer( @@ -631,6 +630,54 @@ static t_u8 wlan_is_addba_reject(mlan_private *priv, t_u8 tid) #endif return priv->addba_reject[tid]; } + +/** + * @brief This function handles the command response of + * delete a block ack request + * + * @param priv A pointer to mlan_private structure + * @param addba A pointer to addba buffer + * + * @return N/A + */ +mlan_status wlan_11n_add_bastream(mlan_private *priv, t_u8 *addba) +{ + HostCmd_DS_11N_ADDBA_REQ *pevt_addba_req = + (HostCmd_DS_11N_ADDBA_REQ *)addba; + RxReorderTbl *rx_reor_tbl_ptr = MNULL; + t_u16 block_ack_param_set; + mlan_status ret = MLAN_STATUS_SUCCESS; + int tid; + + ENTER(); + + DBG_HEXDUMP(MCMD_D, "addba req", (t_u8 *)addba, + sizeof(HostCmd_DS_11N_ADDBA_REQ)); + if (priv->adapter->scan_processing) { + PRINTM(MERROR, + "Scan in progress, ignore ADDBA Request event\n"); + LEAVE(); + return ret; + } + block_ack_param_set = + wlan_le16_to_cpu(pevt_addba_req->block_ack_param_set); + tid = (block_ack_param_set & BLOCKACKPARAM_TID_MASK) >> + BLOCKACKPARAM_TID_POS; + rx_reor_tbl_ptr = wlan_11n_get_rxreorder_tbl( + priv, tid, pevt_addba_req->peer_mac_addr); + if (rx_reor_tbl_ptr && + (rx_reor_tbl_ptr->ba_status != BA_STREAM_SETUP_COMPLETE)) { + PRINTM(MCMND, + "BA setup in progress, ignore ADDBA Request event\n"); + LEAVE(); + return ret; + } + ret = wlan_prepare_cmd(priv, HostCmd_CMD_11N_ADDBA_RSP, + HostCmd_ACT_GEN_SET, 0, MNULL, addba); + LEAVE(); + return ret; +} + /** * @brief This function prepares command for adding a block ack * response. @@ -807,6 +854,11 @@ mlan_status mlan_11n_rxreorder_pkt(void *priv, t_u16 seq_num, t_u16 tid, PRINTM(MDAT_D, "AMSDU "); if (rx_reor_tbl_ptr->check_start_win) { + PRINTM(MDAT_D, + "0:seq_num %d start_win %d win_size %d last_seq %d\n", + seq_num, rx_reor_tbl_ptr->start_win, + rx_reor_tbl_ptr->win_size, + rx_reor_tbl_ptr->last_seq); if (seq_num == rx_reor_tbl_ptr->start_win) rx_reor_tbl_ptr->check_start_win = MFALSE; else { @@ -1055,7 +1107,7 @@ void mlan_11n_delete_bastream_tbl(mlan_private *priv, int tid, t_u8 *peer_mac, cleanup_rx_reorder_tbl = (initiator) ? MFALSE : MTRUE; PRINTM(MEVENT, - "delete_bastream_tbl: " MACSTR " tid=%d, type=%d" + "delete_bastream_tbl: " MACSTR " tid=%d, type=%d " "initiator=%d reason=%d\n", MAC2STR(peer_mac), tid, type, initiator, reason_code); @@ -1090,14 +1142,13 @@ void mlan_11n_delete_bastream_tbl(mlan_private *priv, int tid, t_u8 *peer_mac, ra_list->del_ba_count = 0; else ra_list->del_ba_count++; - ra_list->packet_count = 0; + } + ra_list->packet_count = 0; /** after delba, we will try to set up BA again after sending 1k packets*/ #define MIN_BA_SETUP_PACKET_REQIRED 1024 - ra_list->ba_packet_threshold = - MIN_BA_SETUP_PACKET_REQIRED + - wlan_get_random_ba_threshold( - priv->adapter); - } + ra_list->ba_packet_threshold = + MIN_BA_SETUP_PACKET_REQIRED + + wlan_get_random_ba_threshold(priv->adapter); } } @@ -1190,6 +1241,13 @@ void wlan_11n_ba_stream_timeout(mlan_private *priv, DBG_HEXDUMP(MCMD_D, "Event:", (t_u8 *)event, 20); + if (event->origninator && + !wlan_11n_get_txbastream_tbl(priv, event->tid, event->peer_mac_addr, + MFALSE)) { + LEAVE(); + return; + } + memset(priv->adapter, &delba, 0, sizeof(HostCmd_DS_11N_DELBA)); memcpy_ext(priv->adapter, delba.peer_mac_addr, event->peer_mac_addr, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.h b/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.h index d409e85..76289d7 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_11n_rxreorder.h @@ -82,6 +82,7 @@ mlan_status mlan_11n_rxreorder_pkt(void *priv, t_u16 seqNum, t_u16 tid, void mlan_11n_delete_bastream_tbl(mlan_private *priv, int tid, t_u8 *PeerMACAddr, t_u8 type, int initiator, t_u16 reason_code); +mlan_status wlan_11n_add_bastream(mlan_private *priv, t_u8 *addba); void wlan_11n_ba_stream_timeout(mlan_private *priv, HostCmd_DS_11N_BATIMEOUT *event); mlan_status wlan_ret_11n_addba_resp(mlan_private *priv, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_cfp.c b/mxm_wifiex/wlan_src/mlan/mlan_cfp.c index e9be852..d4ff63a 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_cfp.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_cfp.c @@ -398,6 +398,7 @@ static chan_freq_power_t channel_freq_power_EU_A[] = { {132, 5660, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE, {0x13, 0, 0}}, {136, 5680, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE, {0x13, 0, 0}}, {140, 5700, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE, {0x13, 0, 0}}, + {144, 5720, WLAN_TX_PWR_EMEA_DEFAULT, MTRUE, {0x13, 0, 0}}, {149, 5745, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE, {0x10, 0, 0}}, {153, 5765, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE, {0x10, 0, 0}}, {157, 5785, WLAN_TX_PWR_EMEA_DEFAULT, MFALSE, {0x10, 0, 0}}, @@ -579,10 +580,10 @@ static chan_freq_power_t channel_freq_power_low_middle_high_band[] = { {40, 5200, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, {44, 5220, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, {48, 5240, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, - {52, 5260, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, - {56, 5280, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, - {60, 5300, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, - {64, 5320, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, + {52, 5260, WLAN_TX_PWR_DEFAULT, MTRUE, {0x10, 0, 0}}, + {56, 5280, WLAN_TX_PWR_DEFAULT, MTRUE, {0x10, 0, 0}}, + {60, 5300, WLAN_TX_PWR_DEFAULT, MTRUE, {0x10, 0, 0}}, + {64, 5320, WLAN_TX_PWR_DEFAULT, MTRUE, {0x10, 0, 0}}, {149, 5745, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, {153, 5765, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, {157, 5785, WLAN_TX_PWR_DEFAULT, MFALSE, {0x10, 0, 0}}, @@ -3368,27 +3369,49 @@ void wlan_add_fw_cfp_tables(pmlan_private pmpriv, t_u8 *buf, t_u16 buf_left) break; } } + PRINTM(MCMND, + "OTP region: region_code=%d %c%c dfs_region=%d\n", + pmadapter->otp_region->region_code, + pmadapter->otp_region->country_code[0], + pmadapter->otp_region->country_code[1], + pmadapter->otp_region->dfs_region); + /* Update the region code and the country code in * pmadapter */ pmadapter->region_code = pmadapter->otp_region->region_code; - pmadapter->country_code[0] = - pmadapter->otp_region->country_code[0]; - pmadapter->country_code[1] = - pmadapter->otp_region->country_code[1]; + if (pmadapter->otp_region->force_reg) { + /* Region is enforced. Use FW country code only + */ + pmadapter->country_code[0] = + pmadapter->otp_region->country_code[0]; + pmadapter->country_code[1] = + pmadapter->otp_region->country_code[1]; + } else if (memcmp(pmadapter, + pmadapter->otp_region->country_code, + pmadapter->country_code, + COUNTRY_CODE_LEN - 1)) { + PRINTM(MERROR, + "FW country code %c%c does not match with %c%c\n", + pmadapter->otp_region->country_code[0], + pmadapter->otp_region->country_code[1], + pmadapter->country_code[0], + pmadapter->country_code[1]); + + /* FW code mismatch, replace with the driver + * code */ + pmadapter->otp_region->country_code[0] = + pmadapter->country_code[0]; + pmadapter->otp_region->country_code[1] = + pmadapter->country_code[1]; + } pmadapter->country_code[2] = '\0'; pmadapter->domain_reg.country_code[0] = pmadapter->otp_region->country_code[0]; pmadapter->domain_reg.country_code[1] = pmadapter->otp_region->country_code[1]; pmadapter->domain_reg.country_code[2] = '\0'; - PRINTM(MCMND, - "OTP region: region_code=%d %c%c dfs_region=%d\n", - pmadapter->otp_region->region_code, - pmadapter->country_code[0], - pmadapter->country_code[1], - pmadapter->otp_region->dfs_region); pmadapter->cfp_code_bg = pmadapter->otp_region->region_code; pmadapter->cfp_code_a = diff --git a/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c b/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c index 499f7bc..2e144df 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c @@ -4,7 +4,7 @@ * @brief This file contains the handling of CMD/EVENT in MLAN * * - * Copyright 2009-2022 NXP + * Copyright 2009-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -26,6 +26,7 @@ Change Log: 05/12/2009: initial version ************************************************************/ #include "mlan.h" +#include "mlan_util.h" #ifdef STA_SUPPORT #include "mlan_join.h" #endif @@ -49,6 +50,30 @@ Change Log: Local Variables ********************************************************/ +#ifdef DEBUG_LEVEL1 + +#define ENUM_ELEMENT(_name, _id) \ + { \ + .id = _id, .name = #_name \ + } +#define ENUM_ELEMENT_LAST(name) \ + { \ + 0xFFFF, 0 \ + } + +static const struct reflective_enum_element host_cmd_id_names[] = { +#include "mlan_hostcmd_ids.h" +}; + +static const struct reflective_enum_element host_fw_event_names[] = { +#include "mlan_event_ids.h" +}; + +#undef ENUM_ELEMENT +#undef ENUM_ELEMENT_LAST + +#endif /* DEBUG_LEVEL1 */ + /******************************************************* Global Variables ********************************************************/ @@ -56,6 +81,32 @@ Change Log: /******************************************************** Local Functions ********************************************************/ +static const char *wlan_hostcmd_get_name(enum host_cmd_id id) +{ +#ifdef DEBUG_LEVEL1 + const char *name = reflective_enum_lookup_name(host_cmd_id_names, id); + + if (name) { + return wlan_str_skip_prefix(name, "HostCmd_CMD_"); + } +#endif + + return "???"; +} + +static const char *wlan_event_get_name(enum host_fw_event_id id) +{ +#ifdef DEBUG_LEVEL1 + const char *name = reflective_enum_lookup_name(host_fw_event_names, id); + + if (name) { + return wlan_str_skip_prefix(name, "EVENT_"); + } +#endif + + return "???"; +} + #ifdef STA_SUPPORT /** * @brief This function check if the command was cancel scan command @@ -113,7 +164,7 @@ static t_u8 wlan_is_cmd_allowed_during_scan(t_u16 cmd_id) case HostCmd_CMD_FUNC_INIT: case HostCmd_CMD_CFG_DATA: case HostCmd_CMD_REGION_POWER_CFG: - case HostCmd_CHANNEL_TRPC_CONFIG: + case HostCmd_CMD_CHANNEL_TRPC_CONFIG: case HostCmd_CMD_FUNC_SHUTDOWN: case HostCmd_CMD_802_11_ASSOCIATE: case HostCmd_CMD_802_11_DEAUTHENTICATE: @@ -129,13 +180,13 @@ static t_u8 wlan_is_cmd_allowed_during_scan(t_u16 cmd_id) case HostCmd_CMD_TDLS_OPERATION: case HostCmd_CMD_SOFT_RESET: #ifdef UAP_SUPPORT - case HOST_CMD_APCMD_SYS_RESET: - case HOST_CMD_APCMD_BSS_START: - case HOST_CMD_APCMD_BSS_STOP: - case HOST_CMD_APCMD_STA_DEAUTH: + case HostCmd_CMD_APCMD_SYS_RESET: + case HostCmd_CMD_APCMD_BSS_START: + case HostCmd_CMD_APCMD_BSS_STOP: + case HostCmd_CMD_APCMD_STA_DEAUTH: #endif case HostCmd_CMD_802_11_BG_SCAN_CONFIG: - case HostCMD_APCMD_ACS_SCAN: + case HostCmd_CMD_APCMD_ACS_SCAN: ret = MFALSE; break; default: @@ -253,8 +304,9 @@ static t_void wlan_queue_cmd(mlan_private *pmpriv, cmd_ctrl_node *pcmd_node, if (pmpriv->adapter->scan_processing && pmpriv->adapter->ext_scan_type == EXT_SCAN_ENHANCE) { if (MFALSE == wlan_is_cmd_allowed_during_scan(cmd_no)) { - PRINTM(MCMND, "QUEUE_CMD: cmd=0x%x ext_cmd_pending_q\n", - cmd_no); + PRINTM(MCMND, + "QUEUE_CMD: %s [0x%x] ext_cmd_pending_q\n", + wlan_hostcmd_get_name(cmd_no), cmd_no); wlan_queue_cmd_to_ext_cmd_pending_queue(pmpriv, pcmd_node); return; @@ -394,8 +446,9 @@ static t_void wlan_dump_info(mlan_adapter *pmadapter, t_u8 reason) [pmadapter->dbg.last_cmd_index]; PRINTM_GET_SYS_TIME(MERROR, &sec, &usec); PRINTM(MERROR, - "Current cmd id (%lu.%06lu) = 0x%x, act = 0x%x\n", - sec, usec, cmd_id, cmd_act); + "Current cmd id (%lu.%06lu) %s [0x%x], act = 0x%x\n", + sec, usec, wlan_hostcmd_get_name(cmd_id), cmd_id, + cmd_act); #if defined(SDIO) || defined(PCIE) if (!IS_USB(pmadapter->card_type) && pcmd_node->cmdbuf) { @@ -1161,12 +1214,12 @@ static t_u32 wlan_get_cmd_timeout(t_u16 cmd_id) case HostCmd_CMD_SUPPLICANT_PROFILE: case HostCmd_CMD_SOFT_RESET: #ifdef UAP_SUPPORT - case HOST_CMD_APCMD_SYS_RESET: - case HOST_CMD_APCMD_BSS_START: - case HOST_CMD_APCMD_BSS_STOP: - case HOST_CMD_APCMD_STA_DEAUTH: + case HostCmd_CMD_APCMD_SYS_RESET: + case HostCmd_CMD_APCMD_BSS_START: + case HostCmd_CMD_APCMD_BSS_STOP: + case HostCmd_CMD_APCMD_STA_DEAUTH: #endif - case HostCMD_APCMD_ACS_SCAN: + case HostCmd_CMD_APCMD_ACS_SCAN: timeout = MRVDRV_TIMER_5S; break; default: @@ -1310,8 +1363,8 @@ static mlan_status wlan_dnld_cmd_to_fw(mlan_private *pmpriv, PRINTM_GET_SYS_TIME(MCMND, &sec, &usec); PRINTM_NETINTF(MCMND, pmpriv); PRINTM(MCMND, - "DNLD_CMD (%lu.%06lu): 0x%x, act 0x%x, len %d, seqno 0x%x timeout %d\n", - sec, usec, cmd_code, + "DNLD_CMD (%lu.%06lu): %s [0x%x], act 0x%x, len %d, seqno 0x%x timeout %d\n", + sec, usec, wlan_hostcmd_get_name(cmd_code), cmd_code, wlan_le16_to_cpu(*(t_u16 *)((t_u8 *)pcmd + S_DS_GEN)), cmd_size, wlan_le16_to_cpu(pcmd->seq_num), timeout); DBG_HEXDUMP(MCMD_D, "DNLD_CMD", (t_u8 *)pcmd, cmd_size); @@ -1746,7 +1799,9 @@ mlan_status wlan_process_event(pmlan_adapter pmadapter) if (priv) PRINTM_NETINTF(MEVENT, priv); PRINTM(MERROR, - "Error processing DFS Event: 0x%x\n", + "Error processing DFS Event: %s [0x%x]\n", + wlan_event_get_name(eventcause & + EVENT_ID_MASK), eventcause); goto done; } @@ -1777,17 +1832,13 @@ mlan_status wlan_process_event(pmlan_adapter pmadapter) eventcause != EVENT_FW_DUMP_INFO) { PRINTM_GET_SYS_TIME(MEVENT, &in_ts_sec, &in_ts_usec); PRINTM_NETINTF(MEVENT, priv); - PRINTM(MEVENT, "%lu.%06lu : Event: 0x%x\n", in_ts_sec, - in_ts_usec, eventcause); + PRINTM(MEVENT, "%lu.%06lu : Event: %s [0x%x]\n", in_ts_sec, + in_ts_usec, wlan_event_get_name(eventcause), eventcause); } ret = priv->ops.process_event(priv); done: - pmadapter->event_cause = 0; - pmadapter->pmlan_buffer_event = MNULL; - if (pmbuf) - pmadapter->ops.event_complete(pmadapter, pmbuf, - MLAN_STATUS_SUCCESS); + pmadapter->ops.event_complete(pmadapter, pmbuf, MLAN_STATUS_SUCCESS); LEAVE(); return ret; @@ -2063,7 +2114,8 @@ t_void wlan_insert_cmd_to_pending_q(mlan_adapter *pmadapter, } PRINTM_NETINTF(MCMND, pcmd_node->priv); - PRINTM(MCMND, "QUEUE_CMD: cmd=0x%x is queued\n", command); + PRINTM(MCMND, "QUEUE_CMD: %s [0x%x] is queued\n", + wlan_hostcmd_get_name(command), command); done: LEAVE(); @@ -2147,6 +2199,48 @@ done: return ret; } +/** + * @brief This function handles the command error in pre_asleep state + * + * @param pmadapter A pointer to mlan_adapter structure + * + * @return N/A + */ +void wlan_handle_cmd_error_in_pre_aleep(mlan_adapter *pmadapter, t_u16 cmd_no) +{ + cmd_ctrl_node *pcmd_node = MNULL; + ENTER(); + PRINTM(MERROR, "CMD_RESP: 0x%x block in pre_asleep!\n", cmd_no); + wlan_request_cmd_lock(pmadapter); + pcmd_node = pmadapter->curr_cmd; + pmadapter->curr_cmd = MNULL; + if (pcmd_node) { +#ifdef USB + if (IS_USB(pmadapter->card_type)) { + pcmd_node->cmdbuf->data_offset += MLAN_TYPE_LEN; + pcmd_node->cmdbuf->data_len -= MLAN_TYPE_LEN; + } +#endif +#if defined(SDIO) || defined(PCIE) + if (!IS_USB(pmadapter->card_type)) { + pcmd_node->cmdbuf->data_offset += + pmadapter->ops.intf_header_len; + pcmd_node->cmdbuf->data_len -= + pmadapter->ops.intf_header_len; + } +#endif + if (pcmd_node->respbuf) { + pmadapter->ops.cmdrsp_complete(pmadapter, + pcmd_node->respbuf, + MLAN_STATUS_SUCCESS); + pcmd_node->respbuf = MNULL; + } + wlan_insert_cmd_to_pending_q(pmadapter, pcmd_node, MFALSE); + } + wlan_release_cmd_lock(pmadapter); + LEAVE(); +} + /** * @brief This function handles the command response * @@ -2262,9 +2356,10 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter) PRINTM_GET_SYS_TIME(MCMND, &sec, &usec); PRINTM_NETINTF(MCMND, pmadapter->curr_cmd->priv); PRINTM(MCMND, - "CMD_RESP (%lu.%06lu): 0x%x, result %d, len %d, seqno 0x%x\n", - sec, usec, orig_cmdresp_no, cmdresp_result, resp->size, - resp->seq_num); + "CMD_RESP (%lu.%06lu): %s [0x%x], result %d, len %d, seqno 0x%x\n", + sec, usec, + wlan_hostcmd_get_name(orig_cmdresp_no & ~HostCmd_RET_BIT), + orig_cmdresp_no, cmdresp_result, resp->size, resp->seq_num); if (!(orig_cmdresp_no & HostCmd_RET_BIT)) { PRINTM(MERROR, "CMD_RESP: Invalid response to command!\n"); @@ -2279,11 +2374,26 @@ mlan_status wlan_process_cmdresp(mlan_adapter *pmadapter) } if (pmadapter->curr_cmd->cmd_flag & CMD_F_HOSTCMD) { + if (pmadapter->curr_cmd && + cmdresp_result == HostCmd_RESULT_PRE_ASLEEP) { + wlan_handle_cmd_error_in_pre_aleep(pmadapter, + cmdresp_no); + ret = MLAN_STATUS_FAILURE; + goto done; + } pmadapter->curr_cmd->cmd_flag &= ~CMD_F_HOSTCMD; if ((cmdresp_result == HostCmd_RESULT_OK) && (cmdresp_no == HostCmd_CMD_802_11_HS_CFG_ENH)) ret = wlan_ret_802_11_hs_cfg(pmpriv, resp, pioctl_buf); } else { + if (pmadapter->curr_cmd && + cmdresp_result == HostCmd_RESULT_PRE_ASLEEP) { + wlan_handle_cmd_error_in_pre_aleep(pmadapter, + cmdresp_no); + ret = MLAN_STATUS_FAILURE; + goto done; + } + /* handle response */ ret = pmpriv->ops.process_cmdresp(pmpriv, cmdresp_no, resp, pioctl_buf); @@ -2433,9 +2543,9 @@ t_void wlan_cmd_timeout_func(t_void *function_context) pmadapter->dbg.timeout_cmd_act = pmadapter->dbg.last_cmd_act[pmadapter->dbg.last_cmd_index]; PRINTM_GET_SYS_TIME(MERROR, &sec, &usec); - PRINTM(MERROR, "Timeout cmd id (%lu.%06lu) = 0x%x, act = 0x%x\n", sec, - usec, pmadapter->dbg.timeout_cmd_id, - pmadapter->dbg.timeout_cmd_act); + PRINTM(MERROR, "Timeout cmd id (%lu.%06lu) %s [0x%x], act = 0x%x\n", + sec, usec, wlan_hostcmd_get_name(pmadapter->dbg.timeout_cmd_id), + pmadapter->dbg.timeout_cmd_id, pmadapter->dbg.timeout_cmd_act); #if defined(SDIO) || defined(PCIE) if (!IS_USB(pmadapter->card_type) && pcmd_node->cmdbuf) { t_u8 *pcmd_buf; @@ -3427,12 +3537,13 @@ t_void wlan_check_ps_cond(mlan_adapter *pmadapter) if (!pmadapter->cmd_sent && !pmadapter->curr_cmd && !pmadapter->keep_wakeup && !wlan_is_tx_pending(pmadapter) && - !IS_CARD_RX_RCVD(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", (pmadapter->cmd_sent) ? "D" : "", (pmadapter->curr_cmd) ? "C" : "", + (pmadapter->event_cause) ? "V" : "", (wlan_is_tx_pending(pmadapter)) ? "T" : "", (IS_CARD_RX_RCVD(pmadapter)) ? "R" : ""); } @@ -3664,6 +3775,16 @@ mlan_status wlan_cmd_enh_power_mode(pmlan_private pmpriv, psmode_enh->action = wlan_cpu_to_le16(GET_PS); psmode_enh->params.ps_bitmap = wlan_cpu_to_le16(ps_bitmap); cmd->size = wlan_cpu_to_le16(S_DS_GEN + AUTO_PS_FIX_SIZE); + } else if (cmd_action == EXT_PS_PARAM) { + psmode_enh->action = wlan_cpu_to_le16(EXT_PS_PARAM); + psmode_enh->params.ext_param.reserved = 0; + cmd->size = wlan_cpu_to_le16(S_DS_GEN + sizeof(t_u16) + + sizeof(ext_ps_param)); + psmode_enh->params.ext_param.param.header.type = + wlan_cpu_to_le16(TLV_TYPE_PS_EXT_PARAM); + psmode_enh->params.ext_param.param.header.len = sizeof(t_u32); + psmode_enh->params.ext_param.param.mode = + wlan_cpu_to_le32(*((t_u32 *)pdata_buf)); } else if (cmd_action == EN_AUTO_PS) { psmode_enh->action = wlan_cpu_to_le16(EN_AUTO_PS); psmode_enh->params.auto_ps.ps_bitmap = @@ -4854,6 +4975,7 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter) #ifdef STA_SUPPORT pmlan_private pmpriv_sta = MNULL; #endif + t_u32 mode = BLOCK_CMD_IN_PRE_ASLEEP; ENTER(); pmpriv = wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY); @@ -4862,8 +4984,6 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter) #endif #ifdef SDIO - if (IS_SD(pmadapter->card_type)) { - } #endif ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_RECONFIGURE_TX_BUFF, @@ -4913,6 +5033,13 @@ mlan_status wlan_adapter_init_cmd(pmlan_adapter pmadapter) } } + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_PS_MODE_ENH, + EXT_PS_PARAM, HostCmd_ACT_GEN_SET, MNULL, &mode); + if (ret) { + ret = MLAN_STATUS_FAILURE; + goto done; + } + #define DEF_AUTO_NULL_PKT_PERIOD 30 if (pmpriv_sta) { t_u32 value = DEF_AUTO_NULL_PKT_PERIOD; @@ -5397,7 +5524,6 @@ 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 @@ -5750,56 +5876,6 @@ mlan_status wlan_cmd_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd) } #ifdef SDIO -/** - * @brief This function prepares command of sdio rx aggr command. - * - * @param pcmd A pointer to HostCmd_DS_COMMAND structure - * @param cmd_action Command action: GET or SET - * @param pdata_buf A pointer to new setting buf - - * @return MLAN_STATUS_SUCCESS - */ -mlan_status wlan_cmd_sdio_rx_aggr_cfg(HostCmd_DS_COMMAND *pcmd, - t_u16 cmd_action, t_void *pdata_buf) -{ - HostCmd_DS_SDIO_SP_RX_AGGR_CFG *cfg = &pcmd->params.sdio_rx_aggr; - - pcmd->command = wlan_cpu_to_le16(HostCmd_CMD_SDIO_SP_RX_AGGR_CFG); - pcmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_SDIO_SP_RX_AGGR_CFG) + - S_DS_GEN); - cfg->action = cmd_action; - if (pdata_buf && (cmd_action == HostCmd_ACT_GEN_SET)) - cfg->enable = *(t_u8 *)pdata_buf; - return MLAN_STATUS_SUCCESS; -} - -/** - * @brief This function handles the command response of sdio rx aggr command - * - * @param pmpriv A pointer to mlan_private structure - * @param resp A pointer to HostCmd_DS_COMMAND - * - * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE - */ -mlan_status wlan_ret_sdio_rx_aggr_cfg(pmlan_private pmpriv, - HostCmd_DS_COMMAND *resp) -{ - mlan_adapter *pmadapter = pmpriv->adapter; - HostCmd_DS_SDIO_SP_RX_AGGR_CFG *cfg = &resp->params.sdio_rx_aggr; - - pmadapter->pcard_sd->sdio_rx_aggr_enable = cfg->enable; - pmadapter->pcard_sd->sdio_rx_block_size = - wlan_le16_to_cpu(cfg->sdio_block_size); - PRINTM(MMSG, "SDIO rx aggr: %d block_size=%d\n", cfg->enable, - pmadapter->pcard_sd->sdio_rx_block_size); - if (!pmadapter->pcard_sd->sdio_rx_block_size) - pmadapter->pcard_sd->sdio_rx_aggr_enable = MFALSE; - if (pmadapter->pcard_sd->sdio_rx_aggr_enable) { - pmadapter->pcard_sd->max_sp_rx_size = SDIO_CMD53_MAX_SIZE; - wlan_re_alloc_sdio_rx_mpa_buffer(pmadapter); - } - return MLAN_STATUS_SUCCESS; -} #endif /** @@ -6151,22 +6227,6 @@ mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, #ifdef SDIO if (IS_SD(pmadapter->card_type)) { - if ((pmadapter->fw_cap_info & SDIO_SP_RX_AGGR_ENABLE) && - pmadapter->pcard_sd->sdio_rx_aggr_enable) { - t_u8 sdio_sp_rx_aggr = MTRUE; - ret = wlan_prepare_cmd(pmpriv, - HostCmd_CMD_SDIO_SP_RX_AGGR_CFG, - HostCmd_ACT_GEN_SET, 0, MNULL, - &sdio_sp_rx_aggr); - if (ret) { - ret = MLAN_STATUS_FAILURE; - goto done; - } - } else { - pmadapter->pcard_sd->sdio_rx_aggr_enable = MFALSE; - PRINTM(MCMND, "FW: SDIO rx aggr disabled 0x%x\n", - pmadapter->fw_cap_info); - } } #endif #ifdef STA_SUPPORT @@ -6408,8 +6468,14 @@ mlan_status wlan_ret_remain_on_channel(pmlan_private pmpriv, HostCmd_DS_REMAIN_ON_CHANNEL *remain_channel = &resp->params.remain_on_chan; mlan_ds_radio_cfg *radio_cfg = MNULL; + t_u16 action = wlan_le16_to_cpu(remain_channel->action); ENTER(); + if (action == HostCmd_ACT_GEN_REMOVE) + pmpriv->adapter->remain_on_channel = MFALSE; + else + pmpriv->adapter->remain_on_channel = MTRUE; + if (pioctl_buf) { radio_cfg = (mlan_ds_radio_cfg *)pioctl_buf->pbuf; radio_cfg->param.remain_chan.status = remain_channel->status; @@ -6443,7 +6509,7 @@ mlan_status wlan_cmd_wifi_direct_mode(pmlan_private pmpriv, ENTER(); cmd->size = wlan_cpu_to_le16((sizeof(HostCmd_DS_WIFI_DIRECT_MODE)) + S_DS_GEN); - cmd->command = wlan_cpu_to_le16(HOST_CMD_WIFI_DIRECT_MODE_CONFIG); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG); wfd_mode->action = wlan_cpu_to_le16(cmd_action); if (cmd_action == HostCmd_ACT_GEN_SET) wfd_mode->mode = wlan_cpu_to_le16(mode); @@ -6502,7 +6568,7 @@ mlan_status wlan_cmd_p2p_params_config(pmlan_private pmpriv, ENTER(); cmd->size = sizeof(HostCmd_DS_WIFI_DIRECT_PARAM_CONFIG) + S_DS_GEN; - cmd->command = wlan_cpu_to_le16(HOST_CMD_P2P_PARAMS_CONFIG); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_P2P_PARAMS_CONFIG); p2p_config->action = wlan_cpu_to_le16(cmd_action); if (cmd_action == HostCmd_ACT_GEN_SET) { tlv = (t_u8 *)p2p_config->tlv_buf; @@ -6702,7 +6768,8 @@ mlan_status wlan_cmd_gpio_tsf_latch(pmlan_private pmpriv, ENTER(); cmd->size = sizeof(HostCmd_DS_GPIO_TSF_LATCH_PARAM_CONFIG) + S_DS_GEN; - cmd->command = wlan_cpu_to_le16(HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG); + cmd->command = + wlan_cpu_to_le16(HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG); gpio_tsf_config->action = wlan_cpu_to_le16(cmd_action); if (cmd_action == HostCmd_ACT_GEN_SET) { tlv = (t_u8 *)gpio_tsf_config->tlv_buf; @@ -7092,7 +7159,7 @@ mlan_status wlan_cmd_tx_rx_pkt_stats(pmlan_private pmpriv, ret = MLAN_STATUS_FAILURE; goto done; } - cmd->command = wlan_cpu_to_le16(HOST_CMD_TX_RX_PKT_STATS); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_TX_RX_PKT_STATS); cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_TX_RX_HISTOGRAM) + S_DS_GEN); @@ -7334,7 +7401,7 @@ mlan_status wlan_ret_802_11_rf_antenna(pmlan_private pmpriv, wlan_le16_to_cpu(pantenna->action_tx), tx_ant_mode, wlan_le16_to_cpu(pantenna->action_rx), rx_ant_mode); if (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type)) { tx_ant_mode &= 0x0303; @@ -7421,7 +7488,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, mac_reg->value = wlan_cpu_to_le32(reg_rw->value); if ((reg_rw->type == MLAN_REG_MAC2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t @@ -7459,7 +7526,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, bbp_reg->value = (t_u8)reg_rw->value; if ((reg_rw->type == MLAN_REG_BBP2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t @@ -7486,7 +7553,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, rf_reg->value = (t_u8)reg_rw->value; if ((reg_rw->type == MLAN_REG_RF2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t @@ -7548,7 +7615,7 @@ mlan_status wlan_cmd_reg_access(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, bca_reg->value = wlan_cpu_to_le32(reg_rw->value); if ((reg_rw->type == MLAN_REG_BCA2) && (IS_CARD9098(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type) || + IS_CARDIW624(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type))) { tlv = (MrvlIEtypes_Reg_type_t @@ -9115,257 +9182,6 @@ mlan_status wlan_ret_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, return MLAN_STATUS_SUCCESS; } -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - -/** - * @brief This function handles send crypto command - * - * @param pmpriv A pointer to mlan_private structure - * @param cmd Hostcmd ID - * @param cmd_action Command action - * @param pdata_buf A void pointer to information buffer - * - * @return MLAN_STATUS_SUCCESS - */ -mlan_status wlan_cmd_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, - t_u16 cmd_action, t_u16 *pdata_buf) -{ - HostCmd_DS_CRYPTO *cry_cmd = &cmd->params.crypto_cmd; - mlan_ds_sup_cfg *cfg = (mlan_ds_sup_cfg *)pdata_buf; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - subcmd_prf_hmac_sha1_t *prf_hmac_sha1 = MNULL; - subcmd_hmac_sha1_t *hmac_sha1 = MNULL; - subcmd_hmac_sha256_t *hmac_sha256 = MNULL; - subcmd_sha256_t *sha256 = MNULL; - subcmd_rijndael_t *rijndael = MNULL; - subcmd_rc4_t *rc4 = MNULL; - subcmd_md5_t *md5 = MNULL; - subcmd_mrvl_f_t *mrvl_f = MNULL; - subcmd_sha256_kdf_t *sha256_kdf = MNULL; - t_u8 *ptlv = MNULL; - t_u8 tlv_bitmap = 0; - t_u32 i = 0; -#endif - ENTER(); - - cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CRYPTO); - cmd->size = S_DS_GEN + sizeof(HostCmd_DS_CRYPTO); - cry_cmd->action = wlan_cpu_to_le16(cmd_action); - cry_cmd->subCmdCode = cfg->sub_command; - switch (cfg->sub_command) { -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - case HostCmd_CMD_CRYPTO_SUBCMD_PRF_HMAC_SHA1: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_PREFIX | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - prf_hmac_sha1 = (subcmd_prf_hmac_sha1_t *)cry_cmd->subCmd; - prf_hmac_sha1->output_len = cfg->output_len; - /* set tlv start */ - ptlv = prf_hmac_sha1->tlv; - cmd->size += sizeof(subcmd_prf_hmac_sha1_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_HMAC_SHA1: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - hmac_sha1 = (subcmd_hmac_sha1_t *)cry_cmd->subCmd; - hmac_sha1->output_len = cfg->output_len; - hmac_sha1->data_blks_nr = cfg->data_blks_nr; - /* set tlv start */ - ptlv = hmac_sha1->tlv; - cmd->size += sizeof(subcmd_hmac_sha1_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_HMAC_SHA256: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - hmac_sha256 = (subcmd_hmac_sha256_t *)cry_cmd->subCmd; - hmac_sha256->output_len = cfg->output_len; - hmac_sha256->data_blks_nr = cfg->data_blks_nr; - /* set tlv start */ - ptlv = hmac_sha256->tlv; - cmd->size += sizeof(subcmd_hmac_sha256_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_SHA256: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - sha256 = (subcmd_sha256_t *)cry_cmd->subCmd; - sha256->output_len = cfg->output_len; - sha256->data_blks_nr = cfg->data_blks_nr; - /* set tlv start */ - ptlv = sha256->tlv; - cmd->size += sizeof(subcmd_sha256_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_RIJNDAEL: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - rijndael = (subcmd_rijndael_t *)cry_cmd->subCmd; - rijndael->sub_action_code = cfg->sub_action_code; - rijndael->output_len = cfg->output_len; - /* set tlv start */ - ptlv = rijndael->tlv; - cmd->size += sizeof(subcmd_rijndael_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_RC4: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_IV | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - rc4 = (subcmd_rc4_t *)cry_cmd->subCmd; - rc4->skip_bytes = cfg->skip_bytes; - rc4->output_len = cfg->output_len; - /* set tlv start */ - ptlv = rc4->tlv; - cmd->size += sizeof(subcmd_rc4_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_MD5: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - md5 = (subcmd_md5_t *)cry_cmd->subCmd; - md5->output_len = cfg->output_len; - /* set tlv start */ - ptlv = md5->tlv; - cmd->size += sizeof(subcmd_md5_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_MRVL_F: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - mrvl_f = (subcmd_mrvl_f_t *)cry_cmd->subCmd; - mrvl_f->iterations = cfg->iteration; - mrvl_f->count = cfg->count; - mrvl_f->output_len = cfg->output_len; - /* set tlv start */ - ptlv = mrvl_f->tlv; - cmd->size += sizeof(subcmd_mrvl_f_t); - break; - case HostCmd_CMD_CRYPTO_SUBCMD_SHA256_KDF: - tlv_bitmap = BIT_TLV_TYPE_CRYPTO_KEY | - BIT_TLV_TYPE_CRYPTO_KEY_PREFIX | - BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK; - /* set subcmd start */ - sha256_kdf = (subcmd_sha256_kdf_t *)cry_cmd->subCmd; - sha256_kdf->output_len = cfg->output_len; - /* set tlv start */ - ptlv = sha256_kdf->tlv; - cmd->size += sizeof(subcmd_sha256_kdf_t); - break; -#endif - default: - break; - } -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - /* add tlv */ - if (tlv_bitmap & BIT_TLV_TYPE_CRYPTO_KEY) { - ((MrvlIEParamSet_t *)ptlv)->Type = - wlan_cpu_to_le16(TLV_TYPE_CRYPTO_KEY); - ((MrvlIEParamSet_t *)ptlv)->Length = - wlan_cpu_to_le16(cfg->key_len); - memcpy_ext(pmpriv->adapter, - (t_u8 *)ptlv + sizeof(MrvlIEParamSet_t), cfg->key, - cfg->key_len, cfg->key_len); - cmd->size += cfg->key_len + sizeof(MrvlIEParamSet_t); - ptlv += cfg->key_len + sizeof(MrvlIEParamSet_t); - } - - if (tlv_bitmap & BIT_TLV_TYPE_CRYPTO_KEY_PREFIX) { - ((MrvlIEParamSet_t *)ptlv)->Type = - wlan_cpu_to_le16(TLV_TYPE_CRYPTO_KEY_PREFIX); - ((MrvlIEParamSet_t *)ptlv)->Length = - wlan_cpu_to_le16(cfg->key_prefix_len); - memcpy_ext(pmpriv->adapter, ptlv + sizeof(MrvlIEParamSet_t), - cfg->key_prefix, cfg->key_prefix_len, - cfg->key_prefix_len); - cmd->size += cfg->key_prefix_len + sizeof(MrvlIEParamSet_t); - ptlv += cfg->key_prefix_len + sizeof(MrvlIEParamSet_t); - } - - if (tlv_bitmap & BIT_TLV_TYPE_CRYPTO_KEY_IV) { - ((MrvlIEParamSet_t *)ptlv)->Type = - wlan_cpu_to_le16(TLV_TYPE_CRYPTO_KEY_IV); - ((MrvlIEParamSet_t *)ptlv)->Length = - wlan_cpu_to_le16(cfg->key_iv_len); - memcpy_ext(pmpriv->adapter, ptlv + sizeof(MrvlIEParamSet_t), - cfg->key_iv, cfg->key_iv_len, cfg->key_iv_len); - cmd->size += cfg->key_iv_len + sizeof(MrvlIEParamSet_t); - ptlv += cfg->key_iv_len + sizeof(MrvlIEParamSet_t); - } - - if (tlv_bitmap & BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK) { - t_u16 data_blk_len = 0; - t_u8 *pdata_blk = MNULL; - for (i = 0; i < cfg->data_blks_nr; i++) { - data_blk_len = *(cfg->key_data_blk_len + i); - pdata_blk = *(cfg->key_data_blk + i); - ((MrvlIEParamSet_t *)ptlv)->Type = - wlan_cpu_to_le16(TLV_TYPE_CRYPTO_KEY_DATA_BLK); - ((MrvlIEParamSet_t *)ptlv)->Length = - wlan_cpu_to_le16(data_blk_len); - memcpy_ext(pmpriv->adapter, - ptlv + sizeof(MrvlIEParamSet_t), pdata_blk, - data_blk_len, data_blk_len); - cmd->size += data_blk_len + sizeof(MrvlIEParamSet_t); - ptlv += data_blk_len + sizeof(MrvlIEParamSet_t); - } - } -#endif - HEXDUMP("HostCmd_DS_COMMAND wlan_cmd_crypto", cmd, cmd->size); - - cmd->size = wlan_cpu_to_le16(cmd->size); - LEAVE(); - return MLAN_STATUS_SUCCESS; -} - -/** - * @brief This function handles the command response of crypto command - * - * @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_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, - mlan_ioctl_req *pioctl_buf) -{ - HostCmd_DS_CRYPTO *crypto_cmd = &resp->params.crypto_cmd; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - mlan_adapter *pmadapter = pmpriv->adapter; - mlan_callbacks *pcb = (pmlan_callbacks)&pmadapter->callbacks; - mlan_ds_sup_cfg *cfg = (mlan_ds_sup_cfg *)pioctl_buf->pbuf; -#endif - - ENTER(); -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - if (!cfg) { - PRINTM(MERROR, "wlan_ret_crypto cfg is null \n"); - goto done; - } - if (resp->result == HostCmd_RESULT_OK) { - /* copy the result */ - memcpy_ext(pmpriv->adapter, cfg->output, - (t_u8 *)crypto_cmd + sizeof(HostCmd_DS_CRYPTO) + - sizeof(cfg->output_len), - cfg->output_len, cfg->output_len); - } - - /* Prevent the ioctl from completing when the cmd is freed */ - if (cfg->call_back) { - pmadapter->curr_cmd->pioctl_buf = MNULL; - /* trigger wait q */ - pcb->moal_notify_hostcmd_complete(pmadapter->pmoal_handle, - pmpriv->bss_index); - } -#endif -done: - LEAVE(); - return MLAN_STATUS_SUCCESS; -} -#endif - /** * @brief This function prepares command of mac_address. * @@ -9594,6 +9410,142 @@ mlan_status wlan_cmd_rxabortcfg_ext(pmlan_private pmpriv, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function prepares command of nav mitigation + * + * @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_nav_mitigation(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, + t_void *pdata_buf) +{ + HostCmd_DS_CMD_NAV_MITIGATION_CFG *cfg_cmd = + (HostCmd_DS_CMD_NAV_MITIGATION_CFG *)&cmd->params.nav_mitigation; + mlan_ds_misc_nav_mitigation *cfg = + (mlan_ds_misc_nav_mitigation *)pdata_buf; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_NAV_MITIGATION_CFG); + cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_CMD_NAV_MITIGATION_CFG) + + S_DS_GEN); + cfg_cmd->action = wlan_cpu_to_le16(cmd_action); + + if (cmd_action == HostCmd_ACT_GEN_SET) { + cfg_cmd->start_nav_mitigation = + wlan_cpu_to_le16(cfg->start_nav_mitigation); + cfg_cmd->threshold = wlan_cpu_to_le16(cfg->threshold); + cfg_cmd->detect_cnt = wlan_cpu_to_le16(cfg->detect_cnt); + cfg_cmd->stop_cnt = wlan_cpu_to_le16(cfg->stop_cnt); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function prepares command of LED config parameter + * + * @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_led_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, t_void *pdata_buf) +{ + int count = 0; + HostCmd_DS_CMD_LED_CFG *cfg_cmd = &cmd->params.ledcntrcfg; + t_u8 *tlv = MNULL; + t_u16 cmd_size = 0; + int i = 0; + mlan_ds_misc_led_cfg *cfg = (mlan_ds_misc_led_cfg *)pdata_buf; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_802_11_LED_CONTROL); + cfg_cmd->action = wlan_cpu_to_le16(cmd_action); + cmd_size = S_DS_GEN + sizeof(HostCmd_DS_CMD_LED_CFG); + + if (cmd_action == HostCmd_ACT_GEN_SET) { + cfg_cmd->enable = wlan_cpu_to_le16(cfg->enable); + count = cfg->led_cfg_len; + if (count != 0) { + tlv = (t_u8 *)cmd + cmd_size; + while (i < count) { + MrvlIEtypes_led_behavior_t *led_tlv = + (MrvlIEtypes_led_behavior_t *)tlv; + + led_tlv->header.type = + wlan_cpu_to_le16(TLV_TYPE_LEDBEHAVIOR); + led_tlv->header.len = wlan_cpu_to_le16( + sizeof(MrvlIEtypes_led_behavior_t) - + sizeof(MrvlIEtypesHeader_t)); + led_tlv->firmwarestate = wlan_cpu_to_le16( + cfg->misc_led_behvr[i].firmwarestate); + led_tlv->ledstate = wlan_cpu_to_le16( + cfg->misc_led_behvr[i].ledstate); + led_tlv->ledargs = wlan_cpu_to_le16( + cfg->misc_led_behvr[i].ledargs); + cmd_size += sizeof(MrvlIEtypes_led_behavior_t); + i++; + if (i != count) { + tlv += sizeof( + MrvlIEtypes_led_behavior_t); + } + } + } + } + cmd->size = wlan_cpu_to_le16(cmd_size); + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function handles the command response of led config + * + * @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_led_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)(pioctl_buf->pbuf); + mlan_ds_misc_led_cfg *mlan_led_cfg = &(misc->param.led_config); + t_u8 *tlv = MNULL; + int left_len = 0, i = 0; + t_u32 cmdrsp_len = wlan_le16_to_cpu(resp->size); + ENTER(); + + if ((cmdrsp_len < S_DS_GEN) || + (cmdrsp_len - S_DS_GEN < sizeof(HostCmd_DS_CMD_LED_CFG))) + return MLAN_STATUS_SUCCESS; + + mlan_led_cfg->enable = resp->params.ledcntrcfg.enable; + left_len = cmdrsp_len - (S_DS_GEN + sizeof(HostCmd_DS_CMD_LED_CFG)); + + tlv = (t_u8 *)resp + (S_DS_GEN + sizeof(HostCmd_DS_CMD_LED_CFG)); + for (i = 0; i < MAX_FW_STATES; i++) { + mlan_led_cfg->misc_led_behvr[i].firmwarestate = *tlv; + tlv++; + tlv++; // to skip reserved byte + mlan_led_cfg->misc_led_behvr[i].ledstate = *tlv; + tlv++; + mlan_led_cfg->misc_led_behvr[i].ledargs = *tlv; + tlv++; + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function handles the command response of Rx Abort Cfg ext * @@ -9634,6 +9586,41 @@ mlan_status wlan_ret_rxabortcfg_ext(pmlan_private pmpriv, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function handles the command response of nav mitigation + * + * @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_nav_mitigation(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + HostCmd_DS_CMD_NAV_MITIGATION_CFG *cfg_cmd = + (HostCmd_DS_CMD_NAV_MITIGATION_CFG *)&resp->params + .nav_mitigation; + mlan_ds_misc_cfg *misc_cfg = MNULL; + + ENTER(); + + if (pioctl_buf) { + misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; + misc_cfg->param.nav_mitigation.start_nav_mitigation = + wlan_le16_to_cpu(cfg_cmd->start_nav_mitigation); + misc_cfg->param.nav_mitigation.threshold = + wlan_le16_to_cpu(cfg_cmd->threshold); + misc_cfg->param.nav_mitigation.detect_cnt = + wlan_le16_to_cpu(cfg_cmd->detect_cnt); + misc_cfg->param.nav_mitigation.stop_cnt = + wlan_le16_to_cpu(cfg_cmd->stop_cnt); + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function sets the hal/phy cfg params * @@ -10056,7 +10043,7 @@ mlan_status wlan_cmd_get_chan_trpc_config(pmlan_private pmpriv, ENTER(); - cmd->command = wlan_cpu_to_le16(HostCmd_CHANNEL_TRPC_CONFIG); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_CHANNEL_TRPC_CONFIG); trpc_cfg->action = wlan_cpu_to_le16(cmd_action); cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_CHANNEL_TRPC_CONFIG) + S_DS_GEN); @@ -10339,7 +10326,7 @@ mlan_status wlan_cmd_get_sensor_temp(pmlan_private pmpriv, return MLAN_STATUS_FAILURE; } - cmd->command = wlan_cpu_to_le16(HostCmd_DS_GET_SENSOR_TEMP); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_DS_GET_SENSOR_TEMP); cmd->size = wlan_cpu_to_le16(S_DS_GEN + 4); LEAVE(); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_decl.h b/mxm_wifiex/wlan_src/mlan/mlan_decl.h index 53eefff..fee793e 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_decl.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_decl.h @@ -24,7 +24,7 @@ #define _MLAN_DECL_H_ /** MLAN release version */ -#define MLAN_RELEASE_VERSION "391.p3" +#define MLAN_RELEASE_VERSION "408" /** Re-define generic data types for MLAN/MOAL */ /** Signed char (1-byte) */ @@ -157,6 +157,10 @@ 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 @@ -269,6 +273,10 @@ typedef t_s32 t_sval; /** pcie inband reset */ #define FW_RELOAD_PCIE_INBAND_RESET 6 +#ifdef PCIE +/* Interrupt type */ +enum { RX_DATA, RX_EVENT, TX_COMPLETE, RX_CMD_RESP }; +#endif #ifdef USB #define MLAN_USB_BLOCK_SIZE (512) #define MLAN_USB_AGGR_MODE_NUM (0) @@ -374,7 +382,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; /** 8801 card type */ #define CARD_TYPE_8801 0x0a /** OWL card type */ -#define CARD_TYPE_IW62X 0x0b +#define CARD_TYPE_IW624 0x0b /** Black bird card type */ #define CARD_TYPE_AW693 0x0c @@ -408,9 +416,9 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8)) /** SD8801 card type */ #define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8)) -/** SD_IW62X card type */ -#define CARD_TYPE_SDIW62X (CARD_TYPE_IW62X | (INTF_SD << 8)) -/** SD_IW62X card type */ +/** SD_IW624 card type */ +#define CARD_TYPE_SDIW624 (CARD_TYPE_IW624 | (INTF_SD << 8)) +/** SD_IW624 card type */ #define CARD_TYPE_SDAW693 (CARD_TYPE_AW693 | (INTF_SD << 8)) #define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct)) @@ -423,7 +431,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct)) #define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct)) #define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct)) -#define IS_SDIW62X(ct) (CARD_TYPE_SDIW62X == (ct)) +#define IS_SDIW624(ct) (CARD_TYPE_SDIW624 == (ct)) #define IS_SDAW693(ct) (CARD_TYPE_SDAW693 == (ct)) /** SD8887 Card */ @@ -446,8 +454,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_SD9177 "SDIW612" /** SD8801 Card */ #define CARD_SD8801 "SD8801" -/** SDIW62X Card */ -#define CARD_SDIW62X "SDIW62X" +/** SDIW624 Card */ +#define CARD_SDIW624 "SDIW624" /** SDAW693 Card */ #define CARD_SDAW693 "SDAW693" #endif @@ -461,8 +469,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8)) /** PCIE9098 card type */ #define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8)) -/** PCIEIW62X card type */ -#define CARD_TYPE_PCIEIW62X (CARD_TYPE_IW62X | (INTF_PCIE << 8)) +/** PCIEIW624 card type */ +#define CARD_TYPE_PCIEIW624 (CARD_TYPE_IW624 | (INTF_PCIE << 8)) /** PCIEAW693 card type */ #define CARD_TYPE_PCIEAW693 (CARD_TYPE_AW693 | (INTF_PCIE << 8)) @@ -470,7 +478,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct)) #define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct)) #define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct)) -#define IS_PCIEIW62X(ct) (CARD_TYPE_PCIEIW62X == (ct)) +#define IS_PCIEIW624(ct) (CARD_TYPE_PCIEIW624 == (ct)) #define IS_PCIEAW693(ct) (CARD_TYPE_PCIEAW693 == (ct)) /** PCIE8897 Card */ @@ -485,8 +493,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_PCIE9098 "PCIE9098" /** PCIEAW690 Card */ #define CARD_PCIEAW690 "PCIEAW690" -/** PCIEIW62X Card */ -#define CARD_PCIEIW62X "PCIEIW62X" +/** PCIEIW624 Card */ +#define CARD_PCIEIW624 "PCIEIW624" /** PCIEAW693 Card */ #define CARD_PCIEAW693 "PCIEAW693" /** PCIEIW629 Card */ @@ -506,8 +514,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8)) /** USB9097 card type */ #define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8)) -/** USBIW62X card type */ -#define CARD_TYPE_USBIW62X (CARD_TYPE_IW62X | (INTF_USB << 8)) +/** USBIW624 card type */ +#define CARD_TYPE_USBIW624 (CARD_TYPE_IW624 | (INTF_USB << 8)) #define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct)) #define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct)) @@ -515,7 +523,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct)) #define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct)) #define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct)) -#define IS_USBIW62X(ct) (CARD_TYPE_USBIW62X == (ct)) +#define IS_USBIW624(ct) (CARD_TYPE_USBIW624 == (ct)) /** USB8801 Card */ #define CARD_USB8801 "USB8801" @@ -529,8 +537,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_USB9098 "USB9098" /** USB9097 Card */ #define CARD_USB9097 "USBIW620" -/** USBIW62X Card */ -#define CARD_USBIW62X "USBIW62X" +/** USBIW624 Card */ +#define CARD_USBIW624 "USBIW624" #endif #define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf)) @@ -542,7 +550,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf)) #define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf)) #define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf)) -#define IS_CARDIW62X(ct) (CARD_TYPE_IW62X == ((ct)&0xf)) +#define IS_CARDIW624(ct) (CARD_TYPE_IW624 == ((ct)&0xf)) #define IS_CARDAW693(ct) (CARD_TYPE_AW693 == ((ct)&0xf)) typedef struct _card_type_entry { @@ -613,8 +621,6 @@ typedef enum { #define MLAN_BUF_FLAG_TX_CTRL MBIT(14) -#define MLAN_BUF_FLAG_EASYMESH MBIT(16) - #define MLAN_BUF_FLAG_MC_AGGR_PKT MBIT(17) #ifdef DEBUG_LEVEL1 @@ -701,7 +707,6 @@ typedef enum _mlan_buf_type { MLAN_BUF_TYPE_EVENT, MLAN_BUF_TYPE_RAW_DATA, #ifdef SDIO - MLAN_BUF_TYPE_SPA_DATA, #endif } mlan_buf_type; @@ -844,6 +849,13 @@ typedef enum _mlan_event_id { MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028, MLAN_EVENT_ID_DRV_WIFI_STATUS = 0x80000029, MLAN_EVENT_ID_STORE_HOST_CMD_RESP = 0x80000030, + MLAN_EVENT_ID_DRV_ADDBA_TIMEOUT = 0x80000031, +#ifdef PCIE + MLAN_EVENT_ID_DRV_DEFER_RX_DATA = 0x80000032, + MLAN_EVENT_ID_DRV_DEFER_RX_EVENT = 0x80000033, + MLAN_EVENT_ID_DRV_DEFER_CMDRESP = 0x80000034, + MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035, +#endif } mlan_event_id; /** Data Structures */ @@ -985,14 +997,14 @@ typedef enum _dfs_moe_t { /** Band_Config_t */ typedef MLAN_PACK_START struct _Band_Config_t { #ifdef BIG_ENDIAN_SUPPORT - /** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/ - t_u8 scanMode : 2; - /** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */ - t_u8 chan2Offset : 2; /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */ t_u8 chanWidth : 2; /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; + /** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/ + t_u8 scanMode : 2; + /** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */ + t_u8 chan2Offset : 2; #else /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; @@ -1323,8 +1335,6 @@ typedef struct _mlan_buffer { t_u32 extra_ts_sec; /** Time stamp when packet is dequed from rx_q(micro seconds) */ t_u32 extra_ts_usec; - /** When TX ra mac address, When Rx Ta mac address*/ - t_u8 mac[MLAN_MAC_ADDR_LENGTH]; /** Fields below are valid for MLAN module only */ /** Pointer to parent mlan_buffer */ struct _mlan_buffer *pparent; @@ -1715,6 +1725,14 @@ typedef struct _tdls_tear_down_event { t_u16 reason_code; } tdls_tear_down_event; +/** Event structure for addba timeout */ +typedef struct _addba_timeout_event { + /** Peer mac address */ + t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH]; + /** Tid */ + t_u8 tid; +} addba_timeout_event; + /** channel width */ typedef enum wifi_channel_width { WIFI_CHAN_WIDTH_20 = 0, @@ -2516,12 +2534,6 @@ typedef struct _mlan_callbacks { t_void (*moal_updata_peer_signal)(t_void *pmoal, t_u32 bss_index, t_u8 *peer_addr, t_s8 snr, t_s8 nflr); t_u64 (*moal_do_div)(t_u64 num, t_u32 base); -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - mlan_status (*moal_wait_hostcmd_complete)(t_void *pmoal, - t_u32 bss_index); - mlan_status (*moal_notify_hostcmd_complete)(t_void *pmoal, - t_u32 bss_index); -#endif void (*moal_tp_accounting)(t_void *pmoal, t_void *buf, t_u32 drop_point); void (*moal_tp_accounting_rx_param)(t_void *pmoal, unsigned int type, @@ -2610,8 +2622,6 @@ typedef struct _mlan_device { /** SDIO MPA Rx */ t_u32 mpa_rx_cfg; #ifdef SDIO - /** SDIO Single port rx aggr */ - t_u8 sdio_rx_aggr_enable; /* see blk_queue_max_segment_size */ t_u32 max_seg_size; /* see blk_queue_max_segments */ @@ -2680,6 +2690,8 @@ typedef struct _mlan_device { t_u8 mcs32; /** second mac flag */ t_u8 second_mac; + /** napi */ + t_u8 napi; } mlan_device, *pmlan_device; /** MLAN API function prototype */ @@ -2760,6 +2772,9 @@ MLAN_API t_u8 mlan_select_wmm_queue(t_void *padapter, t_u8 bss_num, t_u8 tid); MLAN_API mlan_status mlan_disable_host_int(t_void *padapter); /** mlan unmask host interrupt */ MLAN_API mlan_status mlan_enable_host_int(t_void *padapter); +#ifdef PCIE +MLAN_API void mlan_process_pcie_interrupt_cb(t_void *pmadapter, int type); +#endif #define CSI_SIGNATURE 0xABCD diff --git a/mxm_wifiex/wlan_src/mlan/mlan_event_ids.h b/mxm_wifiex/wlan_src/mlan/mlan_event_ids.h new file mode 100644 index 0000000..c1c661d --- /dev/null +++ b/mxm_wifiex/wlan_src/mlan/mlan_event_ids.h @@ -0,0 +1,217 @@ +/** @file mlan_event_ids.h + * + * @brief This file contains FW event ID definitions. + * + * + * Copyright 2023 NXP + * + * This software file (the File) is distributed by NXP + * under the terms of the GNU General Public License Version 2, June 1991 + * (the License). You may use, redistribute and/or modify the File in + * accordance with the terms and conditions of the License, a copy of which + * is available by writing to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the + * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + * + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about + * this warranty disclaimer. + * + */ + +/* include guard is absent intentionally */ + +/* FW -> Host Event ID Constants */ + +/** Card Event definition : Dummy host wakeup signal */ +ENUM_ELEMENT(EVENT_DUMMY_HOST_WAKEUP_SIGNAL, 0x0001), + /** Card Event definition : Link lost */ + ENUM_ELEMENT(EVENT_LINK_LOST, 0x0003), + /** Card Event definition : Link sensed */ + ENUM_ELEMENT(EVENT_LINK_SENSED, 0x0004), + /** Card Event definition : MIB changed */ + ENUM_ELEMENT(EVENT_MIB_CHANGED, 0x0006), + /** Card Event definition : Init done */ + ENUM_ELEMENT(EVENT_INIT_DONE, 0x0007), + /** Card Event definition : Deauthenticated */ + ENUM_ELEMENT(EVENT_DEAUTHENTICATED, 0x0008), + /** Card Event definition : Disassociated */ + ENUM_ELEMENT(EVENT_DISASSOCIATED, 0x0009), + /** Card Event definition : Power save awake */ + ENUM_ELEMENT(EVENT_PS_AWAKE, 0x000a), + /** Card Event definition : Power save sleep */ + ENUM_ELEMENT(EVENT_PS_SLEEP, 0x000b), + /** Card Event definition : MIC error multicast */ + ENUM_ELEMENT(EVENT_MIC_ERR_MULTICAST, 0x000d), + /** Card Event definition : MIC error unicast */ + ENUM_ELEMENT(EVENT_MIC_ERR_UNICAST, 0x000e), + + /** Card Event definition : Ad-Hoc BCN lost */ + ENUM_ELEMENT(EVENT_ADHOC_BCN_LOST, 0x0011), + + /** Card Event definition : Stop Tx */ + ENUM_ELEMENT(EVENT_STOP_TX, 0x0013), + /** Card Event definition : Start Tx */ + ENUM_ELEMENT(EVENT_START_TX, 0x0014), + /** Card Event definition : Channel switch */ + ENUM_ELEMENT(EVENT_CHANNEL_SWITCH, 0x0015), + + /** Card Event definition : MEAS report ready */ + ENUM_ELEMENT(EVENT_MEAS_REPORT_RDY, 0x0016), + + /** Card Event definition : WMM status change */ + ENUM_ELEMENT(EVENT_WMM_STATUS_CHANGE, 0x0017), + + /** Card Event definition : BG scan report */ + ENUM_ELEMENT(EVENT_BG_SCAN_REPORT, 0x0018), + /** Card Event definition : BG scan stopped */ + ENUM_ELEMENT(EVENT_BG_SCAN_STOPPED, 0x0065), + + /** Card Event definition : Beacon RSSI low */ + ENUM_ELEMENT(EVENT_RSSI_LOW, 0x0019), + /** Card Event definition : Beacon SNR low */ + ENUM_ELEMENT(EVENT_SNR_LOW, 0x001a), + /** Card Event definition : Maximum fail */ + ENUM_ELEMENT(EVENT_MAX_FAIL, 0x001b), + /** Card Event definition : Beacon RSSI high */ + ENUM_ELEMENT(EVENT_RSSI_HIGH, 0x001c), + /** Card Event definition : Beacon SNR high */ + ENUM_ELEMENT(EVENT_SNR_HIGH, 0x001d), + + /** Card Event definition : IBSS coalsced */ + ENUM_ELEMENT(EVENT_IBSS_COALESCED, 0x001e), + + /** Event definition : IBSS station connected */ + ENUM_ELEMENT(EVENT_IBSS_STATION_CONNECT, 0x0020), + /** Event definition : IBSS station dis-connected */ + ENUM_ELEMENT(EVENT_IBSS_STATION_DISCONNECT, 0x0021), + + /** Card Event definition : Data RSSI low */ + ENUM_ELEMENT(EVENT_DATA_RSSI_LOW, 0x0024), + /** Card Event definition : Data SNR low */ + ENUM_ELEMENT(EVENT_DATA_SNR_LOW, 0x0025), + /** Card Event definition : Data RSSI high */ + ENUM_ELEMENT(EVENT_DATA_RSSI_HIGH, 0x0026), + /** Card Event definition : Data SNR high */ + ENUM_ELEMENT(EVENT_DATA_SNR_HIGH, 0x0027), + + /** Card Event definition : Link Quality */ + ENUM_ELEMENT(EVENT_LINK_QUALITY, 0x0028), + + /** Card Event definition : Port release event */ + ENUM_ELEMENT(EVENT_PORT_RELEASE, 0x002b), + +#ifdef UAP_SUPPORT + /** Event ID: STA deauth */ + ENUM_ELEMENT(EVENT_MICRO_AP_STA_DEAUTH, 0x002c), + /** Event ID: STA assoicated */ + ENUM_ELEMENT(EVENT_MICRO_AP_STA_ASSOC, 0x002d), + /** Event ID: BSS started */ + ENUM_ELEMENT(EVENT_MICRO_AP_BSS_START, 0x002e), + /** Event ID: BSS idle event */ + ENUM_ELEMENT(EVENT_MICRO_AP_BSS_IDLE, 0x0043), + /** Event ID: BSS active event */ + ENUM_ELEMENT(EVENT_MICRO_AP_BSS_ACTIVE, 0x0044), + + /** Event ID: MIC countermeasures event */ + ENUM_ELEMENT(EVENT_MICRO_AP_MIC_COUNTERMEASURES, 0x004c), +#endif /* UAP_SUPPORT */ + + /** Card Event definition : Pre-Beacon Lost */ + ENUM_ELEMENT(EVENT_PRE_BEACON_LOST, 0x0031), + + ENUM_ELEMENT(EVENT_WATCHDOG_TMOUT, 0x0032), + + /** Card Event definition : Add BA event */ + ENUM_ELEMENT(EVENT_ADDBA, 0x0033), + /** Card Event definition : Del BA event */ + ENUM_ELEMENT(EVENT_DELBA, 0x0034), + /** Card Event definition: BA stream timeout*/ + ENUM_ELEMENT(EVENT_BA_STREAM_TIMEOUT, 0x0037), + + /** Card Event definition : AMSDU aggr control */ + ENUM_ELEMENT(EVENT_AMSDU_AGGR_CTRL, 0x0042), + + /** Card Event definition: WEP ICV error */ + ENUM_ELEMENT(EVENT_WEP_ICV_ERR, 0x0046), + + /** Card Event definition : Host sleep enable */ + ENUM_ELEMENT(EVENT_HS_ACT_REQ, 0x0047), + + /** Card Event definition : BW changed */ + ENUM_ELEMENT(EVENT_BW_CHANGE, 0x0048), + +#ifdef WIFI_DIRECT_SUPPORT + /** WIFIDIRECT generic event */ + ENUM_ELEMENT(EVENT_WIFIDIRECT_GENERIC_EVENT, 0x0049), + /** WIFIDIRECT service discovery event */ + ENUM_ELEMENT(EVENT_WIFIDIRECT_SERVICE_DISCOVERY, 0x004a), +#endif + /** Remain on Channel expired event */ + ENUM_ELEMENT(EVENT_REMAIN_ON_CHANNEL_EXPIRED, 0x005f), + + /** TDLS generic event */ + ENUM_ELEMENT(EVENT_TDLS_GENERIC_EVENT, 0x0052), + + ENUM_ELEMENT(EVENT_MEF_HOST_WAKEUP, 0x004f), + + /** Card Event definition: Channel switch pending announcment */ + ENUM_ELEMENT(EVENT_CHANNEL_SWITCH_ANN, 0x0050), + + /** Event definition: Radar Detected by card */ + ENUM_ELEMENT(EVENT_RADAR_DETECTED, 0x0053), + + /** Event definition: Radar Detected by card */ + ENUM_ELEMENT(EVENT_CHANNEL_REPORT_RDY, 0x0054), + + /** Event definition: Scan results through event */ + ENUM_ELEMENT(EVENT_EXT_SCAN_REPORT, 0x0058), + /** Enhance ext scan done event */ + ENUM_ELEMENT(EVENT_EXT_SCAN_STATUS_REPORT, 0x007f), + + /** Event definition: RXBA_SYNC */ + ENUM_ELEMENT(EVENT_RXBA_SYNC, 0x0059), + + /** Event ID: TX data pause event */ + ENUM_ELEMENT(EVENT_TX_DATA_PAUSE, 0x0055), + + /** Event definition : FW debug information */ + ENUM_ELEMENT(EVENT_FW_DEBUG_INFO, 0x0063), + + /** Event ID: SAD Report */ + ENUM_ELEMENT(EVENT_SAD_REPORT, 0x0066), + + /** Event ID: Multi Chan Info*/ + ENUM_ELEMENT(EVENT_MULTI_CHAN_INFO, 0x006a), + + ENUM_ELEMENT(EVENT_FW_DUMP_INFO, 0x0073), + /** Event ID: Tx status */ + ENUM_ELEMENT(EVENT_TX_STATUS_REPORT, 0x0074), + + ENUM_ELEMENT(EVENT_BT_COEX_WLAN_PARA_CHANGE, 0x0076), + + ENUM_ELEMENT(EVENT_VDLL_IND, 0x0081), + + ENUM_ELEMENT(EVENT_ROAM_OFFLOAD, 0x0083), + + ENUM_ELEMENT(EVENT_WLS_FTM_COMPLETE, 0x0086), + + ENUM_ELEMENT(EVENT_EXCEED_MAX_P2P_CONN, 0x0089), + +#if defined(PCIE) + ENUM_ELEMENT(EVENT_SSU_DUMP_DMA, 0x008C), +#endif + + ENUM_ELEMENT(EVENT_CSI, 0x008D), + ENUM_ELEMENT(EVENT_FW_HANG_REPORT, 0x008F), + /** Card Event definition : RESET PN */ + + ENUM_ELEMENT(EVENT_ASSOC_REQ_IE, 0x0095), + + ENUM_ELEMENT(EVENT_CHAN_LOAD, 0x0099), + + ENUM_ELEMENT(EVENT_IMD3_CAL_START, 0x00A0), + ENUM_ELEMENT(EVENT_IMD3_CAL_END, 0x00A1), + + /* Always keep this last */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_fw.h b/mxm_wifiex/wlan_src/mlan/mlan_fw.h index 1d8dd99..69d50d1 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_fw.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_fw.h @@ -334,9 +334,6 @@ typedef enum _WLAN_802_11_WEP_STATUS { /**TLV type : Host MLME Flag*/ #define TLV_TYPE_HOST_MLME (PROPRIETARY_TLV_BASE_ID + 307) -/** TLV type: MULTI AP Flag */ -#define TLV_TYPE_MULTI_AP (PROPRIETARY_TLV_BASE_ID + 326) - /** TLV type : AP wacp mode */ #define TLV_TYPE_UAP_WACP_MODE (PROPRIETARY_TLV_BASE_ID + 0x147) /* 0x0247 */ @@ -1138,263 +1135,25 @@ typedef enum _WLAN_802_11_WEP_STATUS { #define TLV_TYPE_BSS_MODE (PROPRIETARY_TLV_BASE_ID + 0xce) /* 0x01ce */ /** Firmware Host Command ID Constants */ -/** Host Command ID : Get hardware specifications */ -#define HostCmd_CMD_GET_HW_SPEC 0x0003 -/** Host Command ID : 802.11 scan */ -#define HostCmd_CMD_802_11_SCAN 0x0006 -/** Host Command ID : 802.11 get log */ -#define HostCmd_CMD_802_11_GET_LOG 0x000b -/** Host Command id: GET_TX_RX_PKT_STATS */ -#define HOST_CMD_TX_RX_PKT_STATS 0x008d +#define ENUM_ELEMENT(name, id) name = id +#define ENUM_ELEMENT_LAST(name) name +enum host_cmd_id { +#include "mlan_hostcmd_ids.h" +}; +#undef ENUM_ELEMENT +#undef ENUM_ELEMENT_LAST -/** Host Command ID : 802.11 get/set link layer statistic */ -#define HostCmd_CMD_802_11_LINK_STATS 0x0256 - -/** Host Command ID : MAC multicast address */ -#define HostCmd_CMD_MAC_MULTICAST_ADR 0x0010 -/** Host Command ID : 802.11 EEPROM access */ -#define HostCmd_CMD_802_11_EEPROM_ACCESS 0x0059 -/** Host Command ID : 802.11 associate */ -#define HostCmd_CMD_802_11_ASSOCIATE 0x0012 - -/** Host Command ID : 802.11 SNMP MIB */ -#define HostCmd_CMD_802_11_SNMP_MIB 0x0016 -/** Host Command ID : MAC register access */ -#define HostCmd_CMD_MAC_REG_ACCESS 0x0019 -/** Host Command ID : BBP register access */ -#define HostCmd_CMD_BBP_REG_ACCESS 0x001a -/** Host Command ID : RF register access */ -#define HostCmd_CMD_RF_REG_ACCESS 0x001b - -/** Host Command ID : 802.11 radio control */ -#define HostCmd_CMD_802_11_RADIO_CONTROL 0x001c -/** Host Command ID : 802.11 RF channel */ -#define HostCmd_CMD_802_11_RF_CHANNEL 0x001d -/** Host Command ID : 802.11 RF Tx power */ -#define HostCmd_CMD_802_11_RF_TX_POWER 0x001e - -/** Host Command ID : 802.11 RF antenna */ -#define HostCmd_CMD_802_11_RF_ANTENNA 0x0020 - -/** Host Command ID : 802.11 deauthenticate */ -#define HostCmd_CMD_802_11_DEAUTHENTICATE 0x0024 -/** Host Command ID: 802.11 disassoicate */ -#define HostCmd_CMD_802_11_DISASSOCIATE 0x0026 -/** Host Command ID : MAC control */ -#define HostCmd_CMD_MAC_CONTROL 0x0028 -/** Host Command ID : 802.11 Ad-Hoc start */ -#define HostCmd_CMD_802_11_AD_HOC_START 0x002b -/** Host Command ID : 802.11 Ad-Hoc join */ -#define HostCmd_CMD_802_11_AD_HOC_JOIN 0x002c - -/** Host Command ID: CW Mode */ -#define HostCmd_CMD_CW_MODE_CTRL 0x0239 -/** Host Command ID : 802.11 key material */ -#define HostCmd_CMD_802_11_KEY_MATERIAL 0x005e - -/** Host Command ID : 802.11 Ad-Hoc stop */ -#define HostCmd_CMD_802_11_AD_HOC_STOP 0x0040 - -/** Host Command ID : 802.22 MAC address */ -#define HostCmd_CMD_802_11_MAC_ADDRESS 0x004D - -/** Host Command ID : WMM Traffic Stream Status */ -#define HostCmd_CMD_WMM_TS_STATUS 0x005d - -/** Host Command ID : 802.11 D domain information */ -#define HostCmd_CMD_802_11D_DOMAIN_INFO 0x005b - -/*This command gets/sets the Transmit Rate-based Power Control (TRPC) channel - * configuration.*/ -#define HostCmd_CHANNEL_TRPC_CONFIG 0x00fb - -/** Host Command ID : 802.11 TPC information */ -#define HostCmd_CMD_802_11_TPC_INFO 0x005f -/** Host Command ID : 802.11 TPC adapt req */ -#define HostCmd_CMD_802_11_TPC_ADAPT_REQ 0x0060 -/** Host Command ID : 802.11 channel SW ann */ -#define HostCmd_CMD_802_11_CHAN_SW_ANN 0x0061 - -/** Host Command ID : Measurement request */ -#define HostCmd_CMD_MEASUREMENT_REQUEST 0x0062 -/** Host Command ID : Measurement report */ -#define HostCmd_CMD_MEASUREMENT_REPORT 0x0063 - -/** Host Command ID : 802.11 sleep parameters */ -#define HostCmd_CMD_802_11_SLEEP_PARAMS 0x0066 - -/** Host Command ID : 802.11 ps inactivity timeout */ -#define HostCmd_CMD_802_11_PS_INACTIVITY_TIMEOUT 0x0067 - -/** Host Command ID : 802.11 sleep period */ -#define HostCmd_CMD_802_11_SLEEP_PERIOD 0x0068 - -/** Host Command ID: 802.11 BG scan config */ -#define HostCmd_CMD_802_11_BG_SCAN_CONFIG 0x006b -/** Host Command ID : 802.11 BG scan query */ -#define HostCmd_CMD_802_11_BG_SCAN_QUERY 0x006c - -/** Host Command ID : WMM ADDTS req */ -#define HostCmd_CMD_WMM_ADDTS_REQ 0x006E -/** Host Command ID : WMM DELTS req */ -#define HostCmd_CMD_WMM_DELTS_REQ 0x006F -/** Host Command ID : WMM queue configuration */ -#define HostCmd_CMD_WMM_QUEUE_CONFIG 0x0070 -/** Host Command ID : 802.11 get status */ -#define HostCmd_CMD_WMM_GET_STATUS 0x0071 - -/** Host Command ID : 802.11 subscribe event */ -#define HostCmd_CMD_802_11_SUBSCRIBE_EVENT 0x0075 - -/** Host Command ID : 802.11 Tx rate query */ -#define HostCmd_CMD_802_11_TX_RATE_QUERY 0x007f -/** Host Command ID :Get timestamp value */ -#define HostCmd_CMD_GET_TSF 0x0080 - -/** Host Command ID : WMM queue stats */ -#define HostCmd_CMD_WMM_QUEUE_STATS 0x0081 - -/** Host Command ID : KEEP ALIVE command */ -#define HostCmd_CMD_AUTO_TX 0x0082 - -/** Host Command ID : 802.11 IBSS coalescing status */ -#define HostCmd_CMD_802_11_IBSS_COALESCING_STATUS 0x0083 - -/** Host Command ID : Memory access */ -#define HostCmd_CMD_MEM_ACCESS 0x0086 - -#if defined(SDIO) -/** Host Command ID : SDIO GPIO interrupt configuration */ -#define HostCmd_CMD_SDIO_GPIO_INT_CONFIG 0x0088 -#endif - -/** Host Command ID : Mfg command */ -#define HostCmd_CMD_MFG_COMMAND 0x0089 -/** Host Command ID : Inactivity timeout ext */ -#define HostCmd_CMD_INACTIVITY_TIMEOUT_EXT 0x008a - -/** Host Command ID : DBGS configuration */ -#define HostCmd_CMD_DBGS_CFG 0x008b -/** Host Command ID : Get memory */ -#define HostCmd_CMD_GET_MEM 0x008c - -/** Host Command ID : Cal data dnld */ -#define HostCmd_CMD_CFG_DATA 0x008f - -/** Host Command ID : SDIO pull control */ -#define HostCmd_CMD_SDIO_PULL_CTRL 0x0093 - -/** Host Command ID : ECL system clock configuration */ -#define HostCmd_CMD_ECL_SYSTEM_CLOCK_CONFIG 0x0094 - -/** Host Command ID : Extended version */ -#define HostCmd_CMD_VERSION_EXT 0x0097 - -/** Host Command ID : MEF configuration */ -#define HostCmd_CMD_MEF_CFG 0x009a -/** Host Command ID : 802.11 RSSI INFO*/ -#define HostCmd_CMD_RSSI_INFO 0x00a4 -/** Host Command ID : Function initialization */ -#define HostCmd_CMD_FUNC_INIT 0x00a9 -/** Host Command ID : Function shutdown */ -#define HostCmd_CMD_FUNC_SHUTDOWN 0x00aa - -/** Host Command ID : Robustcoex */ -#define HostCmd_CMD_802_11_ROBUSTCOEX 0x00e0 - -/** Host Command ID :EAPOL PKT */ -#define HostCmd_CMD_802_11_EAPOL_PKT 0x012e - -/** Host Command ID :MIMO SWITCH **/ -#define HostCmd_CMD_802_11_MIMO_SWITCH 0x0235 - -/** Host Command ID : 802.11 RSSI INFO EXT*/ -#define HostCmd_CMD_RSSI_INFO_EXT 0x0237 -/** Host Command ID : ROAMING OFFLOAD TO FW*/ -#define HostCmd_CMD_ROAM_OFFLOAD 0x0245 - -/** Host Command ID: Multi chan config */ -#define HostCmd_CMD_MULTI_CHAN_CONFIG 0x011e -/** Host Command ID: Multi chan policy */ -#define HostCmd_CMD_MULTI_CHAN_POLICY 0x0121 /** TLV ID for multi chan info */ #define TLV_TYPE_MULTI_CHAN_INFO (PROPRIETARY_TLV_BASE_ID + 0xb7) /** TLV ID for multi chan group info */ #define TLV_TYPE_MULTI_CHAN_GROUP_INFO_TLV_ID (PROPRIETARY_TLV_BASE_ID + 0xb8) /** TLV ID for DRCS TimeSlice */ #define MRVL_DRCS_TIME_SLICE_TLV_ID (PROPRIETARY_TLV_BASE_ID + 263) -/** Host Command ID: DRCS config */ -#define HostCmd_CMD_DRCS_CONFIG 0x024a #define TLV_TYPE_PREV_BSSID (PROPRIETARY_TLV_BASE_ID + 330) -/** Host Command ID : Channel report request */ -#define HostCmd_CMD_CHAN_REPORT_REQUEST 0x00dd - -/** Host Command ID: SUPPLICANT_PMK */ -#define HostCmd_CMD_SUPPLICANT_PMK 0x00c4 -/** Host Command ID: SUPPLICANT_PROFILE */ -#define HostCmd_CMD_SUPPLICANT_PROFILE 0x00c5 - -/** Host Command ID : Add Block Ack Request */ -#define HostCmd_CMD_11N_ADDBA_REQ 0x00ce -/** Host Command ID : Delete a Block Ack Request */ -#define HostCmd_CMD_11N_CFG 0x00cd -/** Host Command ID : Add Block Ack Response */ -#define HostCmd_CMD_11N_ADDBA_RSP 0x00cf -/** Host Command ID : Delete a Block Ack Request */ -#define HostCmd_CMD_11N_DELBA 0x00d0 -/** Host Command ID: Configure Tx Buf size */ -#define HostCmd_CMD_RECONFIGURE_TX_BUFF 0x00d9 -/** Host Command ID: AMSDU Aggr Ctrl */ -#define HostCmd_CMD_AMSDU_AGGR_CTRL 0x00df -/** Host Command ID: 11AC config */ -#define HostCmd_CMD_11AC_CFG 0x0112 -/** Host Command ID: Configure TX Beamforming capability */ -#define HostCmd_CMD_TX_BF_CFG 0x0104 - -/** Host Command ID : 802.11 TX power configuration */ -#define HostCmd_CMD_TXPWR_CFG 0x00d1 - -/** Host Command ID : Soft Reset */ -#define HostCmd_CMD_SOFT_RESET 0x00d5 - -/** Host Command ID : 802.11 b/g/n rate configration */ -#define HostCmd_CMD_TX_RATE_CFG 0x00d6 - -/** Host Command ID : Enhanced PS mode */ -#define HostCmd_CMD_802_11_PS_MODE_ENH 0x00e4 - -/** Host command action : Host sleep configuration */ -#define HostCmd_CMD_802_11_HS_CFG_ENH 0x00e5 - -/** Host Command ID : CAU register access */ -#define HostCmd_CMD_CAU_REG_ACCESS 0x00ed - -/** Host Command ID : mgmt IE list */ -#define HostCmd_CMD_MGMT_IE_LIST 0x00f2 - -#define HostCmd_CMD_802_11_BAND_STEERING 0x026f -/*** Host Command ID " MC_AGGR_CFG */ -#define HostCmd_CMD_MC_AGGR_CFG 0x027a -#define HostCmd_CMD_802_11_STATS 0x0014 -#define HostCmd_CMD_GET_CH_LOAD 0x027b - -/** Host Command ID: CROSS CHIP SYNCH */ -#define HostCmd_CMD_CROSS_CHIP_SYNCH 0x027d - -/** Host Command ID : TDLS configuration */ -#define HostCmd_CMD_TDLS_CONFIG 0x0100 -/** Host Command ID : TDLS operation */ -#define HostCmd_CMD_TDLS_OPERATION 0x0122 - #ifdef SDIO -/** Host Command ID : SDIO single port RX aggr */ -#define HostCmd_CMD_SDIO_SP_RX_AGGR_CFG 0x0223 - -/** fw_cap_info bit16 for sdio sp rx aggr flag*/ -#define SDIO_SP_RX_AGGR_ENABLE MBIT(16) #endif @@ -1586,114 +1345,6 @@ 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) -/** Host Command ID : Extended scan support */ -#define HostCmd_CMD_802_11_SCAN_EXT 0x0107 - -/** Host Command ID : Forward mgmt frame */ -#define HostCmd_CMD_RX_MGMT_IND 0x010c - -#ifdef PCIE -/** Host Command ID: Host buffer description */ -#define HostCmd_CMD_PCIE_HOST_BUF_DETAILS 0x00fa -#endif - -/** Host Command ID : Set BSS_MODE */ -#define HostCmd_CMD_SET_BSS_MODE 0x00f7 - -#ifdef UAP_SUPPORT -/** Host Command id: SYS_INFO */ -#define HOST_CMD_APCMD_SYS_INFO 0x00ae -/** Host Command id: sys_reset */ -#define HOST_CMD_APCMD_SYS_RESET 0x00af -/** Host Command id: SYS_CONFIGURE */ -#define HOST_CMD_APCMD_SYS_CONFIGURE 0x00b0 -/** Host Command id: BSS_START */ -#define HOST_CMD_APCMD_BSS_START 0x00b1 -/** Host Command id: BSS_STOP */ -#define HOST_CMD_APCMD_BSS_STOP 0x00b2 -/** Host Command id: sta_list */ -#define HOST_CMD_APCMD_STA_LIST 0x00b3 -/** Host Command id: STA_DEAUTH */ -#define HOST_CMD_APCMD_STA_DEAUTH 0x00b5 - -/** Host Command id: REPORT_MIC */ -#define HOST_CMD_APCMD_REPORT_MIC 0x00ee -/** Host Command id: UAP_OPER_CTRL */ -#define HOST_CMD_APCMD_OPER_CTRL 0x0233 -#endif /* UAP_SUPPORT */ - -/** Host Command id: PMIC CONFIGURE*/ -#define HOST_CMD_PMIC_CONFIGURE 0x23E - -/** Host Command ID: 802.11 Network Monitor */ -#define HostCmd_CMD_802_11_NET_MONITOR 0x0102 - -/** Host Command ID: Tx data pause */ -#define HostCmd_CMD_CFG_TX_DATA_PAUSE 0x0103 - -#ifdef WIFI_DIRECT_SUPPORT -/** Host Command ID: P2P PARAMS CONFIG */ -#define HOST_CMD_P2P_PARAMS_CONFIG 0x00ea -/** Host Command ID: WIFI_DIRECT_MODE_CONFIG */ -#define HOST_CMD_WIFI_DIRECT_MODE_CONFIG 0x00eb -#endif - -/** Host Command ID: GPIO TSF LATCH */ -#define HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG 0x0278 -/** Host Command ID: Remain On Channel */ -#define HostCmd_CMD_802_11_REMAIN_ON_CHANNEL 0x010d - -#define HostCmd_CMD_COALESCE_CFG 0x010a - -/** Host Command ID: GTK REKEY OFFLOAD CFG */ -#define HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG 0x010f - -/** Host Command ID : OTP user data */ -#define HostCmd_CMD_OTP_READ_USER_DATA 0x0114 - -/** Host Command ID: fw auto reconnect */ -#define HostCmd_CMD_FW_AUTO_RECONNECT 0x0115 - -/** Host Command ID: HS wakeup reason */ -#define HostCmd_CMD_HS_WAKEUP_REASON 0x0116 - -/** Host Command ID: reject addba request */ -#define HostCmd_CMD_REJECT_ADDBA_REQ 0x0119 - -#define HostCmd_CMD_FW_DUMP_EVENT 0x0125 - -#define HostCMD_CONFIG_LOW_POWER_MODE 0x0128 - -/** Host Command ID : Target device access */ -#define HostCmd_CMD_TARGET_ACCESS 0x012a - -/** Host Command ID: BCA device access */ -#define HostCmd_CMD_BCA_REG_ACCESS 0x0272 -/** Host Command ID: register device access */ -#define HostCmd_CMD_REG_ACCESS 0x027C - -/** Host Command ID: DFS repeater mode */ -#define HostCmd_DFS_REPEATER_MODE 0x012b - -/** Host Command ID: ACS scan */ -#define HostCMD_APCMD_ACS_SCAN 0x0224 - -/** Host Command ID: Get sensor temp*/ -#define HostCmd_DS_GET_SENSOR_TEMP 0x0227 - -/** Host Command ID : Configure ADHOC_OVER_IP parameters */ -#define HostCmd_CMD_WMM_PARAM_CONFIG 0x023a - -#define HostCmd_CMD_IPV6_RA_OFFLOAD_CFG 0x0238 - -#ifdef STA_SUPPORT -/** Host Command ID : set/get sta configure */ -#define HostCmd_CMD_STA_CONFIGURE 0x023f -#endif - -/** Host Command ID : GPIO independent reset configure */ -#define HostCmd_CMD_INDEPENDENT_RESET_CFG 0x0243 - /* TLV type: reg type */ #define TLV_TYPE_REG_ACCESS_CTRL (PROPRIETARY_TLV_BASE_ID + 0x13C) /* 0x023c*/ /** MrvlIEtypes_Reg_type_t*/ @@ -1703,10 +1354,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Reg_type_t { /** type: 0x81/0x82/0x83 */ t_u8 type; } MLAN_PACK_END MrvlIEtypes_Reg_type_t; -/** use to query chan region cfg setting in firmware */ -#define HostCmd_CMD_CHAN_REGION_CFG 0x0242 -/** used in hostcmd to download region power cfg setting to firmware */ -#define HostCmd_CMD_REGION_POWER_CFG 0x0249 /* mod_grp */ typedef enum _mod_grp { @@ -1758,55 +1405,15 @@ typedef MLAN_PACK_START struct _power_table_attr { #define FW_CFP_TABLE_MAX_ROWS_A 39 #define FW_CFP_TABLE_MAX_COLS_A 29 -#define HostCmd_CMD_DYN_BW 0x0252 - -#define HostCmd_CMD_BOOT_SLEEP 0x0258 - -#define HostCmd_CMD_RX_ABORT_CFG 0x0261 -#define HostCmd_CMD_RX_ABORT_CFG_EXT 0x0262 -#define HostCmd_CMD_TX_AMPDU_PROT_MODE 0x0263 -#define HostCmd_CMD_RATE_ADAPT_CFG 0x0264 -#define HostCmd_CMD_CCK_DESENSE_CFG 0x0265 -#define HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS 0x024d -#define HostCmd_CMD_FTM_SESSION_CTRL 0x024e -#define HostCmd_CMD_FTM_FEATURE_CTRL 0x024f -#define HostCmd_CMD_WLS_REQ_FTM_RANGE 0x0250 - -#define HostCmd_CMD_FTM_CONFIG_RESPONDER 0x0255 #define HostCmd_ACT_RTT_GET_RSP_INFO 0x0000 #define HostCmd_ACT_RTT_SET_RSP_EN 0x0001 #define HostCmd_ACT_RTT_SET_RSP_DIS 0x0002 #define HostCmd_ACT_RTT_SET_RSP_LCI 0x0003 #define HostCmd_ACT_RTT_SET_RSP_LCR 0x0004 -#define HostCmd_CMD_VDLL 0x0240 -#if defined(PCIE) -#define HostCmd_CMD_SSU 0x0259 -#endif -#define HostCmd_CMD_CSI 0x025b #define CSI_CMD_ENABLE 0x0001 #define CSI_CMD_DISABLE 0x0002 -#define HostCmd_CMD_DMCS_CONFIG 0x0260 - -/** Host Command ID: 11AX config */ -#define HostCmd_CMD_11AX_CFG 0x0266 -/** Host Command ID: 11AX command */ -#define HostCmd_CMD_11AX_CMD 0x026d -/** Host Command ID: Range ext command */ -#define HostCmd_CMD_RANGE_EXT 0x0274 -/** Host Command ID: TWT cfg command */ -#define HostCmd_CMD_TWT_CFG 0x0270 - -#define HostCmd_CMD_LOW_POWER_MODE_CFG 0x026e -#define HostCmd_CMD_UAP_BEACON_STUCK_CFG 0x0271 -#define HostCmd_CMD_ARB_CONFIG 0x0273 -#define HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG 0x0275 -#define HostCmd_CMD_HAL_PHY_CFG 0x0276 - -/** Host Command ID : IPS Config */ -#define HostCmd_CMD_IPS_CONFIG 0x0279 -#define HostCmd_CMD_OFDM_DESENSE_CFG 0x027f typedef MLAN_PACK_START struct { t_u32 enable; } MLAN_PACK_END HostCmd_DS_IPS_CONFIG; @@ -1815,6 +1422,7 @@ typedef MLAN_PACK_START struct { typedef enum _ENH_PS_MODES { GET_PS = 0, SLEEP_CONFIRM = 5, + EXT_PS_PARAM = 6, DIS_AUTO_PS = 0xfe, EN_AUTO_PS = 0xff, } ENH_PS_MODES; @@ -1861,6 +1469,10 @@ typedef enum _ENH_PS_MODES { #define HostCmd_RESULT_BUSY 0x0004 /** Data buffer is not big enough */ #define HostCmd_RESULT_PARTIAL_DATA 0x0005 +/** cmd is blocked by cmd_filter */ +#define HostCmd_RESULT_BLOCK 0x0006 +/** cmd is blocked by pre_asleep */ +#define HostCmd_RESULT_PRE_ASLEEP 0x0007 /* Define action or option for HostCmd_CMD_MAC_CONTROL */ /** MAC action : Rx on */ @@ -1939,199 +1551,23 @@ typedef enum _ENH_PS_MODES { /** Get BSS type from Host Command (bit 15:12) */ #define HostCmd_GET_BSS_TYPE(seq) (((seq)&HostCmd_BSS_TYPE_MASK) >> 12) -/* EVENT ID*/ -/** Card Event definition : Dummy host wakeup signal */ -#define EVENT_DUMMY_HOST_WAKEUP_SIGNAL 0x00000001 -/** Card Event definition : Link lost */ -#define EVENT_LINK_LOST 0x00000003 -/** Card Event definition : Link sensed */ -#define EVENT_LINK_SENSED 0x00000004 -/** Card Event definition : MIB changed */ -#define EVENT_MIB_CHANGED 0x00000006 -/** Card Event definition : Init done */ -#define EVENT_INIT_DONE 0x00000007 -/** Card Event definition : Deauthenticated */ -#define EVENT_DEAUTHENTICATED 0x00000008 -/** Card Event definition : Disassociated */ -#define EVENT_DISASSOCIATED 0x00000009 -/** Card Event definition : Power save awake */ -#define EVENT_PS_AWAKE 0x0000000a -/** Card Event definition : Power save sleep */ -#define EVENT_PS_SLEEP 0x0000000b -/** Card Event definition : MIC error multicast */ -#define EVENT_MIC_ERR_MULTICAST 0x0000000d -/** Card Event definition : MIC error unicast */ -#define EVENT_MIC_ERR_UNICAST 0x0000000e +/* EVENT ID */ -/** Card Event definition : Ad-Hoc BCN lost */ -#define EVENT_ADHOC_BCN_LOST 0x00000011 +#define ENUM_ELEMENT(name, id) name = id +#define ENUM_ELEMENT_LAST(name) name +enum host_fw_event_id { +#include "mlan_event_ids.h" +}; +#undef ENUM_ELEMENT +#undef ENUM_ELEMENT_LAST -/** Card Event definition : Stop Tx */ -#define EVENT_STOP_TX 0x00000013 -/** Card Event definition : Start Tx */ -#define EVENT_START_TX 0x00000014 -/** Card Event definition : Channel switch */ -#define EVENT_CHANNEL_SWITCH 0x00000015 - -/** Card Event definition : MEAS report ready */ -#define EVENT_MEAS_REPORT_RDY 0x00000016 - -/** Card Event definition : WMM status change */ -#define EVENT_WMM_STATUS_CHANGE 0x00000017 - -/** Card Event definition : BG scan report */ -#define EVENT_BG_SCAN_REPORT 0x00000018 -/** Card Event definition : BG scan stopped */ -#define EVENT_BG_SCAN_STOPPED 0x00000065 - -/** Card Event definition : Beacon RSSI low */ -#define EVENT_RSSI_LOW 0x00000019 -/** Card Event definition : Beacon SNR low */ -#define EVENT_SNR_LOW 0x0000001a -/** Card Event definition : Maximum fail */ -#define EVENT_MAX_FAIL 0x0000001b -/** Card Event definition : Beacon RSSI high */ -#define EVENT_RSSI_HIGH 0x0000001c -/** Card Event definition : Beacon SNR high */ -#define EVENT_SNR_HIGH 0x0000001d - -/** Card Event definition : IBSS coalsced */ -#define EVENT_IBSS_COALESCED 0x0000001e - -/** Event definition : IBSS station connected */ -#define EVENT_IBSS_STATION_CONNECT 0x00000020 -/** Event definition : IBSS station dis-connected */ -#define EVENT_IBSS_STATION_DISCONNECT 0x00000021 - -/** Card Event definition : Data RSSI low */ -#define EVENT_DATA_RSSI_LOW 0x00000024 -/** Card Event definition : Data SNR low */ -#define EVENT_DATA_SNR_LOW 0x00000025 -/** Card Event definition : Data RSSI high */ -#define EVENT_DATA_RSSI_HIGH 0x00000026 -/** Card Event definition : Data SNR high */ -#define EVENT_DATA_SNR_HIGH 0x00000027 - -/** Card Event definition : Link Quality */ -#define EVENT_LINK_QUALITY 0x00000028 - -/** Card Event definition : Port release event */ -#define EVENT_PORT_RELEASE 0x0000002b - -#ifdef UAP_SUPPORT -/** Event ID: STA deauth */ -#define EVENT_MICRO_AP_STA_DEAUTH 0x0000002c -/** Event ID: STA assoicated */ -#define EVENT_MICRO_AP_STA_ASSOC 0x0000002d -/** Event ID: BSS started */ -#define EVENT_MICRO_AP_BSS_START 0x0000002e -/** Event ID: BSS idle event */ -#define EVENT_MICRO_AP_BSS_IDLE 0x00000043 -/** Event ID: BSS active event */ -#define EVENT_MICRO_AP_BSS_ACTIVE 0x00000044 - -/** Event ID: MIC countermeasures event */ -#define EVENT_MICRO_AP_MIC_COUNTERMEASURES 0x0000004c -#endif /* UAP_SUPPORT */ - -/** Card Event definition : Pre-Beacon Lost */ -#define EVENT_PRE_BEACON_LOST 0x00000031 - -#define EVENT_WATCHDOG_TMOUT 0x00000032 - -/** Card Event definition : Add BA event */ -#define EVENT_ADDBA 0x00000033 -/** Card Event definition : Del BA event */ -#define EVENT_DELBA 0x00000034 -/** Card Event definition: BA stream timeout*/ -#define EVENT_BA_STREAM_TIMEOUT 0x00000037 - -/** Card Event definition : AMSDU aggr control */ -#define EVENT_AMSDU_AGGR_CTRL 0x00000042 - -/** Card Event definition: WEP ICV error */ -#define EVENT_WEP_ICV_ERR 0x00000046 - -/** Card Event definition : Host sleep enable */ -#define EVENT_HS_ACT_REQ 0x00000047 - -/** Card Event definition : BW changed */ -#define EVENT_BW_CHANGE 0x00000048 - -#ifdef WIFI_DIRECT_SUPPORT -/** WIFIDIRECT generic event */ -#define EVENT_WIFIDIRECT_GENERIC_EVENT 0x00000049 -/** WIFIDIRECT service discovery event */ -#define EVENT_WIFIDIRECT_SERVICE_DISCOVERY 0x0000004a -#endif -/** Remain on Channel expired event */ -#define EVENT_REMAIN_ON_CHANNEL_EXPIRED 0x0000005f - -/** TDLS generic event */ -#define EVENT_TDLS_GENERIC_EVENT 0x00000052 - -#define EVENT_MEF_HOST_WAKEUP 0x0000004f - -/** Card Event definition: Channel switch pending announcment */ -#define EVENT_CHANNEL_SWITCH_ANN 0x00000050 - -/** Event definition: Radar Detected by card */ -#define EVENT_RADAR_DETECTED 0x00000053 - -/** Event definition: Radar Detected by card */ -#define EVENT_CHANNEL_REPORT_RDY 0x00000054 - -/** Event definition: Scan results through event */ -#define EVENT_EXT_SCAN_REPORT 0x00000058 -/** Enhance ext scan done event */ -#define EVENT_EXT_SCAN_STATUS_REPORT 0x0000007f - -/** Event definition: RXBA_SYNC */ -#define EVENT_RXBA_SYNC 0x00000059 - -/** Event ID: TX data pause event */ -#define EVENT_TX_DATA_PAUSE 0x00000055 - -/** Event definition : FW debug information */ -#define EVENT_FW_DEBUG_INFO 0x00000063 - -/** Event ID: SAD Report */ -#define EVENT_SAD_REPORT 0x00000066 - -/** Event ID: Multi Chan Info*/ -#define EVENT_MULTI_CHAN_INFO 0x0000006a - -#define EVENT_FW_DUMP_INFO 0x00000073 -/** Event ID: Tx status */ -#define EVENT_TX_STATUS_REPORT 0x00000074 - -#define EVENT_BT_COEX_WLAN_PARA_CHANGE 0x00000076 - -#define EVENT_VDLL_IND 0x00000081 - -#define EVENT_ROAM_OFFLOAD 0x00000083 - -#define EVENT_WLS_FTM_COMPLETE 0x00000086 - -#define WLS_SUB_EVENT_FTM_COMPLETE 0 -#define WLS_SUB_EVENT_RADIO_RECEIVED 1 -#define WLS_SUB_EVENT_RADIO_RPT_RECEIVED 2 -#define WLS_SUB_EVENT_ANQP_RESP_RECEIVED 3 -#define WLS_SUB_EVENT_RTT_RESULTS 4 - -#define EVENT_EXCEED_MAX_P2P_CONN 0x00000089 - -#if defined(PCIE) -#define EVENT_SSU_DUMP_DMA 0x0000008C -#endif - -#define EVENT_CSI 0x0000008D -#define EVENT_FW_HANG_REPORT 0x0000008F -/** Card Event definition : RESET PN */ - -#define EVENT_ASSOC_REQ_IE 0x00000095 - -#define CHAN_LOAD_EVENT 0x00000099 +enum wls_event_subtype { + WLS_SUB_EVENT_FTM_COMPLETE = 0, + WLS_SUB_EVENT_RADIO_RECEIVED = 1, + WLS_SUB_EVENT_RADIO_RPT_RECEIVED = 2, + WLS_SUB_EVENT_ANQP_RESP_RECEIVED = 3, + WLS_SUB_EVENT_RTT_RESULTS = 4, +}; /** Event ID mask */ #define EVENT_ID_MASK 0xffff @@ -2171,8 +1607,6 @@ typedef enum _ENH_PS_MODES { /** TDLS off channel */ #define TDLS_OFF_CHANNEL 1 -#define RXPD_FLAG_PKT_EASYMESH MBIT(4) - /** structure for channel switch result from TDLS FW */ typedef MLAN_PACK_START struct _chan_switch_result { /** current channel, 0 - base channel, 1 - off channel*/ @@ -2290,9 +1724,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_TDLS_Idle_Timeout_t { /** Bit mask for TxPD flags field for Tx status report */ #define MRVDRV_TxPD_FLAGS_TX_PACKET_STATUS MBIT(5) -/** Bit mask for TxPD flags field for EASYMESH */ -#define MRVDRV_TxPD_FLAGS_EASYMESH MBIT(7) - /** Packet type: 802.11 */ #define PKT_TYPE_802DOT11 0x05 @@ -2432,9 +1863,6 @@ typedef MLAN_PACK_START struct _TxPD { t_u8 reserved; /** Tx Control */ t_u32 tx_control_1; - /** ra mac address */ - t_u8 ra_mac[6]; - t_u8 reserved3[2]; } MLAN_PACK_END TxPD, *PTxPD; /** RxPD Descriptor */ @@ -2480,8 +1908,6 @@ typedef MLAN_PACK_START struct _RxPD { /** Reserved */ t_u8 reserved3[8]; - t_u8 ta_mac[6]; - t_u8 reserved4[2]; } MLAN_PACK_END RxPD, *PRxPD; /** IEEEtypes_FrameCtl_t*/ @@ -2787,14 +2213,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_HostMlme_t { t_u8 host_mlme; } MLAN_PACK_END MrvlIEtypes_HostMlme_t; -/** MrvlIEtypes_MultiAp_t */ -typedef MLAN_PACK_START struct _MrvlIEtypes_MultiAp_t { - /** Header */ - MrvlIEtypesHeader_t header; - /** Multi AP flag */ - t_u8 flag; -} MLAN_PACK_END MrvlIEtypes_MultiAp_t; - /** MrvlIEtypes_NumProbes_t */ typedef MLAN_PACK_START struct _MrvlIEtypes_NumProbes_t { /** Header */ @@ -3425,6 +2843,24 @@ typedef MLAN_PACK_START struct __sleep_confirm_param { t_u16 resp_ctrl; } MLAN_PACK_END sleep_confirm_param; +/* bit define for pre_asleep*/ +#define BLOCK_CMD_IN_PRE_ASLEEP MBIT(0) +/** MrvlIEtypes_ext_ps_param_t */ +typedef MLAN_PACK_START struct _MrvlIEtypes_ext_ps_param_t { + /** Header */ + MrvlIEtypesHeader_t header; + /** mode: bit0:BLOCK_CMD_IN_PRE_ASLEEP */ + t_u32 mode; +} MLAN_PACK_END MrvlIEtypes_ext_ps_param_t; + +/** ext_ps_param_t */ +typedef MLAN_PACK_START struct _ext_ps_param { + /** reserved */ + t_u16 reserved; + /** ext_ps_param tlv */ + MrvlIEtypes_ext_ps_param_t param; +} MLAN_PACK_END ext_ps_param; + /** bitmap for get auto deepsleep */ #define BITMAP_AUTO_DS 0x01 /** bitmap for sta power save */ @@ -3435,6 +2871,7 @@ typedef MLAN_PACK_START struct __sleep_confirm_param { #define BITMAP_UAP_INACT_PS 0x100 /** bitmap for uap DTIM PS */ #define BITMAP_UAP_DTIM_PS 0x200 + /** Structure definition for the new ieee power save parameters*/ typedef MLAN_PACK_START struct _auto_ps_param { /** bitmap for enable power save mode */ @@ -3454,6 +2891,8 @@ typedef MLAN_PACK_START struct _auto_ps_param { #define TLV_TYPE_PS_PARAM (PROPRIETARY_TLV_BASE_ID + 0x72) /* 0x0172 */ /** TLV type : beacon timeout */ #define TLV_TYPE_BCN_TIMEOUT (PROPRIETARY_TLV_BASE_ID + 0x11F) /* 0x011F */ +/** TLV type: ps_ext_param */ +#define TLV_TYPE_PS_EXT_PARAM (PROPRIETARY_TLV_BASE_ID + 0x15F) /* 0x25F */ /** MrvlIEtypes_auto_ds_param_t */ typedef MLAN_PACK_START struct _MrvlIEtypes_auto_ds_param_t { @@ -3516,6 +2955,8 @@ typedef MLAN_PACK_START struct _HostCmd_DS_PS_MODE_ENH { t_u16 ps_bitmap; /** auto ps param */ auto_ps_param auto_ps; + /** ext ps param */ + ext_ps_param ext_param; } params; } MLAN_PACK_END HostCmd_DS_802_11_PS_MODE_ENH; @@ -3604,12 +3045,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_GET_HW_SPEC { } MLAN_PACK_END HostCmd_DS_GET_HW_SPEC; #ifdef SDIO -/* HostCmd_DS_SDIO_SP_RX_AGGR_CFG */ -typedef MLAN_PACK_START struct _HostCmd_DS_SDIO_SP_RX_AGGR_CFG { - t_u8 action; - t_u8 enable; - t_u16 sdio_block_size; -} MLAN_PACK_END HostCmd_DS_SDIO_SP_RX_AGGR_CFG; #endif /** HostCmd_DS_802_11_CFG_DATA */ @@ -4078,8 +3513,10 @@ typedef MLAN_PACK_START struct _HostCmd_DS_802_11_GET_LOG { /** Rx Stuck Related Info*/ /** Rx Stuck Issue count */ t_u32 rx_stuck_issue_cnt[2]; - /** Rx Stuck Recovery count */ - t_u32 rx_stuck_recovery_cnt; + /** Rx Stuck Recovery count polling based */ + t_u32 rx_stuck_poll_recovery_cnt; + /** Rx Stuck Recovery count interrupt based */ + t_u32 rx_stuck_intr_recovery_cnt; /** Rx Stuck TSF */ t_u64 rx_stuck_tsf[2]; /** Tx Watchdog Recovery Related Info */ @@ -4389,8 +3826,8 @@ typedef MLAN_PACK_START struct _hs_config_param { t_u32 conditions; /** GPIO pin or 0xff for interface */ t_u8 gpio; - /** gap in milliseconds or or 0xff for special setting when - * GPIO is used to wakeup host + /** gap in milliseconds or 0xff for special setting + * (host acknowledge required) */ t_u8 gap; } MLAN_PACK_END hs_config_param; @@ -6394,8 +5831,8 @@ typedef MLAN_PACK_START struct _HostCmd_DS_INACTIVITY_TIMEOUT_EXT { t_u16 mcast_timeout; /** Timeout for additional RX traffic after Null PM1 packet exchange */ t_u16 ps_entry_timeout; - /** Reserved to further expansion */ - t_u16 reserved; + /** Inactivity timeout for cmd */ + t_u16 ps_cmd_timeout; } MLAN_PACK_END HostCmd_DS_INACTIVITY_TIMEOUT_EXT; /** HostCmd_DS_INDEPENDENT_RESET_CFG */ @@ -7274,9 +6711,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_DYN_BW { t_u16 dyn_bw; } MLAN_PACK_END HostCmd_DS_DYN_BW; -/** Host Command ID : Packet aggregation CTRL */ -#define HostCmd_CMD_PACKET_AGGR_CTRL 0x0251 - /** HostCmd_DS_PACKET_AGGR_CTRL */ typedef MLAN_PACK_START struct _HostCmd_DS_PACKET_AGGR_AGGR_CTRL { /** ACT_GET/ACT_SET */ @@ -7292,9 +6726,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_PACKET_AGGR_AGGR_CTRL { } MLAN_PACK_END HostCmd_DS_PACKET_AGGR_CTRL; #ifdef USB -/** Host Command ID : Packet aggregation over host interface */ -#define HostCmd_CMD_PACKET_AGGR_OVER_HOST_INTERFACE 0x0117 - /** TLV ID : USB Aggregation parameters */ #define MRVL_USB_AGGR_PARAM_TLV_ID \ (PROPRIETARY_TLV_BASE_ID + 0xB1) /* 0x1B1 \ @@ -7650,9 +7081,6 @@ typedef MLAN_PACK_START struct { t_u8 tlv_buffer[1]; } MLAN_PACK_END HostCmd_DS_OPCHAN_CHANGROUP_CONFIG; - -#define HostCmd_CMD_OPCHAN_CONFIG 0x00f8 -#define HostCmd_CMD_OPCHAN_CHANGROUP_CONFIG 0x00f9 #endif typedef MLAN_PACK_START struct { @@ -8128,94 +7556,6 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_RTTLCRCfg_t { char civic_info[256]; } MLAN_PACK_END MrvlIEtypes_RTTLCRCfg_t; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -#define HostCmd_CMD_CRYPTO 0x025e - -#define HostCmd_CMD_CRYPTO_SUBCMD_PRF_HMAC_SHA1 (0x1) -#define HostCmd_CMD_CRYPTO_SUBCMD_HMAC_SHA1 (0x2) -#define HostCmd_CMD_CRYPTO_SUBCMD_HMAC_SHA256 (0x3) -#define HostCmd_CMD_CRYPTO_SUBCMD_SHA256 (0x4) -#define HostCmd_CMD_CRYPTO_SUBCMD_RIJNDAEL (0x5) -#define HostCmd_CMD_CRYPTO_SUBCMD_RC4 (0x6) -#define HostCmd_CMD_CRYPTO_SUBCMD_MD5 (0x7) -#define HostCmd_CMD_CRYPTO_SUBCMD_MRVL_F (0x8) -#define HostCmd_CMD_CRYPTO_SUBCMD_SHA256_KDF (0x9) - -#define TLV_TYPE_CRYPTO_KEY (PROPRIETARY_TLV_BASE_ID + 308) -#define TLV_TYPE_CRYPTO_KEY_IV (PROPRIETARY_TLV_BASE_ID + 309) -#define TLV_TYPE_CRYPTO_KEY_PREFIX (PROPRIETARY_TLV_BASE_ID + 310) -#define TLV_TYPE_CRYPTO_KEY_DATA_BLK (PROPRIETARY_TLV_BASE_ID + 311) - -/** MrvlIEParamSet_t */ -typedef MLAN_PACK_START struct { - /** Type */ - t_u16 Type; - /** Length */ - t_u16 Length; -} MLAN_PACK_END MrvlIEParamSet_t; - -/** HostCmd_DS_CRYPTO */ -typedef MLAN_PACK_START struct _HostCmd_DS_CRYPTO { - /** action */ - t_u16 action; - /** subCmdCode */ - t_u8 subCmdCode; - /** subCmd start */ - t_u8 subCmd[]; -} MLAN_PACK_END HostCmd_DS_CRYPTO; - -/** subcmd_prf_hmac_sha1 used by prf_hmac_sha1, md5 and sha256_kdf */ -typedef MLAN_PACK_START struct _subcmd_prf_hmac_sha1 { - /** output_len */ - t_u16 output_len; - /** tlv start */ - t_u8 tlv[]; -} MLAN_PACK_END subcmd_prf_hmac_sha1_t, subcmd_md5_t, subcmd_sha256_kdf_t; - -/** subcmd_hmac_sha1 used by hmac_sha1, hmac_sha256, sha256 */ -typedef MLAN_PACK_START struct _subcmd_hmac_sha1 { - /** output_len */ - t_u16 output_len; - /** number of data blocks */ - t_u16 data_blks_nr; - /** tlv start */ - t_u8 tlv[]; -} MLAN_PACK_END subcmd_hmac_sha1_t, subcmd_hmac_sha256_t, subcmd_sha256_t; - -/** subcmd_rijndael, used by rijndael */ -typedef MLAN_PACK_START struct _subcmd_rijndael { - /** output_len */ - t_u16 output_len; - /** sub action code */ - t_u8 sub_action_code; - /** tlv start */ - t_u8 tlv[]; -} MLAN_PACK_END subcmd_rijndael_t; - -/** subcmd_rc4, used by rc4 */ -typedef MLAN_PACK_START struct _subcmd_rc4 { - /** output_len */ - t_u16 output_len; - /** skip bytes */ - t_u16 skip_bytes; - /** tlv start */ - t_u8 tlv[]; -} MLAN_PACK_END subcmd_rc4_t; - -/** subcmd_mrvf_f, used by mrvl_f*/ -typedef MLAN_PACK_START struct _subcmd_mrvf_f { - /** output_len */ - t_u16 output_len; - /** iterations */ - t_u32 iterations; - /** count */ - t_u32 count; - /** tlv start */ - t_u8 tlv[]; -} MLAN_PACK_END subcmd_mrvl_f_t; - -#endif - #ifdef UAP_SUPPORT /** action add station */ #define HostCmd_ACT_ADD_STA 0x1 @@ -8237,8 +7577,6 @@ typedef MLAN_PACK_START struct _HostCmd_DS_ADD_STATION { t_u8 tlv[]; } MLAN_PACK_END HostCmd_DS_ADD_STATION; -/** Host Command ID : Add New Station */ -#define HostCmd_CMD_ADD_NEW_STATION 0x025f /** TLV id: station flag */ #define TLV_TYPE_UAP_STA_FLAGS (PROPRIETARY_TLV_BASE_ID + 313) /**MrvlIEtypes_Sta_Flag_t */ @@ -8301,6 +7639,35 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_RX_ABORT_CFG_EXT { t_u8 edmac_enable; } MLAN_PACK_END HostCmd_DS_CMD_RX_ABORT_CFG_EXT; +/** HostCmd_CMD_NAV_MITIGATION_CFG */ +typedef MLAN_PACK_START struct _HostCmd_DS_CMD_NAV_MITIGATION_CFG { + /** Action */ + t_u16 action; + /** start/stop nav mitigation */ + t_u16 start_nav_mitigation; + /** Duration value in us to set as threshold in ACT_SET action */ + t_u16 threshold; + /** Counter for NAV mitigation detected */ + t_u16 detect_cnt; + /** Counter for NAV mitigation stopped */ + t_u16 stop_cnt; +} MLAN_PACK_END HostCmd_DS_CMD_NAV_MITIGATION_CFG; + +typedef MLAN_PACK_START struct _HostCmd_DS_CMD_LED_CFG { + t_u16 action; + t_u8 enable; + t_u8 numled; +} MLAN_PACK_END HostCmd_DS_CMD_LED_CFG; + +/* TLV 0x109 LED Behavior */ +typedef MLAN_PACK_START struct { + MrvlIEtypesHeader_t header; + t_u8 firmwarestate; + t_u8 reserved; + t_u8 ledstate; + t_u8 ledargs; +} MLAN_PACK_END MrvlIEtypes_led_behavior_t; + /** HostCmd_CMD_ARB_CONFIG */ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_ARB_CONFIG { /** Action */ @@ -8372,7 +7739,6 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { /** Hardware specifications */ HostCmd_DS_GET_HW_SPEC hw_spec; #ifdef SDIO - HostCmd_DS_SDIO_SP_RX_AGGR_CFG sdio_rx_aggr; #endif /** Cfg data */ HostCmd_DS_802_11_CFG_DATA cfg_data; @@ -8605,10 +7971,6 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { HostCmd_DS_CSI_CFG csi_params; /** boot sleep configure */ HostCmd_DS_BOOT_SLEEP boot_sleep; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - /** crypto cmd */ - HostCmd_DS_CRYPTO crypto_cmd; -#endif #ifdef UAP_SUPPORT /** Add station cmd */ HostCmd_DS_ADD_STATION sta_info; @@ -8624,6 +7986,8 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { HostCmd_DS_CMD_RX_ABORT_CFG rx_abort_cfg; HostCmd_DS_CMD_OFDM_DESENSE_CFG ofdm_desense_cfg; HostCmd_DS_CMD_RX_ABORT_CFG_EXT rx_abort_cfg_ext; + HostCmd_DS_CMD_NAV_MITIGATION_CFG nav_mitigation; + HostCmd_DS_CMD_LED_CFG ledcntrcfg; HostCmd_DS_CMD_TX_AMPDU_PROT_MODE tx_ampdu_prot_mode; HostCmd_DS_CMD_RATE_ADAPT_CFG rate_adapt_cfg; HostCmd_DS_CMD_CCK_DESENSE_CFG cck_desense_cfg; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_hostcmd_ids.h b/mxm_wifiex/wlan_src/mlan/mlan_hostcmd_ids.h new file mode 100644 index 0000000..da947e0 --- /dev/null +++ b/mxm_wifiex/wlan_src/mlan/mlan_hostcmd_ids.h @@ -0,0 +1,449 @@ +/** @file mlan_hostcmd_ids.h + * + * @brief This file contains host command ID definitions. + * + * + * Copyright 2023 NXP + * + * This software file (the File) is distributed by NXP + * under the terms of the GNU General Public License Version 2, June 1991 + * (the License). You may use, redistribute and/or modify the File in + * accordance with the terms and conditions of the License, a copy of which + * is available by writing to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the + * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt. + * + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about + * this warranty disclaimer. + * + */ + +/* include guard is absent intentionally */ + +/** Firmware Host Command ID Constants */ +/** Host Command ID : Get hardware specifications */ +ENUM_ELEMENT(HostCmd_CMD_GET_HW_SPEC, 0x0003), + /** Host Command ID : 802.11 scan */ + ENUM_ELEMENT(HostCmd_CMD_802_11_SCAN, 0x0006), + /** Host Command ID : 802.11 get log */ + ENUM_ELEMENT(HostCmd_CMD_802_11_GET_LOG, 0x000b), + + /** Host Command id: GET_TX_RX_PKT_STATS */ + ENUM_ELEMENT(HostCmd_CMD_TX_RX_PKT_STATS, 0x008d), + + /** Host Command ID : 802.11 get/set link layer statistic */ + ENUM_ELEMENT(HostCmd_CMD_802_11_LINK_STATS, 0x0256), + + /** Host Command ID : MAC multicast address */ + ENUM_ELEMENT(HostCmd_CMD_MAC_MULTICAST_ADR, 0x0010), + /** Host Command ID : 802.11 EEPROM access */ + ENUM_ELEMENT(HostCmd_CMD_802_11_EEPROM_ACCESS, 0x0059), + /** Host Command ID : 802.11 associate */ + ENUM_ELEMENT(HostCmd_CMD_802_11_ASSOCIATE, 0x0012), + + /** Host Command ID : 802.11 SNMP MIB */ + ENUM_ELEMENT(HostCmd_CMD_802_11_SNMP_MIB, 0x0016), + /** Host Command ID : MAC register access */ + ENUM_ELEMENT(HostCmd_CMD_MAC_REG_ACCESS, 0x0019), + /** Host Command ID : BBP register access */ + ENUM_ELEMENT(HostCmd_CMD_BBP_REG_ACCESS, 0x001a), + /** Host Command ID : RF register access */ + ENUM_ELEMENT(HostCmd_CMD_RF_REG_ACCESS, 0x001b), + + /** Host Command ID : 802.11 radio control */ + ENUM_ELEMENT(HostCmd_CMD_802_11_RADIO_CONTROL, 0x001c), + /** Host Command ID : 802.11 RF channel */ + ENUM_ELEMENT(HostCmd_CMD_802_11_RF_CHANNEL, 0x001d), + /** Host Command ID : 802.11 RF Tx power */ + ENUM_ELEMENT(HostCmd_CMD_802_11_RF_TX_POWER, 0x001e), + + /** Host Command ID : 802.11 RF antenna */ + ENUM_ELEMENT(HostCmd_CMD_802_11_RF_ANTENNA, 0x0020), + + /** Host Command ID : 802.11 deauthenticate */ + ENUM_ELEMENT(HostCmd_CMD_802_11_DEAUTHENTICATE, 0x0024), + /** Host Command ID: 802.11 disassoicate */ + ENUM_ELEMENT(HostCmd_CMD_802_11_DISASSOCIATE, 0x0026), + /** Host Command ID : MAC control */ + ENUM_ELEMENT(HostCmd_CMD_MAC_CONTROL, 0x0028), + /** Host Command ID : 802.11 Ad-Hoc start */ + ENUM_ELEMENT(HostCmd_CMD_802_11_AD_HOC_START, 0x002b), + /** 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 : 802.22 MAC address */ + ENUM_ELEMENT(HostCmd_CMD_802_11_MAC_ADDRESS, 0x004D), + + /** Host Command ID : LED control config */ + ENUM_ELEMENT(HostCmd_CMD_802_11_LED_CONTROL, 0x004E), + + /** Host Command ID : WMM Traffic Stream Status */ + ENUM_ELEMENT(HostCmd_CMD_WMM_TS_STATUS, 0x005d), + + /** Host Command ID : 802.11 D domain information */ + ENUM_ELEMENT(HostCmd_CMD_802_11D_DOMAIN_INFO, 0x005b), + + /*This command gets/sets the Transmit Rate-based Power Control (TRPC) + * channel configuration.*/ + ENUM_ELEMENT(HostCmd_CMD_CHANNEL_TRPC_CONFIG, 0x00fb), + + /** Host Command ID : 802.11 TPC information */ + ENUM_ELEMENT(HostCmd_CMD_802_11_TPC_INFO, 0x005f), + /** Host Command ID : 802.11 TPC adapt req */ + ENUM_ELEMENT(HostCmd_CMD_802_11_TPC_ADAPT_REQ, 0x0060), + /** Host Command ID : 802.11 channel SW ann */ + ENUM_ELEMENT(HostCmd_CMD_802_11_CHAN_SW_ANN, 0x0061), + + /** Host Command ID : Measurement request */ + ENUM_ELEMENT(HostCmd_CMD_MEASUREMENT_REQUEST, 0x0062), + /** Host Command ID : Measurement report */ + ENUM_ELEMENT(HostCmd_CMD_MEASUREMENT_REPORT, 0x0063), + + /** Host Command ID : 802.11 sleep parameters */ + ENUM_ELEMENT(HostCmd_CMD_802_11_SLEEP_PARAMS, 0x0066), + + /** Host Command ID : 802.11 ps inactivity timeout */ + ENUM_ELEMENT(HostCmd_CMD_802_11_PS_INACTIVITY_TIMEOUT, 0x0067), + + /** Host Command ID : 802.11 sleep period */ + ENUM_ELEMENT(HostCmd_CMD_802_11_SLEEP_PERIOD, 0x0068), + + /** Host Command ID: 802.11 BG scan config */ + ENUM_ELEMENT(HostCmd_CMD_802_11_BG_SCAN_CONFIG, 0x006b), + /** Host Command ID : 802.11 BG scan query */ + ENUM_ELEMENT(HostCmd_CMD_802_11_BG_SCAN_QUERY, 0x006c), + + /** Host Command ID : WMM ADDTS req */ + ENUM_ELEMENT(HostCmd_CMD_WMM_ADDTS_REQ, 0x006E), + /** Host Command ID : WMM DELTS req */ + ENUM_ELEMENT(HostCmd_CMD_WMM_DELTS_REQ, 0x006F), + /** Host Command ID : WMM queue configuration */ + ENUM_ELEMENT(HostCmd_CMD_WMM_QUEUE_CONFIG, 0x0070), + /** Host Command ID : 802.11 get status */ + ENUM_ELEMENT(HostCmd_CMD_WMM_GET_STATUS, 0x0071), + + /** Host Command ID : 802.11 subscribe event */ + ENUM_ELEMENT(HostCmd_CMD_802_11_SUBSCRIBE_EVENT, 0x0075), + + /** Host Command ID : 802.11 Tx rate query */ + ENUM_ELEMENT(HostCmd_CMD_802_11_TX_RATE_QUERY, 0x007f), + /** Host Command ID :Get timestamp value */ + ENUM_ELEMENT(HostCmd_CMD_GET_TSF, 0x0080), + + /** Host Command ID : WMM queue stats */ + ENUM_ELEMENT(HostCmd_CMD_WMM_QUEUE_STATS, 0x0081), + + /** Host Command ID : KEEP ALIVE command */ + ENUM_ELEMENT(HostCmd_CMD_AUTO_TX, 0x0082), + + /** Host Command ID : 802.11 IBSS coalescing status */ + ENUM_ELEMENT(HostCmd_CMD_802_11_IBSS_COALESCING_STATUS, 0x0083), + + /** Host Command ID : Memory access */ + ENUM_ELEMENT(HostCmd_CMD_MEM_ACCESS, 0x0086), + +#if defined(SDIO) + /** Host Command ID : SDIO GPIO interrupt configuration */ + ENUM_ELEMENT(HostCmd_CMD_SDIO_GPIO_INT_CONFIG, 0x0088), +#endif + + /** Host Command ID : Mfg command */ + ENUM_ELEMENT(HostCmd_CMD_MFG_COMMAND, 0x0089), + /** Host Command ID : Inactivity timeout ext */ + ENUM_ELEMENT(HostCmd_CMD_INACTIVITY_TIMEOUT_EXT, 0x008a), + + /** Host Command ID : DBGS configuration */ + ENUM_ELEMENT(HostCmd_CMD_DBGS_CFG, 0x008b), + /** Host Command ID : Get memory */ + ENUM_ELEMENT(HostCmd_CMD_GET_MEM, 0x008c), + + /** Host Command ID : Cal data dnld */ + ENUM_ELEMENT(HostCmd_CMD_CFG_DATA, 0x008f), + + /** Host Command ID : SDIO pull control */ + ENUM_ELEMENT(HostCmd_CMD_SDIO_PULL_CTRL, 0x0093), + + /** Host Command ID : ECL system clock configuration */ + ENUM_ELEMENT(HostCmd_CMD_ECL_SYSTEM_CLOCK_CONFIG, 0x0094), + + /** Host Command ID : Extended version */ + ENUM_ELEMENT(HostCmd_CMD_VERSION_EXT, 0x0097), + + /** Host Command ID : MEF configuration */ + ENUM_ELEMENT(HostCmd_CMD_MEF_CFG, 0x009a), + /** Host Command ID : 802.11 RSSI INFO*/ + ENUM_ELEMENT(HostCmd_CMD_RSSI_INFO, 0x00a4), + /** Host Command ID : Function initialization */ + ENUM_ELEMENT(HostCmd_CMD_FUNC_INIT, 0x00a9), + /** Host Command ID : Function shutdown */ + ENUM_ELEMENT(HostCmd_CMD_FUNC_SHUTDOWN, 0x00aa), + +#ifdef OPCHAN + ENUM_ELEMENT(HostCmd_CMD_OPCHAN_CONFIG, 0x00f8), + ENUM_ELEMENT(HostCmd_CMD_OPCHAN_CHANGROUP_CONFIG, 0x00f9), +#endif + + /** Host Command ID : Robustcoex */ + ENUM_ELEMENT(HostCmd_CMD_802_11_ROBUSTCOEX, 0x00e0), + + /** Host Command ID :EAPOL PKT */ + ENUM_ELEMENT(HostCmd_CMD_802_11_EAPOL_PKT, 0x012e), + + /** Host Command ID :MIMO SWITCH **/ + ENUM_ELEMENT(HostCmd_CMD_802_11_MIMO_SWITCH, 0x0235), + + /** Host Command ID : 802.11 RSSI INFO EXT*/ + ENUM_ELEMENT(HostCmd_CMD_RSSI_INFO_EXT, 0x0237), + /** Host Command ID : ROAMING OFFLOAD TO FW*/ + ENUM_ELEMENT(HostCmd_CMD_ROAM_OFFLOAD, 0x0245), + + /** Host Command ID: Multi chan config */ + ENUM_ELEMENT(HostCmd_CMD_MULTI_CHAN_CONFIG, 0x011e), + /** Host Command ID: Multi chan policy */ + ENUM_ELEMENT(HostCmd_CMD_MULTI_CHAN_POLICY, 0x0121), + /** Host Command ID: DRCS config */ + ENUM_ELEMENT(HostCmd_CMD_DRCS_CONFIG, 0x024a), + + /** Host Command ID : Channel report request */ + ENUM_ELEMENT(HostCmd_CMD_CHAN_REPORT_REQUEST, 0x00dd), + + /** Host Command ID: SUPPLICANT_PMK */ + ENUM_ELEMENT(HostCmd_CMD_SUPPLICANT_PMK, 0x00c4), + /** Host Command ID: SUPPLICANT_PROFILE */ + ENUM_ELEMENT(HostCmd_CMD_SUPPLICANT_PROFILE, 0x00c5), + + /** Host Command ID : Add Block Ack Request */ + ENUM_ELEMENT(HostCmd_CMD_11N_ADDBA_REQ, 0x00ce), + /** Host Command ID : Delete a Block Ack Request */ + ENUM_ELEMENT(HostCmd_CMD_11N_CFG, 0x00cd), + /** Host Command ID : Add Block Ack Response */ + ENUM_ELEMENT(HostCmd_CMD_11N_ADDBA_RSP, 0x00cf), + /** Host Command ID : Delete a Block Ack Request */ + ENUM_ELEMENT(HostCmd_CMD_11N_DELBA, 0x00d0), + /** Host Command ID: Configure Tx Buf size */ + ENUM_ELEMENT(HostCmd_CMD_RECONFIGURE_TX_BUFF, 0x00d9), + /** Host Command ID: AMSDU Aggr Ctrl */ + ENUM_ELEMENT(HostCmd_CMD_AMSDU_AGGR_CTRL, 0x00df), + /** Host Command ID: 11AC config */ + ENUM_ELEMENT(HostCmd_CMD_11AC_CFG, 0x0112), + /** Host Command ID: Configure TX Beamforming capability */ + ENUM_ELEMENT(HostCmd_CMD_TX_BF_CFG, 0x0104), + + /** Host Command ID : 802.11 TX power configuration */ + ENUM_ELEMENT(HostCmd_CMD_TXPWR_CFG, 0x00d1), + + /** Host Command ID : Soft Reset */ + ENUM_ELEMENT(HostCmd_CMD_SOFT_RESET, 0x00d5), + + /** Host Command ID : 802.11 b/g/n rate configration */ + ENUM_ELEMENT(HostCmd_CMD_TX_RATE_CFG, 0x00d6), + + /** Host Command ID : Enhanced PS mode */ + ENUM_ELEMENT(HostCmd_CMD_802_11_PS_MODE_ENH, 0x00e4), + + /** Host command action : Host sleep configuration */ + ENUM_ELEMENT(HostCmd_CMD_802_11_HS_CFG_ENH, 0x00e5), + + /** Host Command ID : CAU register access */ + ENUM_ELEMENT(HostCmd_CMD_CAU_REG_ACCESS, 0x00ed), + + /** Host Command ID : mgmt IE list */ + ENUM_ELEMENT(HostCmd_CMD_MGMT_IE_LIST, 0x00f2), + + ENUM_ELEMENT(HostCmd_CMD_802_11_BAND_STEERING, 0x026f), + /*** Host Command ID " MC_AGGR_CFG */ + ENUM_ELEMENT(HostCmd_CMD_MC_AGGR_CFG, 0x027a), + ENUM_ELEMENT(HostCmd_CMD_802_11_STATS, 0x0014), + ENUM_ELEMENT(HostCmd_CMD_GET_CH_LOAD, 0x027b), + + /** Host Command ID: CROSS CHIP SYNCH */ + ENUM_ELEMENT(HostCmd_CMD_CROSS_CHIP_SYNCH, 0x027d), + + /** Host Command ID : TDLS configuration */ + ENUM_ELEMENT(HostCmd_CMD_TDLS_CONFIG, 0x0100), + /** Host Command ID : TDLS operation */ + ENUM_ELEMENT(HostCmd_CMD_TDLS_OPERATION, 0x0122), + + /** Host Command ID : Packet aggregation over host interface */ + ENUM_ELEMENT(HostCmd_CMD_PACKET_AGGR_OVER_HOST_INTERFACE, 0x0117), + +#ifdef SDIO +#endif + + /** Host Command ID : Extended scan support */ + ENUM_ELEMENT(HostCmd_CMD_802_11_SCAN_EXT, 0x0107), + + /** Host Command ID : Forward mgmt frame */ + ENUM_ELEMENT(HostCmd_CMD_RX_MGMT_IND, 0x010c), + +#ifdef PCIE + /** Host Command ID: Host buffer description */ + ENUM_ELEMENT(HostCmd_CMD_PCIE_HOST_BUF_DETAILS, 0x00fa), +#endif + + /** Host Command ID : Set BSS_MODE */ + ENUM_ELEMENT(HostCmd_CMD_SET_BSS_MODE, 0x00f7), + +#ifdef UAP_SUPPORT + /** Host Command id: SYS_INFO */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_SYS_INFO, 0x00ae), + /** Host Command id: sys_reset */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_SYS_RESET, 0x00af), + /** Host Command id: SYS_CONFIGURE */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_SYS_CONFIGURE, 0x00b0), + /** Host Command id: BSS_START */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_BSS_START, 0x00b1), + /** Host Command id: BSS_STOP */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_BSS_STOP, 0x00b2), + /** Host Command id: sta_list */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_STA_LIST, 0x00b3), + /** Host Command id: STA_DEAUTH */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_STA_DEAUTH, 0x00b5), + + /** Host Command id: REPORT_MIC */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_REPORT_MIC, 0x00ee), + /** Host Command id: UAP_OPER_CTRL */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_OPER_CTRL, 0x0233), +#endif /* UAP_SUPPORT */ + + /** Host Command id: PMIC CONFIGURE*/ + ENUM_ELEMENT(HostCmd_CMD_PMIC_CONFIGURE, 0x23E), + + /** Host Command ID: 802.11 Network Monitor */ + ENUM_ELEMENT(HostCmd_CMD_802_11_NET_MONITOR, 0x0102), + + /** Host Command ID: Tx data pause */ + ENUM_ELEMENT(HostCmd_CMD_CFG_TX_DATA_PAUSE, 0x0103), + +#ifdef WIFI_DIRECT_SUPPORT + /** Host Command ID: P2P PARAMS CONFIG */ + ENUM_ELEMENT(HostCmd_CMD_P2P_PARAMS_CONFIG, 0x00ea), + /** Host Command ID: WIFI_DIRECT_MODE_CONFIG */ + ENUM_ELEMENT(HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG, 0x00eb), +#endif + + /** Host Command ID: GPIO TSF LATCH */ + ENUM_ELEMENT(HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG, 0x0278), + /** Host Command ID: Remain On Channel */ + ENUM_ELEMENT(HostCmd_CMD_802_11_REMAIN_ON_CHANNEL, 0x010d), + + ENUM_ELEMENT(HostCmd_CMD_COALESCE_CFG, 0x010a), + + /** Host Command ID: GTK REKEY OFFLOAD CFG */ + ENUM_ELEMENT(HostCmd_CMD_GTK_REKEY_OFFLOAD_CFG, 0x010f), + + /** Host Command ID : OTP user data */ + ENUM_ELEMENT(HostCmd_CMD_OTP_READ_USER_DATA, 0x0114), + + /** Host Command ID: fw auto reconnect */ + ENUM_ELEMENT(HostCmd_CMD_FW_AUTO_RECONNECT, 0x0115), + + /** Host Command ID: HS wakeup reason */ + ENUM_ELEMENT(HostCmd_CMD_HS_WAKEUP_REASON, 0x0116), + + /** Host Command ID: reject addba request */ + ENUM_ELEMENT(HostCmd_CMD_REJECT_ADDBA_REQ, 0x0119), + + ENUM_ELEMENT(HostCmd_CMD_FW_DUMP_EVENT, 0x0125), + + ENUM_ELEMENT(HostCmd_CMD_CONFIG_LOW_POWER_MODE, 0x0128), + + /** Host Command ID : Target device access */ + ENUM_ELEMENT(HostCmd_CMD_TARGET_ACCESS, 0x012a), + + /** Host Command ID: BCA device access */ + ENUM_ELEMENT(HostCmd_CMD_BCA_REG_ACCESS, 0x0272), + /** Host Command ID: register device access */ + ENUM_ELEMENT(HostCmd_CMD_REG_ACCESS, 0x027C), + + /** Host Command ID: DFS repeater mode */ + ENUM_ELEMENT(HostCmd_CMD_DFS_REPEATER_MODE, 0x012b), + + /** Host Command ID: ACS scan */ + ENUM_ELEMENT(HostCmd_CMD_APCMD_ACS_SCAN, 0x0224), + + /** Host Command ID: Get sensor temp*/ + ENUM_ELEMENT(HostCmd_CMD_DS_GET_SENSOR_TEMP, 0x0227), + + /** Host Command ID : Configure ADHOC_OVER_IP parameters */ + ENUM_ELEMENT(HostCmd_CMD_WMM_PARAM_CONFIG, 0x023a), + + ENUM_ELEMENT(HostCmd_CMD_IPV6_RA_OFFLOAD_CFG, 0x0238), + +#ifdef STA_SUPPORT + /** Host Command ID : set/get sta configure */ + ENUM_ELEMENT(HostCmd_CMD_STA_CONFIGURE, 0x023f), +#endif + + /** Host Command ID : GPIO independent reset configure */ + ENUM_ELEMENT(HostCmd_CMD_INDEPENDENT_RESET_CFG, 0x0243), + + /** use to query chan region cfg setting in firmware */ + ENUM_ELEMENT(HostCmd_CMD_CHAN_REGION_CFG, 0x0242), + /** used in hostcmd to download region power cfg setting to firmware */ + ENUM_ELEMENT(HostCmd_CMD_REGION_POWER_CFG, 0x0249), + + /** Host Command ID : Packet aggregation CTRL */ + ENUM_ELEMENT(HostCmd_CMD_PACKET_AGGR_CTRL, 0x0251), + + ENUM_ELEMENT(HostCmd_CMD_DYN_BW, 0x0252), + + ENUM_ELEMENT(HostCmd_CMD_BOOT_SLEEP, 0x0258), + + ENUM_ELEMENT(HostCmd_CMD_RX_ABORT_CFG, 0x0261), + ENUM_ELEMENT(HostCmd_CMD_RX_ABORT_CFG_EXT, 0x0262), + ENUM_ELEMENT(HostCmd_CMD_TX_AMPDU_PROT_MODE, 0x0263), + ENUM_ELEMENT(HostCmd_CMD_RATE_ADAPT_CFG, 0x0264), + ENUM_ELEMENT(HostCmd_CMD_CCK_DESENSE_CFG, 0x0265), + + ENUM_ELEMENT(HostCmd_CMD_FTM_CONFIG_SESSION_PARAMS, 0x024d), + ENUM_ELEMENT(HostCmd_CMD_FTM_SESSION_CTRL, 0x024e), + ENUM_ELEMENT(HostCmd_CMD_FTM_FEATURE_CTRL, 0x024f), + ENUM_ELEMENT(HostCmd_CMD_WLS_REQ_FTM_RANGE, 0x0250), + + ENUM_ELEMENT(HostCmd_CMD_FTM_CONFIG_RESPONDER, 0x0255), + + ENUM_ELEMENT(HostCmd_CMD_VDLL, 0x0240), +#if defined(PCIE) + ENUM_ELEMENT(HostCmd_CMD_SSU, 0x0259), +#endif + ENUM_ELEMENT(HostCmd_CMD_CSI, 0x025b), + +#if defined(UAP_SUPPORT) + /** Host Command ID : Add New Station */ + ENUM_ELEMENT(HostCmd_CMD_ADD_NEW_STATION, 0x025f), +#endif + + ENUM_ELEMENT(HostCmd_CMD_DMCS_CONFIG, 0x0260), + + /** Host Command ID: 11AX config */ + ENUM_ELEMENT(HostCmd_CMD_11AX_CFG, 0x0266), + /** Host Command ID: 11AX command */ + ENUM_ELEMENT(HostCmd_CMD_11AX_CMD, 0x026d), + /** Host Command ID: Range ext command */ + ENUM_ELEMENT(HostCmd_CMD_RANGE_EXT, 0x0274), + /** Host Command ID: TWT cfg command */ + ENUM_ELEMENT(HostCmd_CMD_TWT_CFG, 0x0270), + + ENUM_ELEMENT(HostCmd_CMD_LOW_POWER_MODE_CFG, 0x026e), + ENUM_ELEMENT(HostCmd_CMD_UAP_BEACON_STUCK_CFG, 0x0271), + ENUM_ELEMENT(HostCmd_CMD_ARB_CONFIG, 0x0273), + ENUM_ELEMENT(HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG, 0x0275), + ENUM_ELEMENT(HostCmd_CMD_HAL_PHY_CFG, 0x0276), + + /** Host Command ID : IPS Config */ + ENUM_ELEMENT(HostCmd_CMD_IPS_CONFIG, 0x0279), + ENUM_ELEMENT(HostCmd_CMD_OFDM_DESENSE_CFG, 0x027f), + ENUM_ELEMENT(HostCmd_CMD_NAV_MITIGATION_CFG, 0x0282), + + /* Always keep this last */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_init.c b/mxm_wifiex/wlan_src/mlan/mlan_init.c index ebd48c3..4ffeaee 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_init.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_init.c @@ -45,9 +45,6 @@ Change log: #ifdef PCIE #include "mlan_pcie.h" #endif /* PCIE */ -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -#include "hostsa_init.h" -#endif #include "mlan_11ax.h" /******************************************************** @@ -610,7 +607,7 @@ mlan_status wlan_init_priv(pmlan_private priv) } #endif priv->user_rxwinsize = priv->add_ba_param.rx_win_size; - memset(pmadapter, priv->rx_seq, 0, sizeof(priv->rx_seq)); + memset(pmadapter, priv->rx_seq, 0xff, sizeof(priv->rx_seq)); priv->port_ctrl_mode = MTRUE; priv->port_open = MFALSE; priv->prior_port_status = MFALSE; @@ -618,7 +615,6 @@ mlan_status wlan_init_priv(pmlan_private priv) priv->hotspot_cfg = 0; priv->intf_hr_len = pmadapter->ops.intf_header_len; - priv->multi_ap_flag = 0; memset(pmadapter, &priv->chan_rep_req, 0, sizeof(priv->chan_rep_req)); #ifdef USB if (IS_USB(pmadapter->card_type)) { @@ -633,9 +629,6 @@ mlan_status wlan_init_priv(pmlan_private priv) } #endif ret = wlan_add_bsspriotbl(priv); -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - hostsa_init(priv); -#endif LEAVE(); return ret; @@ -883,7 +876,12 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter) pmadapter->is_hs_configured = MFALSE; pmadapter->hs_cfg.conditions = HOST_SLEEP_DEF_COND; pmadapter->hs_cfg.gpio = HOST_SLEEP_DEF_GPIO; - pmadapter->hs_cfg.gap = HOST_SLEEP_DEF_GAP; +#ifdef PCIE + if (IS_PCIE(pmadapter->card_type)) + pmadapter->hs_cfg.gap = HOST_SLEEP_GAP_SPECIAL; + else +#endif + pmadapter->hs_cfg.gap = HOST_SLEEP_DEF_GAP; pmadapter->hs_activated = MFALSE; pmadapter->min_wake_holdoff = HOST_SLEEP_DEF_WAKE_HOLDOFF; pmadapter->hs_inactivity_timeout = HOST_SLEEP_DEF_INACTIVITY_TIMEOUT; @@ -952,6 +950,9 @@ t_void wlan_init_adapter(pmlan_adapter pmadapter) pmadapter->upld_len = 0; pmadapter->event_cause = 0; pmadapter->pmlan_buffer_event = MNULL; + pmadapter->flush_time_ac_vi_vo = DEF_FLUSH_TIME_AC_VI_VO; + pmadapter->flush_time_ac_be_bk = DEF_FLUSH_TIME_AC_BE_BK; + memset(pmadapter, &pmadapter->region_channel, 0, sizeof(pmadapter->region_channel)); pmadapter->region_code = 0; @@ -1144,6 +1145,33 @@ mlan_status wlan_init_lock_list(pmlan_adapter pmadapter) ret = MLAN_STATUS_FAILURE; goto error; } +#ifdef PCIE + if (pcb->moal_init_lock(pmadapter->pmoal_handle, + &pmadapter->pmlan_rx_lock) != + MLAN_STATUS_SUCCESS) { + ret = MLAN_STATUS_FAILURE; + goto error; + } + + if (pcb->moal_init_lock(pmadapter->pmoal_handle, + &pmadapter->pmlan_tx_lock) != + MLAN_STATUS_SUCCESS) { + ret = MLAN_STATUS_FAILURE; + goto error; + } + if (pcb->moal_init_lock(pmadapter->pmoal_handle, + &pmadapter->pmlan_event_lock) != + MLAN_STATUS_SUCCESS) { + ret = MLAN_STATUS_FAILURE; + goto error; + } + if (pcb->moal_init_lock(pmadapter->pmoal_handle, + &pmadapter->pmlan_pcie_lock) != + MLAN_STATUS_SUCCESS) { + ret = MLAN_STATUS_FAILURE; + goto error; + } +#endif #if defined(USB) if (IS_USB(pmadapter->card_type)) { for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) { @@ -1225,6 +1253,20 @@ t_void wlan_free_lock_list(pmlan_adapter pmadapter) if (pmadapter->pmlan_cmd_lock) pcb->moal_free_lock(pmadapter->pmoal_handle, pmadapter->pmlan_cmd_lock); +#ifdef PCIE + if (pmadapter->pmlan_rx_lock) + pcb->moal_free_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_rx_lock); + if (pmadapter->pmlan_tx_lock) + pcb->moal_free_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_tx_lock); + if (pmadapter->pmlan_event_lock) + pcb->moal_free_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_event_lock); + if (pmadapter->pmlan_pcie_lock) + pcb->moal_free_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_pcie_lock); +#endif #if defined(USB) if (IS_USB(pmadapter->card_type)) { for (i = 0; i < MAX_USB_TX_PORT_NUM; i++) { @@ -1893,10 +1935,6 @@ t_void wlan_free_priv(mlan_private *pmpriv) wlan_free_curr_bcn(pmpriv); #endif /* STA_SUPPORT */ -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - hostsa_cleanup(pmpriv); -#endif /*EMBEDDED AUTHENTICATOR*/ - wlan_delete_station_list(pmpriv); LEAVE(); } diff --git a/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h b/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h index 877cb25..a4dce18 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h @@ -357,7 +357,6 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_TP_STATE = 0x0020007D, MLAN_OID_MISC_HAL_PHY_CFG = 0x0020007E, MLAN_OID_MISC_RF_TEST_HE_POWER = 0X0020007F, - MLAN_OID_MISC_MULTI_AP_CFG = 0x00200080, #ifdef UAP_SUPPORT MLAN_OID_MISC_WACP_MODE = 0x00200081, #endif @@ -373,6 +372,9 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_CROSS_CHIP_SYNCH = 0x0020008B, MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME = 0x0020008C, MLAN_OID_MISC_OFDM_DESENSE_CFG = 0x0020008D, + MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F, + MLAN_OID_MISC_NAV_MITIGATION = 0x00200090, + MLAN_OID_MISC_LED_CONFIG = 0x00200091, }; /** Sub command size */ @@ -924,6 +926,12 @@ typedef struct _mlan_deauth_param { #define PROTOCOL_WAPI 0x80 /** WPA3 SAE */ #define PROTOCOL_WPA3_SAE 0x100 +/* hunting-and-pecking loop only */ +#define SAE_PWE_HUNT_AND_PECK 0 +/** hash-to-element only */ +#define SAE_PWE_HASH_TO_ELEMENT 1 +/** both hunting-and-pecking loop and hash-to-element */ +#define SAE_PWE_BOTH 2 /** OWE */ #define PROTOCOL_OWE 0x200 @@ -995,6 +1003,10 @@ typedef struct _wpa_param { t_u32 length; /** passphrase */ t_u8 passphrase[64]; + /** SAE Password length */ + t_u32 sae_password_length; + /** Passphrase */ + t_u8 sae_password[255]; /**group key rekey time in seconds */ t_u32 gk_rekey_time; } wpa_param; @@ -1173,8 +1185,6 @@ typedef struct _mlan_uap_bss_param { /** uap host based config */ t_u32 uap_host_based_config; - /** multi ap flag */ - t_u8 multi_ap_flag; } mlan_uap_bss_param, *pmlan_uap_bss_param; /** mlan_uap_scan_channels */ @@ -1708,8 +1718,10 @@ typedef struct _mlan_ds_get_stats { /** Rx Stuck Related Info*/ /** Rx Stuck Issue count */ t_u32 rx_stuck_issue_cnt[2]; - /** Rx Stuck Recovery count */ - t_u32 rx_stuck_recovery_cnt; + /** Rx Stuck Recovery count polling based */ + t_u32 rx_stuck_poll_recovery_cnt; + /** Rx Stuck Recovery count interrupt based */ + t_u32 rx_stuck_intr_recovery_cnt; /** Rx Stuck TSF */ t_u64 rx_stuck_tsf[2]; /** Tx Watchdog Recovery Related Info */ @@ -1970,87 +1982,7 @@ typedef struct _mlan_ver_ext { /** Extended Capabilities Data */ typedef struct MLAN_PACK_START _ExtCap_t { /** Extended Capabilities value */ - t_u8 rsvdBit87 : 1; /* bit 87 */ - t_u8 rsvdBit86 : 1; /* bit 86 */ - t_u8 rsvdBit85 : 1; /* bit 85 */ - t_u8 beacon_prot : 1; /* bit 84 */ - t_u8 rsvdBit83 : 1; /* bit 83 */ - t_u8 rsvdBit82 : 1; /* bit 82 */ - t_u8 rsvdBit81 : 1; /* bit 81 */ - t_u8 rsvdBit80 : 1; /* bit 80 */ - t_u8 rsvdBit79 : 1; /* bit 79 */ - t_u8 TWTResp : 1; /* bit 78 */ - t_u8 TWTReq : 1; /* bit 77 */ - t_u8 rsvdBit76 : 1; /* bit 76 */ - t_u8 rsvdBit75 : 1; /* bit 75 */ - t_u8 rsvdBit74 : 1; /* bit 74 */ - t_u8 rsvdBit73 : 1; /* bit 73 */ - t_u8 FILS : 1; /* bit 72 */ - t_u8 FTMI : 1; /* bit 71 */ - t_u8 FTMR : 1; /* bit 70 */ - t_u8 CAQ : 1; /* bit 69 */ - t_u8 rsvdBit68 : 1; /* bit 68 */ - t_u8 NCC : 1; /* bit 67 */ - t_u8 rsvdBit66 : 1; /* bit 66 */ - t_u8 chanSchedMgnt : 1; /* bit 65 */ - t_u8 MaxAMSDU1 : 1; /* bit 64 */ - t_u8 MaxAMSDU0 : 1; /* bit 63 */ - t_u8 OperModeNtf : 1; /* bit 62 */ - t_u8 TDLSWildBandwidth : 1; /* bit 61 */ - t_u8 rsvdBit60 : 1; /* bit 60 */ - t_u8 rsvdBit59 : 1; /* bit 59 */ - t_u8 rsvdBit58 : 1; /* bit 58 */ - t_u8 rsvdBit57 : 1; /* bit 57 */ - t_u8 rsvdBit56 : 1; /* bit 56 */ - t_u8 rsvdBit55 : 1; /* bit 55 */ - t_u8 rsvdBit54 : 1; /* bit 54 */ - t_u8 rsvdBit53 : 1; /* bit 53 */ - t_u8 rsvdBit52 : 1; /* bit 52 */ - t_u8 rsvdBit51 : 1; /* bit 51 */ - t_u8 rsvdBit50 : 1; /* bit 50 */ - t_u8 rsvdBit49 : 1; /* bit 49 */ - t_u8 rsvdBit48 : 1; /* bit 48 */ - t_u8 rsvdBit47 : 1; /* bit 47 */ - t_u8 rsvdBit46 : 1; /* bit 46 */ - t_u8 rsvdBit45 : 1; /* bit 45 */ - t_u8 rsvdBit44 : 1; /* bit 44 */ - t_u8 rsvdBit43 : 1; /* bit 43 */ - t_u8 rsvdBit42 : 1; /* bit 42 */ - t_u8 rsvdBit41 : 1; /* bit 41 */ - t_u8 rsvdBit40 : 1; /* bit 40 */ - t_u8 TDLSChlSwitchProhib : 1; /* bit 39 */ - t_u8 TDLSProhibited : 1; /* bit 38 */ - t_u8 TDLSSupport : 1; /* bit 37 */ - t_u8 MSGCF_Capa : 1; /* bit 36 */ - t_u8 Reserved35 : 1; /* bit 35 */ - t_u8 SSPN_Interface : 1; /* bit 34 */ - t_u8 EBR : 1; /* bit 33 */ - t_u8 Qos_Map : 1; /* bit 32 */ - t_u8 Interworking : 1; /* bit 31 */ - t_u8 TDLSChannelSwitching : 1; /* bit 30 */ - t_u8 TDLSPeerPSMSupport : 1; /* bit 29 */ - t_u8 TDLSPeerUAPSDSupport : 1; /* bit 28 */ - t_u8 UTC : 1; /* bit 27 */ - t_u8 DMS : 1; /* bit 26 */ - t_u8 SSID_List : 1; /* bit 25 */ - t_u8 ChannelUsage : 1; /* bit 24 */ - t_u8 TimingMeasurement : 1; /* bit 23 */ - t_u8 MultipleBSSID : 1; /* bit 22 */ - t_u8 AC_StationCount : 1; /* bit 21 */ - t_u8 QoSTrafficCap : 1; /* bit 20 */ - t_u8 BSS_Transition : 1; /* bit 19 */ - t_u8 TIM_Broadcast : 1; /* bit 18 */ - t_u8 WNM_Sleep : 1; /* bit 17 */ - t_u8 TFS : 1; /* bit 16 */ - t_u8 GeospatialLocation : 1; /* bit 15 */ - t_u8 CivicLocation : 1; /* bit 14 */ - t_u8 CollocatedIntf : 1; /* bit 13 */ - t_u8 ProxyARPService : 1; /* bit 12 */ - t_u8 FMS : 1; /* bit 11 */ - t_u8 LocationTracking : 1; /* bit 10 */ - t_u8 MulticastDiagnostics : 1; /* bit 9 */ - t_u8 Diagnostics : 1; /* bit 8 */ - t_u8 Event : 1; /* bit 7 */ + t_u8 Event : 1; /* bit 7 */ /* Byte 1 */ t_u8 SPSMP_Support : 1; /* bit 6 */ t_u8 Reserved5 : 1; /* bit 5 */ t_u8 PSMP_Capable : 1; /* bit 4 */ @@ -2058,6 +1990,86 @@ typedef struct MLAN_PACK_START _ExtCap_t { t_u8 ExtChanSwitching : 1; /* bit 2 */ t_u8 Reserved1 : 1; /* bit 1 */ t_u8 BSS_CoexistSupport : 1; /* bit 0 */ + t_u8 GeospatialLocation : 1; /* bit 15 */ /* Byte 2 */ + t_u8 CivicLocation : 1; /* bit 14 */ + t_u8 CollocatedIntf : 1; /* bit 13 */ + t_u8 ProxyARPService : 1; /* bit 12 */ + t_u8 FMS : 1; /* bit 11 */ + t_u8 LocationTracking : 1; /* bit 10 */ + t_u8 MulticastDiagnostics : 1; /* bit 9 */ + t_u8 Diagnostics : 1; /* bit 8 */ + t_u8 TimingMeasurement : 1; /* bit 23 */ /* Byte 3 */ + t_u8 MultipleBSSID : 1; /* bit 22 */ + t_u8 AC_StationCount : 1; /* bit 21 */ + t_u8 QoSTrafficCap : 1; /* bit 20 */ + t_u8 BSS_Transition : 1; /* bit 19 */ + t_u8 TIM_Broadcast : 1; /* bit 18 */ + t_u8 WNM_Sleep : 1; /* bit 17 */ + t_u8 TFS : 1; /* bit 16 */ + t_u8 Interworking : 1; /* bit 31 */ /* Byte 4 */ + t_u8 TDLSChannelSwitching : 1; /* bit 30 */ + t_u8 TDLSPeerPSMSupport : 1; /* bit 29 */ + t_u8 TDLSPeerUAPSDSupport : 1; /* bit 28 */ + t_u8 UTC : 1; /* bit 27 */ + t_u8 DMS : 1; /* bit 26 */ + t_u8 SSID_List : 1; /* bit 25 */ + t_u8 ChannelUsage : 1; /* bit 24 */ + t_u8 TDLSChlSwitchProhib : 1; /* bit 39 */ /* Byte 5 */ + t_u8 TDLSProhibited : 1; /* bit 38 */ + t_u8 TDLSSupport : 1; /* bit 37 */ + t_u8 MSGCF_Capa : 1; /* bit 36 */ + t_u8 Reserved35 : 1; /* bit 35 */ + t_u8 SSPN_Interface : 1; /* bit 34 */ + t_u8 EBR : 1; /* bit 33 */ + t_u8 Qos_Map : 1; /* bit 32 */ + t_u8 rsvdBit47 : 1; /* bit 47 */ /* Byte 6 */ + t_u8 rsvdBit46 : 1; /* bit 46 */ + t_u8 rsvdBit45 : 1; /* bit 45 */ + t_u8 rsvdBit44 : 1; /* bit 44 */ + t_u8 rsvdBit43 : 1; /* bit 43 */ + t_u8 rsvdBit42 : 1; /* bit 42 */ + t_u8 rsvdBit41 : 1; /* bit 41 */ + t_u8 rsvdBit40 : 1; /* bit 40 */ + t_u8 rsvdBit55 : 1; /* bit 55 */ /* Byte 7 */ + t_u8 rsvdBit54 : 1; /* bit 54 */ + t_u8 rsvdBit53 : 1; /* bit 53 */ + t_u8 rsvdBit52 : 1; /* bit 52 */ + t_u8 rsvdBit51 : 1; /* bit 51 */ + t_u8 rsvdBit50 : 1; /* bit 50 */ + t_u8 rsvdBit49 : 1; /* bit 49 */ + t_u8 rsvdBit48 : 1; /* bit 48 */ + t_u8 MaxAMSDU0 : 1; /* bit 63 */ /* Byte 8 */ + t_u8 OperModeNtf : 1; /* bit 62 */ + t_u8 TDLSWildBandwidth : 1; /* bit 61 */ + t_u8 rsvdBit60 : 1; /* bit 60 */ + t_u8 rsvdBit59 : 1; /* bit 59 */ + t_u8 rsvdBit58 : 1; /* bit 58 */ + t_u8 rsvdBit57 : 1; /* bit 57 */ + t_u8 rsvdBit56 : 1; /* bit 56 */ + t_u8 FTMI : 1; /* bit 71 */ /* Byte 9 */ + t_u8 FTMR : 1; /* bit 70 */ + t_u8 CAQ : 1; /* bit 69 */ + t_u8 rsvdBit68 : 1; /* bit 68 */ + t_u8 NCC : 1; /* bit 67 */ + t_u8 rsvdBit66 : 1; /* bit 66 */ + t_u8 chanSchedMgnt : 1; /* bit 65 */ + t_u8 MaxAMSDU1 : 1; /* bit 64 */ + t_u8 rsvdBit79 : 1; /* bit 79 */ /* Byte 10 */ + t_u8 TWTResp : 1; /* bit 78 */ + t_u8 TWTReq : 1; /* bit 77 */ + t_u8 rsvdBit76 : 1; /* bit 76 */ + t_u8 rsvdBit75 : 1; /* bit 75 */ + t_u8 rsvdBit74 : 1; /* bit 74 */ + t_u8 rsvdBit73 : 1; /* bit 73 */ + t_u8 FILS : 1; /* bit 72 */ + t_u8 rsvdBit87 : 1; /* bit 87 */ /* Byte 11 */ + t_u8 rsvdBit86 : 1; /* bit 86 */ + t_u8 rsvdBit85 : 1; /* bit 85 */ + t_u8 beacon_prot : 1; /* bit 84 */ + t_u8 rsvdBit83 : 1; /* bit 83 */ + t_u8 rsvdBit82 : 1; /* bit 82 */ + t_u8 rsvdBit81 : 1; /* bit 81 */ + t_u8 rsvdBit80 : 1; /* bit 80 */ } MLAN_PACK_END ExtCap_t, *pExtCap_t; #else /** Extended Capabilities Data */ @@ -2397,8 +2409,6 @@ typedef struct _mlan_debug_info { t_u32 last_int_status; /** number of interrupt receive */ t_u32 num_of_irq; - /** flag for sdio rx aggr */ - t_u8 sdio_rx_aggr; /** FW update port number */ t_u32 mp_update[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX * 2]; /** Invalid port update count */ @@ -2473,6 +2483,12 @@ typedef struct _mlan_debug_info { t_u16 last_event_index; /** Number of no free command node */ t_u16 num_no_cmd_node; + /** num_assoc_cmd_error, count result 4 error */ + t_u16 num_assoc_err; + /** num_scan_cmd_error, count result 4 error */ + t_u16 num_scan_err; + /** num_remain_on_channel_cmd_error, count result 4 error */ + t_u16 num_remain_chan_err; /** pending command id */ t_u16 pending_cmd; /** time stamp for dnld last cmd */ @@ -2853,51 +2869,6 @@ typedef struct _mlan_ds_sec_cfg { } param; } mlan_ds_sec_cfg, *pmlan_ds_sec_cfg; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -#define BIT_TLV_TYPE_CRYPTO_KEY (1 << 0) -#define BIT_TLV_TYPE_CRYPTO_KEY_IV (1 << 1) -#define BIT_TLV_TYPE_CRYPTO_KEY_PREFIX (1 << 2) -#define BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK (1 << 3) - -/** Type definition of mlan_ds_sup_cfg */ -typedef struct _mlan_ds_sup_cfg { - /** Sub-command */ - t_u8 sub_command; - /** output length */ - t_u16 output_len; - /** number of data blks */ - t_u16 data_blks_nr; - /** sub action code */ - t_u8 sub_action_code; - /** skip bytes */ - t_u16 skip_bytes; - /** iteration */ - t_u32 iteration; - /** count */ - t_u32 count; - /** pointer to output */ - t_u8 *output; - /** key length */ - t_u16 key_len; - /** pointer to key */ - t_u8 *key; - /** key iv length */ - t_u16 key_iv_len; - /** pointer to key iv */ - t_u8 *key_iv; - /** key prefix length */ - t_u16 key_prefix_len; - /** pointer to key prefix */ - t_u8 *key_prefix; - /** pointer to data blk length array */ - t_u32 *key_data_blk_len; - /** pointer to key data blk pointer array */ - t_u8 **key_data_blk; - /** callback */ - t_u8 call_back; -} mlan_ds_sup_cfg, *pmlan_ds_sup_cfg; -#endif - /*-----------------------------------------------------------------*/ /** Rate Configuration Group */ /*-----------------------------------------------------------------*/ @@ -3122,6 +3093,8 @@ typedef struct _mlan_ds_beacon_stuck_param_cfg { /** Host sleep config GPIO : Default */ #define HOST_SLEEP_DEF_GPIO 0xff +/** Host sleep config gap : Special setting (host acknowledge required) */ +#define HOST_SLEEP_GAP_SPECIAL 0xff /** Host sleep config gap : Default */ #define HOST_SLEEP_DEF_GAP 200 /** Host sleep config min wake holdoff */ @@ -3143,7 +3116,7 @@ typedef struct _mlan_ds_hs_cfg { /** GPIO pin or 0xff for interface */ t_u32 gpio; /** Gap in milliseconds or or 0xff for special - * setting when GPIO is used to wakeup host + * setting (host acknowledge required) */ t_u32 gap; /** Host sleep wake interval */ @@ -3240,6 +3213,8 @@ typedef struct _mlan_ds_inactivity_to { t_u32 mcast_timeout; /** Timeout for additional Rx traffic after Null PM1 packet exchange */ t_u32 ps_entry_timeout; + /** Inactivity timeout for cmd */ + t_u32 ps_cmd_timeout; } mlan_ds_inactivity_to, *pmlan_ds_inactivity_to; /** Minimum sleep period in milliseconds */ @@ -4027,6 +4002,8 @@ typedef struct _mlan_ds_11ax_cfg { #define MLAN_11AXCMD_CFG_ID_TXOP_RTS 5 #define MLAN_11AXCMD_CFG_ID_TX_OMI 6 #define MLAN_11AXCMD_CFG_ID_OBSSNBRU_TOLTIME 7 +#define MLAN_11AXCMD_CFG_ID_SET_BSRP 8 +#define MLAN_11AXCMD_CFG_ID_LLDE 9 #define MLAN_11AXCMD_SR_SUBID 0x102 #define MLAN_11AXCMD_BEAM_SUBID 0x103 @@ -4034,6 +4011,8 @@ typedef struct _mlan_ds_11ax_cfg { #define MLAN_11AXCMD_TXOMI_SUBID 0x105 #define MLAN_11AXCMD_OBSS_TOLTIME_SUBID 0x106 #define MLAN_11AXCMD_TXOPRTS_SUBID 0x108 +#define MLAN_11AXCMD_SET_BSRP_SUBID 0x109 +#define MLAN_11AXCMD_LLDE_SUBID 0x110 #define MLAN_11AX_TWT_SETUP_SUBID 0x114 #define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115 @@ -4108,6 +4087,29 @@ typedef struct _mlan_ds_11ax_toltime_cmd { t_u32 tol_time; } mlan_ds_11ax_toltime_cmd, *pmlan_ds_11ax_toltime_cmd; +/** Type definition of mlan_ds_11ax_set_bsrp_cmd for MLAN_OID_11AX_CMD_CFG */ +typedef struct _mlan_ds_11ax_set_bsrp_cmd { + /** command value: 1 is enable, 0 is disable*/ + t_u8 value; +} mlan_ds_11ax_set_bsrp_cmd, *pmlan_ds_11ax_set_bsrp_cmd; + +/** Type definition of mlan_ds_11ax_llde_cmd for MLAN_OID_11AX_CMD_CFG */ +typedef struct _mlan_ds_11ax_llde_cmd { + t_u8 llde; // Uplink LLDE: enable=1,disable=0 + t_u8 mode; // operation mode: default=0,carplay=1,gameplay=2 + t_u8 fixrate; // trigger frame rate: auto=0xff + 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 mu_rts_successcnt; + t_u16 mu_rts_failcnt; + t_u16 basic_trigger_successcnt; + t_u16 basic_trigger_failcnt; + t_u16 tbppdu_nullcnt; + t_u16 tbppdu_datacnt; +} mlan_ds_11ax_llde_cmd, *pmlan_ds_11ax_llde_cmd; + /** Type definition of mlan_ds_11ax_cmd_cfg for MLAN_OID_11AX_CMD_CFG */ typedef struct _mlan_ds_11ax_cmd_cfg { /** Sub-command */ @@ -4129,6 +4131,10 @@ typedef struct _mlan_ds_11ax_cmd_cfg { /** OBSS tolerance time configuration for * MLAN_11AXCMD_TOLTIME_SUBID */ mlan_ds_11ax_toltime_cmd toltime_cfg; + /** SET_BSRP configuration for MLAN_11AXCMD_SET_BSRP_SUBID */ + mlan_ds_11ax_set_bsrp_cmd setbsrp_cfg; + /* MLAN_11AXCMD_LLDE_SUBID */ + mlan_ds_11ax_llde_cmd llde_cfg; } param; } mlan_ds_11ax_cmd_cfg, *pmlan_ds_11ax_cmd_cfg; @@ -4583,6 +4589,39 @@ typedef struct _mlan_ds_misc_rx_abort_cfg_ext { t_u8 edmac_enable; } mlan_ds_misc_rx_abort_cfg_ext; +/** Type definition of mlan_ds_misc_nav_mitigation + * for MLAN_OID_MISC_NAV_MITIGATION + */ +typedef struct _mlan_ds_misc_nav_mitigation { + /** start/stop nav mitigation */ + t_u16 start_nav_mitigation; + /** Duration value in us to set as threshold in ACT_SET action */ + t_u16 threshold; + /** Counter for NAV mitigation detected */ + t_u16 detect_cnt; + /** Counter for NAV mitigation stopped */ + t_u16 stop_cnt; + +} mlan_ds_misc_nav_mitigation; + +#define MAX_FW_STATES 6 +typedef struct _mlan_ds_led_behavior { + t_u8 firmwarestate; + t_u8 ledstate; + t_u8 ledargs; +} mlan_ds_misc_led_behavior; + +/** Type definition of mlan_ds_misc_led_cfg + * for MLAN_OID_MISC_LED_CONFIG + */ +typedef struct _mlan_ds_misc_led_cfg { + t_u32 sub_command; + t_u8 enable; + /** tlv len */ + t_u16 led_cfg_len; + mlan_ds_misc_led_behavior misc_led_behvr[MAX_FW_STATES]; +} mlan_ds_misc_led_cfg; + /** Type definition of mlan_ds_misc_rx_abort_cfg_ext * for MLAN_OID_MISC_TX_AMDPU_PROT_MODE */ @@ -6075,6 +6114,13 @@ typedef struct _mlan_ds_cross_chip_synch { t_u32 init_tsf_high; } mlan_ds_cross_chip_synch; +typedef struct _mlan_ds_reorder_flush_time { + /** AC BK/BE_flush time*/ + t_u16 flush_time_ac_be_bk; + /** AC VI/VO flush time */ + t_u16 flush_time_ac_vi_vo; +} mlan_ds_reorder_flush_time; + /** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */ typedef struct _mlan_ds_misc_cfg { /** Sub-command */ @@ -6142,8 +6188,6 @@ typedef struct _mlan_ds_misc_cfg { #endif /** Hotspot config param set */ t_u32 hotspot_cfg; - /** Multi AP flag */ - t_u8 multi_ap_flag; #ifdef STA_SUPPORT ExtCap_t ext_cap; #endif @@ -6214,6 +6258,8 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_rx_abort_cfg rx_abort_cfg; mlan_ds_misc_ofdm_desense_cfg ofdm_desense_cfg; mlan_ds_misc_rx_abort_cfg_ext rx_abort_cfg_ext; + mlan_ds_misc_nav_mitigation nav_mitigation; + mlan_ds_misc_led_cfg led_config; mlan_ds_misc_tx_ampdu_prot_mode tx_ampdu_prot_mode; mlan_ds_misc_rate_adapt_cfg rate_adapt_cfg; mlan_ds_misc_cck_desense_cfg cck_desense_cfg; @@ -6242,6 +6288,7 @@ typedef struct _mlan_ds_misc_cfg { t_u32 ips_ctrl; mlan_ds_ch_load ch_load; mlan_ds_cross_chip_synch cross_chip_synch; + mlan_ds_reorder_flush_time flush_time; } param; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_join.c b/mxm_wifiex/wlan_src/mlan/mlan_join.c index d6e77cd..b8a63b7 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_join.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_join.c @@ -39,9 +39,6 @@ Change log: #include "mlan_11ac.h" #include "mlan_11ax.h" #include "mlan_11h.h" -#ifdef DRV_EMBEDDED_SUPPLICANT -#include "authenticator_api.h" -#endif /******************************************************** Local Constants ********************************************************/ @@ -1041,9 +1038,6 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, t_u32 rates_size; t_u16 tmp_cap; t_u8 *pos; -#ifdef DRV_EMBEDDED_SUPPLICANT - void *rsn_wpa_ie_tmp = MNULL; -#endif t_u8 ft_akm = 0; t_u8 oper_class; t_u8 oper_class_flag = MFALSE; @@ -1051,7 +1045,6 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, MrvlIEtypes_HostMlme_t *host_mlme_tlv = MNULL; MrvlIEtypes_PrevBssid_t *prev_bssid_tlv = MNULL; t_u8 zero_mac[MLAN_MAC_ADDR_LENGTH] = {0}; - MrvlIEtypes_MultiAp_t *multi_ap_tlv = MNULL; ENTER(); @@ -1258,25 +1251,11 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, psecurity_cfg_ie->header.len; psecurity_cfg_ie->header.len = wlan_cpu_to_le16(psecurity_cfg_ie->header.len); - } -#ifdef DRV_EMBEDDED_SUPPLICANT - else if (supplicantIsEnabled(pmpriv->psapriv)) { - supplicantClrEncryptKey(pmpriv->psapriv); - - if (pbss_desc->prsn_ie) - rsn_wpa_ie_tmp = pbss_desc->prsn_ie; - else if (pbss_desc->pwpa_ie) - rsn_wpa_ie_tmp = pbss_desc->pwpa_ie; - prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos; - pos += supplicantFormatRsnWpaTlv( - pmpriv->psapriv, rsn_wpa_ie_tmp, prsn_ie_tlv); - } -#endif - else if (pmpriv->sec_info.ewpa_enabled || - (pbss_desc->owe_transition_mode == - OWE_TRANS_MODE_OWE) || - (pmpriv->sec_info.authentication_mode == - MLAN_AUTH_MODE_OWE)) { + } else if (pmpriv->sec_info.ewpa_enabled || + (pbss_desc->owe_transition_mode == + OWE_TRANS_MODE_OWE) || + (pmpriv->sec_info.authentication_mode == + MLAN_AUTH_MODE_OWE)) { prsn_ie_tlv = (MrvlIEtypes_RsnParamSet_t *)pos; if (pbss_desc->pwpa_ie) { prsn_ie_tlv->header.type = @@ -1448,6 +1427,13 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, wlan_11ax_bandconfig_allowed(pmpriv, pbss_desc)) wlan_cmd_append_11ax_tlv(pmpriv, pbss_desc, &pos); + if ((!pbss_desc->disable_11n) && + (ISSUPP_11NENABLED(pmadapter->fw_cap_info) || + ISSUPP_11ACENABLED(pmadapter->fw_cap_info) || + IS_FW_SUPPORT_11AX(pmadapter))) { + PRINTM(MCMND, "STBC NOT supported, Will be disabled\n"); + } + wlan_wmm_process_association_req(pmpriv, &pos, &pbss_desc->wmm_ie); if (pmpriv->sec_info.wapi_enabled && pmpriv->wapi_ie_len) wlan_cmd_append_wapi_ie(pmpriv, &pos); @@ -1488,18 +1474,6 @@ mlan_status wlan_cmd_802_11_associate(mlan_private *pmpriv, pos += sizeof(prev_bssid_tlv->header) + MLAN_MAC_ADDR_LENGTH; } - if (pmpriv->multi_ap_flag) { - multi_ap_tlv = (MrvlIEtypes_MultiAp_t *)pos; - multi_ap_tlv->header.type = wlan_cpu_to_le16(TLV_TYPE_MULTI_AP); - multi_ap_tlv->header.len = sizeof(multi_ap_tlv->flag); - multi_ap_tlv->flag = pmpriv->multi_ap_flag; - PRINTM(MINFO, " TLV multi_ap_flag : 0x%x\n", - multi_ap_tlv->flag); - pos += sizeof(multi_ap_tlv->header) + multi_ap_tlv->header.len; - multi_ap_tlv->header.len = - wlan_cpu_to_le16(sizeof(multi_ap_tlv->flag)); - } - if (wlan_11d_create_dnld_countryinfo(pmpriv, pbss_desc->bss_band)) { PRINTM(MERROR, "Dnld_countryinfo_11d failed\n"); ret = MLAN_STATUS_FAILURE; @@ -1715,7 +1689,6 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv, /* Send a Media Connected event, according to the Spec */ pmpriv->media_connected = MTRUE; - pmpriv->multi_ap_flag = 0; pmpriv->adapter->pps_uapsd_mode = MFALSE; pmpriv->adapter->tx_lock_flag = MFALSE; pmpriv->adapter->delay_null_pkt = MFALSE; @@ -1857,11 +1830,7 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv, if (!pmpriv->sec_info.wpa_enabled && !pmpriv->sec_info.wpa2_enabled && !pmpriv->sec_info.ewpa_enabled && !pmpriv->sec_info.wapi_enabled && - !pmpriv->wps.session_enable && !pmpriv->sec_info.osen_enabled -#ifdef DRV_EMBEDDED_SUPPLICANT - && !supplicantIsEnabled(pmpriv->psapriv) -#endif - ) { + !pmpriv->wps.session_enable && !pmpriv->sec_info.osen_enabled) { /* We are in Open/WEP mode, open port immediately */ if (pmpriv->port_ctrl_mode == MTRUE) { pmpriv->port_open = MTRUE; @@ -1870,22 +1839,9 @@ mlan_status wlan_ret_802_11_associate(mlan_private *pmpriv, } if (pmpriv->sec_info.wpa_enabled || pmpriv->sec_info.wpa2_enabled || pmpriv->sec_info.ewpa_enabled || pmpriv->sec_info.wapi_enabled || - pmpriv->wps.session_enable || pmpriv->sec_info.osen_enabled -#ifdef DRV_EMBEDDED_SUPPLICANT - || (supplicantIsEnabled(pmpriv->psapriv)) -#endif - ) + pmpriv->wps.session_enable || pmpriv->sec_info.osen_enabled) pmpriv->adapter->scan_block = MTRUE; -#ifdef DRV_EMBEDDED_SUPPLICANT - supplicantInitSession( - pmpriv->psapriv, - (t_u8 *)&pmpriv->curr_bss_params.bss_descriptor.ssid.ssid, - pmpriv->curr_bss_params.bss_descriptor.ssid.ssid_len, - (t_u8 *)&pmpriv->curr_bss_params.bss_descriptor.mac_address, - (t_u8 *)&pmpriv->curr_addr); -#endif - pevent = (mlan_event *)event_buf; memset(pmadapter, event_buf, 0, sizeof(event_buf)); pevent->bss_index = pmpriv->bss_index; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_main.h b/mxm_wifiex/wlan_src/mlan/mlan_main.h index 8675f73..b95e66b 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_main.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_main.h @@ -5,7 +5,7 @@ * in MLAN module. * * - * 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 @@ -558,14 +558,6 @@ extern t_void (*assert_callback)(t_void *pmoal_handle, t_u32 cond); /** Type vdll */ #define MLAN_TYPE_VDLL 4 #ifdef SDIO -/** Type single port aggr data */ -#define MLAN_TYPE_SPA_DATA 10 -/** OFFSET of 512 block number */ -#define OFFSET_OF_BLOCK_NUMBER 15 -/** OFFSET of SDIO Header */ -#define OFFSET_OF_SDIO_HEADER 28 -/** sdio max rx size for cmd53, 255 * 256, reserve 1 block for DMA alignment */ -#define SDIO_CMD53_MAX_SIZE 65280 #define MAX_SUPPORT_AMSDU_SIZE 4096 /** Maximum numbfer of registers to read for multiple port */ #define MAX_MP_REGS 196 @@ -668,6 +660,12 @@ typedef struct _wlan_dbg { t_u16 last_event_index; /** Number of no free command node */ t_u16 num_no_cmd_node; + /** num_assoc_cmd_error, count result 4 error */ + t_u16 num_assoc_err; + /** num_scan_cmd_error, count result 4 error */ + t_u16 num_scan_err; + /** num_remain_on_channel_cmd_error, count result 4 error */ + t_u16 num_remain_chan_err; } wlan_dbg; /** Hardware status codes */ @@ -702,11 +700,6 @@ typedef enum _PS_STATE { PS_STATE_SLEEP } PS_STATE; -/** Minimum flush timer for win size of 1 is 50 ms */ -#define MIN_FLUSH_TIMER_MS 50 -/** Minimum flush timer for win size of 1 is 15 ms */ -#define MIN_FLUSH_TIMER_15_MS 15 - /** Tx BA stream table */ typedef struct _TxBAStreamTbl TxBAStreamTbl; @@ -740,7 +733,9 @@ typedef struct _txAggr_t { typedef enum _baStatus_e { BA_STREAM_NOT_SETUP = 0, BA_STREAM_SETUP_INPROGRESS, - BA_STREAM_SETUP_COMPLETE + BA_STREAM_SETUP_SENT_ADDBA, + BA_STREAM_SETUP_COMPLETE, + BA_STREAM_SENT_DELBA, } baStatus_e; /** RA list table */ @@ -1332,7 +1327,6 @@ typedef struct _mlan_private { /** IP address */ t_u8 ip_addr[IPADDR_LEN]; t_u32 hotspot_cfg; - t_u8 multi_ap_flag; #ifdef STA_SUPPORT ExtCap_t ext_cap; ExtCap_t def_ext_cap; @@ -1347,9 +1341,6 @@ typedef struct _mlan_private { #endif /** Control TX AMPDU on infra link */ t_u8 txaggrctrl; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - t_void *psapriv; -#endif /** rx per packet info */ t_u8 rx_pkt_info; /** received amsdu count*/ @@ -1406,12 +1397,14 @@ typedef struct { mlan_private *priv; } reorder_tmr_cnxt_t; -#define MLAN_SET_BIT(x, val) ((x) |= (1U << (val))) -#define MLAN_CLEAR_BIT(x, val) ((x) &= ~(1U << (val))) +#define MLAN_SET_BIT(x, val) ((x) |= (1UL << (val))) +#define MLAN_CLEAR_BIT(x, val) ((x) &= ~(1UL << (val))) /** default RX reorder table flush time 128 ms for AC_VI, AC_VO*/ #define DEF_FLUSH_TIME_AC_VI_VO 128 -/** default RX reorder table flush time 500 ms for AC_BE, AC_BK*/ -#define DEF_FLUSH_TIME_AC_BE_BK 500 +/** default RX reorder table flush time 512 ms for AC_BE, AC_BK*/ +#define DEF_FLUSH_TIME_AC_BE_BK 512 +/** minimal AMPDU flush time */ +#define MIN_FLUSH_TIME 100 /** RX reorder table */ struct _RxReorderTbl { /** RxReorderTbl previous node */ @@ -1586,12 +1579,7 @@ struct _sta_node { t_u8 tx_pause; /** station band mode */ t_u16 bandmode; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - t_void *cm_connectioninfo; -#endif sta_stats stats; - /** station aid */ - t_u16 aid; }; /** 802.11h State information kept in the 'mlan_adapter' driver structure */ @@ -2104,10 +2092,6 @@ typedef struct _mlan_sdio_card { /** GPIO interrupt pin number */ t_u32 gpio_pin; - /** flag for sdio rx aggr */ - t_bool sdio_rx_aggr_enable; - /** fw rx block size */ - t_u16 sdio_rx_block_size; } mlan_sdio_card, *pmlan_sdio_card; #endif @@ -2307,7 +2291,7 @@ typedef struct _adapter_operations { /**interrupt handler*/ mlan_status (*interrupt)(t_u16 msg_id, pmlan_adapter pmadapter); /**INT process handler*/ - mlan_status (*process_int_status)(pmlan_adapter pmadapter); + mlan_status (*process_int_status)(pmlan_adapter pmadapter, t_u8 type); /**host to card handler*/ mlan_status (*host_to_card)(pmlan_private pmpriv, t_u8 type, mlan_buffer *pmbuf, @@ -2358,6 +2342,16 @@ struct _mlan_adapter { t_void *pmlan_lock; /** main_proc_lock for main_process */ t_void *pmain_proc_lock; +#ifdef PCIE + /** rx data lock to synchronize wlan_pcie_process_recv_data */ + t_void *pmlan_rx_lock; + /** 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 */ + t_void *pmlan_event_lock; + /** pcie lock to synchronize rxbd_wr_ptr and txbd_wr_ptr */ + t_void *pmlan_pcie_lock; +#endif /** mlan_processing */ t_u32 mlan_processing; /** main_process_cnt */ @@ -2376,6 +2370,10 @@ struct _mlan_adapter { t_u32 more_task_flag; /** delay task flag */ t_u32 delay_task_flag; +#ifdef PCIE + /** delay rx data */ + t_u32 delay_rx_data_flag; +#endif /** Max tx buf size */ t_u16 max_tx_buf_size; /** Tx buf size */ @@ -2859,21 +2857,25 @@ struct _mlan_adapter { t_u8 tx_power_table_a_cols; /**mlan adapter operations*/ mlan_adapter_operations ops; -#ifdef DRV_EMBEDDED_AUTHENTICATOR - /** authenticator_priv */ - pmlan_private authenticator_priv; -#endif /** TP accounting mode 1-enable 0-disable */ t_u32 tp_state_on; /** Packet drop point */ t_u32 tp_state_drop_point; /** second mac flag */ t_u8 second_mac; + /** napi */ + t_u8 napi; /* lower 8 bytes of uuid */ t_u64 uuid_lo; /* higher 8 bytes of uuid */ t_u64 uuid_hi; + /** AC BK/BE_flush time*/ + t_u16 flush_time_ac_be_bk; + /** AC VI/VO flush time */ + t_u16 flush_time_ac_vi_vo; + /** remain_on_channel flag */ + t_u8 remain_on_channel; }; /** Check if stream 2X2 enabled */ @@ -3475,6 +3477,9 @@ mlan_status wlan_cmd_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd, mlan_status wlan_ret_802_11_scan(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, t_void *pioctl_buf); +mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); + t_u8 wlan_get_ext_scan_state(HostCmd_DS_COMMAND *pcmd); /** Extended scan command handler */ mlan_status wlan_cmd_802_11_scan_ext(pmlan_private pmpriv, @@ -3628,9 +3633,19 @@ mlan_status wlan_ret_ofdmdesense_cfg(pmlan_private pmpriv, mlan_status wlan_cmd_rxabortcfg_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, t_void *pdata_buf); +mlan_status wlan_cmd_nav_mitigation(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, + t_void *pdata_buf); +mlan_status wlan_cmd_led_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, t_void *pdata_buf); mlan_status wlan_ret_rxabortcfg_ext(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf); +mlan_status wlan_ret_nav_mitigation(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); +mlan_status wlan_ret_led_config(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); mlan_status wlan_cmd_tx_ampdu_prot_mode(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, t_void *pdata_buf); @@ -3677,6 +3692,10 @@ mlan_status wlan_misc_ioctl_ofdmdesense_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_rxabortcfg_ext(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); +mlan_status wlan_misc_ioctl_nav_mitigation(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); +mlan_status wlan_misc_ioctl_led(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_tx_ampdu_prot_mode(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_dot11mc_unassoc_ftm_cfg(pmlan_adapter pmadapter, @@ -3781,6 +3800,10 @@ mlan_status wlan_11d_handle_uap_domain_info(mlan_private *pmpriv, t_u16 band, mlan_status wlan_11d_cfg_domain_info(pmlan_adapter pmadapter, mlan_ioctl_req *pioctl_req); +/** This functionn set/get reorder flush time */ +mlan_status wlan_misc_ioctl_reorder_flush_time(pmlan_adapter pmadapter, + mlan_ioctl_req *pioctl_req); + /** This function converts region string to CFP table code */ mlan_status wlan_misc_country_2_cfp_table_code(pmlan_adapter pmadapter, t_u8 *country_code, t_u8 *cfp_bg, @@ -3926,8 +3949,6 @@ static inline t_u8 wlan_is_port_ready(pmlan_adapter pmadapter, t_u32 port_index) return MTRUE; } #endif -mlan_status wlan_check_easymesh_pkt(mlan_private *priv, pmlan_buffer pmbuf, - RxPD *prx_pd); #ifdef UAP_SUPPORT mlan_status wlan_process_uap_rx_packet(mlan_private *priv, pmlan_buffer pmbuf); @@ -3948,10 +3969,6 @@ mlan_status wlan_cmd_get_hw_spec(pmlan_private pmpriv, mlan_status wlan_ret_get_hw_spec(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, t_void *pioctl_buf); #ifdef SDIO -mlan_status wlan_cmd_sdio_rx_aggr_cfg(HostCmd_DS_COMMAND *pcmd, - t_u16 cmd_action, t_void *pdata_buf); -mlan_status wlan_ret_sdio_rx_aggr_cfg(pmlan_private pmpriv, - HostCmd_DS_COMMAND *resp); #endif mlan_status wlan_misc_ioctl_mac_control(pmlan_adapter pmadapter, @@ -4079,15 +4096,10 @@ mlan_status wlan_set_drvdbg(pmlan_adapter pmadapter, mlan_status wlan_misc_hotspot_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); -mlan_status wlan_misc_multi_ap_cfg(pmlan_adapter pmadapter, - pmlan_ioctl_req pioctl_req); - -#ifdef STA_SUPPORT mlan_status wlan_misc_ext_capa_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); t_u32 wlan_is_ext_capa_support(mlan_private *pmpriv); -#endif #ifdef STA_SUPPORT void wlan_add_ext_capa_info_ie(mlan_private *pmpriv, BSSDescriptor_t *pbss_desc, @@ -4100,14 +4112,6 @@ mlan_status wlan_cmd_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, mlan_status wlan_ret_boot_sleep(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf); -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -mlan_status wlan_cmd_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, - t_u16 cmd_action, t_u16 *pdata_buf); - -mlan_status wlan_ret_crypto(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, - mlan_ioctl_req *pioctl_buf); -#endif - #define BW_20MHZ 0 #define BW_40MHZ 1 #define BW_80MHZ 2 @@ -4426,6 +4430,23 @@ static INLINE t_u32 wlan_isspace(t_u8 chr) return chr <= ' ' && (chr == ' ' || (chr <= 13 && chr >= 9)); } +static INLINE const char *wlan_str_skip_prefix(const char *str, + const char *prefix) +{ + const char *substr = str; + + while (*substr && *substr == *prefix) { + substr++; + prefix++; + } + + if (*substr && !*prefix) { + str = substr; + } + + return str; +} + /** delay unit */ typedef enum _delay_unit { USEC, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_misc.c b/mxm_wifiex/wlan_src/mlan/mlan_misc.c index 5e3ac51..cd79f82 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_misc.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_misc.c @@ -39,9 +39,6 @@ Change Log: #ifdef UAP_SUPPORT #include "mlan_uap.h" #endif -#ifdef DRV_EMBEDDED_AUTHENTICATOR -#include "authenticator_api.h" -#endif /******************************************************** Local Variables ********************************************************/ @@ -564,8 +561,6 @@ mlan_status wlan_get_info_debug_info(pmlan_adapter pmadapter, debug_info->mpa_buf = pmadapter->pcard_sd->mpa_buf; debug_info->mpa_buf_size = pmadapter->pcard_sd->mpa_buf_size; - debug_info->sdio_rx_aggr = - pmadapter->pcard_sd->sdio_rx_aggr_enable; memcpy_ext(pmadapter, debug_info->mpa_rx_count, pmadapter->pcard_sd->mpa_rx_count, sizeof(pmadapter->pcard_sd->mpa_rx_count), @@ -1603,7 +1598,7 @@ mlan_status wlan_misc_ioctl_custom_ie_list(pmlan_adapter pmadapter, #ifdef UAP_SUPPORT else if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_UAP) { ret = wlan_prepare_cmd( - pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, 0, + pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, cmd_action, 0, (send_ioctl) ? (t_void *)pioctl_req : MNULL, (send_ioctl) ? MNULL : &misc->param.cust_ie); } @@ -1839,12 +1834,6 @@ sta_node *wlan_add_station_entry(mlan_private *priv, t_u8 *mac) (pmlan_linked_list)sta_ptr, priv->adapter->callbacks.moal_spin_lock, priv->adapter->callbacks.moal_spin_unlock); -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) && - IsAuthenticatorEnabled(priv->psapriv)) - authenticator_init_client(priv->psapriv, - &sta_ptr->cm_connectioninfo, mac); -#endif done: LEAVE(); return sta_ptr; @@ -1865,12 +1854,6 @@ t_void wlan_delete_station_entry(mlan_private *priv, t_u8 *mac) ENTER(); sta_ptr = wlan_get_station_entry(priv, mac); if (sta_ptr) { -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) && - IsAuthenticatorEnabled(priv->psapriv)) - authenticator_free_client(priv->psapriv, - sta_ptr->cm_connectioninfo); -#endif util_unlink_list(priv->adapter->pmoal_handle, &priv->sta_list, (pmlan_linked_list)sta_ptr, priv->adapter->callbacks.moal_spin_lock, @@ -1899,12 +1882,6 @@ t_void wlan_delete_station_list(pmlan_private priv) priv->adapter->pmoal_handle, &priv->sta_list, priv->adapter->callbacks.moal_spin_lock, priv->adapter->callbacks.moal_spin_unlock))) { -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if ((GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) && - IsAuthenticatorEnabled(priv->psapriv)) - authenticator_free_client(priv->psapriv, - sta_ptr->cm_connectioninfo); -#endif priv->adapter->callbacks.moal_mfree(priv->adapter->pmoal_handle, (t_u8 *)sta_ptr); } @@ -2946,7 +2923,7 @@ exit: mlan_status wlan_config_rtt(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) { pmlan_private pmpriv = MNULL; - mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_ds_misc_cfg *misc = MNULL; mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); @@ -2957,6 +2934,8 @@ mlan_status wlan_config_rtt(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) goto exit; } + misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + pmpriv = pmadapter->priv[pioctl_req->bss_index]; /* Send request to firmware */ @@ -2983,7 +2962,7 @@ exit: mlan_status wlan_cancel_rtt(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) { pmlan_private pmpriv = MNULL; - mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_ds_misc_cfg *misc = MNULL; mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); @@ -2994,6 +2973,8 @@ mlan_status wlan_cancel_rtt(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) goto exit; } + misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + pmpriv = pmadapter->priv[pioctl_req->bss_index]; /* Send request to firmware */ @@ -3021,7 +3002,7 @@ mlan_status wlan_rtt_responder_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) { pmlan_private pmpriv = MNULL; - mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_ds_misc_cfg *misc = MNULL; mlan_status ret = MLAN_STATUS_SUCCESS; ENTER(); @@ -3032,6 +3013,8 @@ mlan_status wlan_rtt_responder_cfg(pmlan_adapter pmadapter, goto exit; } + misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + pmpriv = pmadapter->priv[pioctl_req->bss_index]; /* Send request to firmware */ @@ -3065,7 +3048,7 @@ mlan_status wlan_get_tx_rx_histogram(pmlan_adapter pmadapter, ENTER(); /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_TX_RX_PKT_STATS, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_TX_RX_PKT_STATS, HostCmd_ACT_GEN_GET, 0, (t_void *)pioctl_req, &(pmisc->param.tx_rx_histogram)); @@ -3426,7 +3409,6 @@ mlan_status wlan_process_802dot11_mgmt_pkt(mlan_private *priv, t_u8 *payload, return MLAN_STATUS_SUCCESS; } -#ifdef STA_SUPPORT /** * @brief Extended capabilities configuration * @@ -3487,7 +3469,6 @@ t_u32 wlan_is_ext_capa_support(mlan_private *pmpriv) return MFALSE; } } -#endif /** * @brief Set hotspot enable/disable @@ -3515,32 +3496,6 @@ mlan_status wlan_misc_hotspot_cfg(pmlan_adapter pmadapter, return ret; } -/** - * @brief Set multi ap flag - * - * @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_multi_ap_cfg(pmlan_adapter pmadapter, - pmlan_ioctl_req pioctl_req) -{ - pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; - mlan_ds_misc_cfg *misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; - mlan_status ret = MLAN_STATUS_SUCCESS; - - ENTER(); - - if (MLAN_ACT_GET == pioctl_req->action) - misc->param.multi_ap_flag = pmpriv->multi_ap_flag; - else if (MLAN_ACT_SET == pioctl_req->action) - pmpriv->multi_ap_flag = misc->param.multi_ap_flag; - - LEAVE(); - return ret; -} - #ifdef STA_SUPPORT /** * @brief This function check if we should enable beacon protection support @@ -3856,13 +3811,6 @@ void wlan_check_sta_capability(pmlan_private priv, pmlan_buffer pevent, sta_ptr->bandmode = BAND_G; } else sta_ptr->bandmode = BAND_A; -#endif -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (IsAuthenticatorEnabled(priv->psapriv)) - authenticator_get_sta_security_info( - priv->psapriv, - sta_ptr->cm_connectioninfo, - assoc_req_ie, ie_len); #endif break; } @@ -4144,7 +4092,7 @@ mlan_status wlan_radio_ioctl_ant_cfg(pmlan_adapter pmadapter, if (IS_CARD9098(pmadapter->card_type) || IS_CARD9097(pmadapter->card_type) || IS_CARDAW693(pmadapter->card_type) || - IS_CARDIW62X(pmadapter->card_type)) { + IS_CARDIW624(pmadapter->card_type)) { ant_cfg->tx_antenna &= 0x0303; ant_cfg->rx_antenna &= 0x0303; /** 2G antcfg TX */ @@ -4742,6 +4690,16 @@ mlan_status wlan_radio_ioctl_remain_chan_cfg(pmlan_adapter pmadapter, else cmd_action = HostCmd_ACT_GEN_GET; + if (pioctl_req->action == MLAN_ACT_SET) { + if (pmpriv->adapter->remain_on_channel && + !radio_cfg->param.remain_chan.remove) { + PRINTM(MCMND, "Ignore New Remain on channe: chan=%d\n", + radio_cfg->param.remain_chan.channel); + LEAVE(); + return MLAN_STATUS_FAILURE; + } + } + /* Send request to firmware */ ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_REMAIN_ON_CHANNEL, cmd_action, 0, (t_void *)pioctl_req, @@ -4782,7 +4740,7 @@ mlan_status wlan_bss_ioctl_wifi_direct_mode(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_WIFI_DIRECT_MODE_CONFIG, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG, cmd_action, 0, (t_void *)pioctl_req, &bss->param.wfd_mode); @@ -4818,8 +4776,8 @@ mlan_status wlan_misc_p2p_config(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_P2P_PARAMS_CONFIG, cmd_action, - 0, (t_void *)pioctl_req, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_P2P_PARAMS_CONFIG, + cmd_action, 0, (t_void *)pioctl_req, &misc_cfg->param.p2p_config); if (ret == MLAN_STATUS_SUCCESS) @@ -4855,7 +4813,7 @@ mlan_status wlan_misc_gpio_tsf_latch_config(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG, cmd_action, 0, (t_void *)pioctl_req, &misc_cfg->param.gpio_tsf_latch_config); @@ -4888,7 +4846,7 @@ mlan_status wlan_misc_get_tsf_info(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG, cmd_action, 0, (t_void *)pioctl_req, &misc_cfg->param.tsf_info); @@ -5283,8 +5241,9 @@ mlan_status wlan_misc_ioctl_dfs_repeater_cfg(pmlan_adapter pmadapter, } /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_DFS_REPEATER_MODE, cmd_action, 0, - (t_void *)pioctl_req, &misc->param.dfs_repeater); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_DFS_REPEATER_MODE, + cmd_action, 0, (t_void *)pioctl_req, + &misc->param.dfs_repeater); done: if (ret == MLAN_STATUS_SUCCESS) @@ -5314,7 +5273,7 @@ mlan_status wlan_misc_ioctl_low_pwr_mode(pmlan_adapter pmadapter, misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCMD_CONFIG_LOW_POWER_MODE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CONFIG_LOW_POWER_MODE, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, &misc->param.low_pwr_mode); @@ -5342,7 +5301,7 @@ mlan_status wlan_misc_ioctl_pmic_configure(pmlan_adapter pmadapter, ENTER(); /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_PMIC_CONFIGURE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_PMIC_CONFIGURE, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, MNULL); @@ -5955,8 +5914,8 @@ mlan_status wlan_misc_ioctl_mef_flt_cfg(pmlan_adapter pmadapter, pmadapter)) PRINTM(MERROR, "Set MEF Entries Error\n"); - } else if (!(mef_cfg->op_code & - MLAN_IPADDR_OP_IP_REMOVE)) { + } else if (mef_cfg->op_code == + MLAN_IPADDR_OP_IP_REMOVE) { pmef->enable_autoarp_entry = 0; pmef->num_wowlan_entry = 0; pmef->num_ipv6_ns_offload = 0; @@ -6015,24 +5974,6 @@ mlan_status wlan_sec_ioctl_passphrase(pmlan_adapter pmadapter, ENTER(); sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf; -#ifdef DRV_EMBEDDED_SUPPLICANT - if (GET_BSS_ROLE(pmpriv) == MLAN_BSS_ROLE_STA && - !IS_FW_SUPPORT_SUPPLICANT(pmpriv->adapter)) { - if (sec->param.passphrase.psk_type == MLAN_PSK_QUERY) - SupplicantQueryPassphrase( - pmpriv->psapriv, - (void *)&sec->param.passphrase); - else if (sec->param.passphrase.psk_type == MLAN_PSK_CLEAR) - SupplicantClearPMK(pmpriv->psapriv, - (void *)&sec->param.passphrase); - else - SupplicantSetPassphrase(pmpriv->psapriv, - (void *)&sec->param.passphrase); - - LEAVE(); - return ret; - } -#endif if (!IS_FW_SUPPORT_SUPPLICANT(pmpriv->adapter)) { LEAVE(); @@ -6254,6 +6195,7 @@ mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) { mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_misc_cfg *misc_cfg = MNULL; mlan_status ret = MLAN_STATUS_SUCCESS; t_u16 cmd_action = 0; @@ -6263,9 +6205,25 @@ mlan_status wlan_misc_chan_reg_cfg(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; else { PRINTM(MERROR, "No support set channel region cfg!"); + LEAVE(); return MLAN_STATUS_FAILURE; } + misc_cfg = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + if (misc_cfg && + 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 + * country code + */ + pmadapter->country_code[0] = + misc_cfg->param.custom_reg_domain.region.country_code[0]; + pmadapter->country_code[1] = + misc_cfg->param.custom_reg_domain.region.country_code[1]; + pmadapter->country_code[2] = '\0'; + } + /* Send request to firmware */ ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CHAN_REGION_CFG, cmd_action, 0, (t_void *)pioctl_req, MNULL); @@ -6471,8 +6429,8 @@ mlan_status wlan_get_chan_trpc_cfg(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_CHANNEL_TRPC_CONFIG, cmd_action, - 0, (t_void *)pioctl_req, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_CHANNEL_TRPC_CONFIG, + cmd_action, 0, (t_void *)pioctl_req, (t_void *)&misc->param.trpc_cfg); if (ret == MLAN_STATUS_SUCCESS) @@ -6874,6 +6832,71 @@ mlan_status wlan_misc_ioctl_rxabortcfg_ext(pmlan_adapter pmadapter, return ret; } +/** + * @brief nav mitigation parameter + * + * @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_nav_mitigation(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req) +{ + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_misc_cfg *pmisc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + t_u16 cmd_action = 0; + + ENTER(); + + if (pioctl_req->action == MLAN_ACT_SET) + cmd_action = HostCmd_ACT_GEN_SET; + else + cmd_action = HostCmd_ACT_GEN_GET; + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_NAV_MITIGATION_CFG, + cmd_action, 0, (t_void *)pioctl_req, + &(pmisc->param.nav_mitigation)); + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + +/** + * @brief led config parameter + * + * @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_led(pmlan_adapter pmadapter, + pmlan_ioctl_req pioctl_req) +{ + mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; + mlan_ds_misc_cfg *pmisc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + mlan_status ret = MLAN_STATUS_SUCCESS; + t_u16 cmd_action = 0; + + ENTER(); + + if (pioctl_req->action == MLAN_ACT_SET) + cmd_action = HostCmd_ACT_GEN_SET; + else + cmd_action = HostCmd_ACT_GEN_GET; + + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_802_11_LED_CONTROL, + cmd_action, 0, (t_void *)pioctl_req, + &(pmisc->param.led_config)); + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + /** * @brief Dot11mc unassociated FTM CFG * @@ -7356,8 +7379,8 @@ mlan_status wlan_misc_ioctl_wacp_mode(IN pmlan_adapter pmadapter, else cmd_action = HostCmd_ACT_GEN_GET; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, (t_void *)&misc->param.wacp_mode); if (ret == MLAN_STATUS_SUCCESS) @@ -7386,8 +7409,8 @@ mlan_status wlan_misc_ioctl_get_sensor_temp(pmlan_adapter pmadapter, } /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCmd_DS_GET_SENSOR_TEMP, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_DS_GET_SENSOR_TEMP, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -7464,3 +7487,41 @@ done: LEAVE(); return ret; } + +/** + * @brief get/set rx flush time + * + * @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_reorder_flush_time(pmlan_adapter pmadapter, + mlan_ioctl_req *pioctl_req) +{ + mlan_ds_misc_cfg *misc = MNULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + misc = (mlan_ds_misc_cfg *)pioctl_req->pbuf; + + if (pioctl_req->action == MLAN_ACT_SET) { + if (misc->param.flush_time.flush_time_ac_be_bk >= + MIN_FLUSH_TIME) + pmadapter->flush_time_ac_be_bk = + misc->param.flush_time.flush_time_ac_be_bk; + if (misc->param.flush_time.flush_time_ac_vi_vo >= + MIN_FLUSH_TIME) + pmadapter->flush_time_ac_vi_vo = + misc->param.flush_time.flush_time_ac_vi_vo; + } + misc->param.flush_time.flush_time_ac_be_bk = + pmadapter->flush_time_ac_be_bk; + misc->param.flush_time.flush_time_ac_vi_vo = + pmadapter->flush_time_ac_vi_vo; + PRINTM(MCMND, "flush time: BE/BK=%d ms VI/VO=%d ms\n", + pmadapter->flush_time_ac_be_bk, pmadapter->flush_time_ac_vi_vo); + LEAVE(); + return ret; +} diff --git a/mxm_wifiex/wlan_src/mlan/mlan_module.c b/mxm_wifiex/wlan_src/mlan/mlan_module.c index 2281d45..721a49f 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_module.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_module.c @@ -29,7 +29,9 @@ Change log: #include #include "mlan_decl.h" #include "mlan_ioctl.h" - +#ifdef PCIE +EXPORT_SYMBOL(mlan_process_pcie_interrupt_cb); +#endif EXPORT_SYMBOL(mlan_register); EXPORT_SYMBOL(mlan_unregister); EXPORT_SYMBOL(mlan_init_fw); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_pcie.c b/mxm_wifiex/wlan_src/mlan/mlan_pcie.c index 8196170..cf5707d 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_pcie.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_pcie.c @@ -154,7 +154,7 @@ static const struct _mlan_pcie_card_reg mlan_reg_pcieaw693 = { .msi_int_wr_clr = MTRUE, }; -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW62X) +#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) static const struct _mlan_pcie_card_reg mlan_reg_pcie9097_b0 = { .reg_txbd_rdptr = PCIE9098_TXBD_RDPTR, .reg_txbd_wrptr = PCIE9098_TXBD_WRPTR, @@ -794,7 +794,7 @@ static mlan_status wlan_disable_pcie_host_int(mlan_adapter *pmadapter) return ret; } if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || - (pmadapter->card_type == CARD_TYPE_PCIEIW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEIW624) || (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == CARD_TYPE_PCIE9097)) { ret = wlan_pcie_set_host_int_select_mask(pmadapter, MFALSE); @@ -871,7 +871,7 @@ static mlan_status wlan_enable_pcie_host_int(mlan_adapter *pmadapter) return ret; } if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || - (pmadapter->card_type == CARD_TYPE_PCIEIW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEIW624) || (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == CARD_TYPE_PCIE9097)) { ret = wlan_pcie_set_host_int_select_mask(pmadapter, MTRUE); @@ -1871,6 +1871,7 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type, adma_dual_desc_buf *padma_bd_buf = MNULL; const t_u32 num_tx_buffs = pmadapter->pcard_pcie->txrx_bd_size; mlan_status ret = MLAN_STATUS_PENDING; + mlan_status status; pmlan_callbacks pcb = &pmadapter->callbacks; t_u32 rxbd_val = 0; t_u32 wrindx; @@ -1936,6 +1937,9 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type, ptx_bd_buf->offset = 0; pmadapter->pcard_pcie->last_tx_pkt_size[wrindx] = pmbuf->data_len; + + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_pcie_lock); pmadapter->pcard_pcie->txbd_wrptr++; if ((pmadapter->pcard_pcie->txbd_wrptr & txrx_rw_ptr_mask) == num_tx_buffs) @@ -1977,15 +1981,24 @@ static mlan_status wlan_pcie_send_data(mlan_adapter *pmadapter, t_u8 type, ((pmadapter->pcard_pcie->txbd_wrptr << wr_ptr_start) | rxbd_val)); /* Write the TX ring write pointer in to REG_TXBD_WRPTR */ - if (pcb->moal_write_reg(pmadapter->pmoal_handle, reg_txbd_wrptr, - (pmadapter->pcard_pcie->txbd_wrptr - << wr_ptr_start) | - rxbd_val)) { + status = pcb->moal_write_reg( + pmadapter->pmoal_handle, reg_txbd_wrptr, + (pmadapter->pcard_pcie->txbd_wrptr << wr_ptr_start) | + rxbd_val); + +#if defined(PCIE8997) || defined(PCIE8897) + if (!pmadapter->pcard_pcie->reg->use_adma) { + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_pcie_lock); + } +#endif + if (status) { PRINTM(MERROR, "SEND DATA: failed to write REG_TXBD_WRPTR\n"); ret = MLAN_STATUS_FAILURE; goto done_unmap; } + PRINTM(MINFO, "SEND DATA: Updated \n", pmadapter->pcard_pcie->txbd_rdptr, pmadapter->pcard_pcie->txbd_wrptr); @@ -2318,6 +2331,9 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) txrx_rw_ptr_rollover_ind); } + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_pcie_lock); + /* update rxbd's wrptrs */ if ((++pmadapter->pcard_pcie->rxbd_wrptr & txrx_rw_ptr_mask) == @@ -2356,10 +2372,18 @@ static mlan_status wlan_pcie_process_recv_data(mlan_adapter *pmadapter) pmadapter->pcard_pcie->rxbd_wrptr, rdptr); /* Write the RX ring write pointer in to REG_RXBD_WRPTR */ - if (pcb->moal_write_reg( - pmadapter->pmoal_handle, - pmadapter->pcard_pcie->reg->reg_rxbd_wrptr, - pmadapter->pcard_pcie->rxbd_wrptr | txbd_val)) { + ret = pcb->moal_write_reg( + pmadapter->pmoal_handle, + pmadapter->pcard_pcie->reg->reg_rxbd_wrptr, + pmadapter->pcard_pcie->rxbd_wrptr | txbd_val); + +#if defined(PCIE8997) || defined(PCIE8897) + if (!pmadapter->pcard_pcie->reg->use_adma) { + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_pcie_lock); + } +#endif + if (ret) { PRINTM(MERROR, "RECV DATA: failed to write REG_RXBD_WRPTR\n"); ret = MLAN_STATUS_FAILURE; @@ -2586,6 +2610,7 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter) pmlan_buffer pmbuf = pmadapter->pcard_pcie->cmdrsp_buf; pmlan_buffer cmd_buf = MNULL; t_u16 resp_len = 0; + t_u8 cmd_resp_received = MFALSE; ENTER(); @@ -2653,7 +2678,7 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter) pmadapter->upld_len, MRVDRV_SIZE_OF_CMD_BUFFER); } else { - pmadapter->cmd_resp_received = MTRUE; + cmd_resp_received = MTRUE; pmbuf->data_len = pmadapter->upld_len; pmbuf->data_offset += PCIE_INTF_HEADER_LEN; pmadapter->curr_cmd->respbuf = pmbuf; @@ -2699,6 +2724,11 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter) } done: + if (cmd_resp_received) { + wlan_request_cmd_lock(pmadapter); + pmadapter->cmd_resp_received = cmd_resp_received; + wlan_release_cmd_lock(pmadapter); + } LEAVE(); return ret; } @@ -2779,7 +2809,7 @@ static mlan_status wlan_pcie_process_event_ready(mlan_adapter *pmadapter) adma_dual_desc_buf *padma_bd_buf; ENTER(); - if (pmadapter->event_received) { + if (pmadapter->event_received || pmadapter->event_cause) { PRINTM(MINFO, "Event being processed, do not " "process this interrupt just yet\n"); LEAVE(); @@ -2922,9 +2952,15 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter, adma_dual_desc_buf *padma_bd_buf; ENTER(); + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_event_lock); + + pmadapter->event_cause = 0; + pmadapter->pmlan_buffer_event = MNULL; + if (!pmbuf) { - LEAVE(); - return MLAN_STATUS_FAILURE; + ret = MLAN_STATUS_FAILURE; + goto done; } if (wrptr >= MLAN_MAX_EVT_BD) { @@ -2954,8 +2990,8 @@ static mlan_status wlan_pcie_event_complete(mlan_adapter *pmadapter, &pmbuf->buf_pa, MAX_EVENT_SIZE, PCI_DMA_FROMDEVICE)) { PRINTM(MERROR, "EvtCom: failed to moal_map_memory\n"); - LEAVE(); - return MLAN_STATUS_FAILURE; + ret = MLAN_STATUS_FAILURE; + goto done; } pmadapter->pcard_pcie->evt_buf_list[wrptr] = pmbuf; @@ -3026,6 +3062,8 @@ done: PRINTM(MINFO, "EvtCom: Check Events Again\n"); ret = wlan_pcie_process_event_ready(pmadapter); + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_event_lock); LEAVE(); return ret; @@ -3236,8 +3274,8 @@ static mlan_status wlan_pcie_prog_fw_w_helper(mlan_adapter *pmadapter, if (IS_PCIE9097(pmadapter->card_type)) check_fw_status = MTRUE; #endif -#if defined(PCIEIW62X) - if (IS_PCIEIW62X(pmadapter->card_type)) +#if defined(PCIEIW624) + if (IS_PCIEIW624(pmadapter->card_type)) check_fw_status = MTRUE; #endif @@ -3448,20 +3486,18 @@ mlan_status wlan_get_pcie_device(pmlan_adapter pmadapter) pmadapter->pcard_pcie->txrx_bd_size = MAX_TXRX_BD; break; #endif -#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW62X) +#if defined(PCIE9098) || defined(PCIE9097) || defined(PCIEIW624) case CARD_TYPE_PCIE9097: case CARD_TYPE_PCIE9098: - case CARD_TYPE_PCIEIW62X: + case CARD_TYPE_PCIEIW624: pmadapter->pcard_pcie->reg = &mlan_reg_pcie9098; pmadapter->pcard_info = &mlan_card_info_pcie9098; pmadapter->pcard_pcie->txrx_bd_size = ADMA_DEF_TXRX_BD; pmadapter->pcard_pcie->txrx_num_desc = TXRX_DEF_NUM_DESC; -#if defined(PCIE9097) || defined(PCIEIW62X) if ((card_type == CARD_TYPE_PCIE9097 && pmadapter->card_rev == CHIP_9097_REV_B0) || - (card_type == CARD_TYPE_PCIEIW62X)) + (card_type == CARD_TYPE_PCIEIW624)) pmadapter->pcard_pcie->reg = &mlan_reg_pcie9097_b0; -#endif break; #endif @@ -3619,30 +3655,26 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter) if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_dnld_done) { PRINTM(MINFO, "<--- DATA sent Interrupt --->\n"); - ret = wlan_pcie_send_data_complete(pmadapter); - if (ret) - goto done; + wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE, MNULL); } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_upld_rdy) { PRINTM(MINFO, "Rx DATA\n"); - ret = wlan_pcie_process_recv_data(pmadapter); - if (ret) - goto done; + wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_RX_DATA, MNULL); } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_event_rdy) { PRINTM(MINFO, "Rx EVENT\n"); - ret = wlan_pcie_process_event_ready(pmadapter); - if (ret) - goto done; + wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_RX_EVENT, MNULL); } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_done) { if (pmadapter->cmd_sent && !pmadapter->vdll_ctrl.vdll_len) { PRINTM(MINFO, "<--- CMD sent Interrupt --->\n"); pmadapter->cmd_sent = MFALSE; } - ret = wlan_pcie_process_cmd_resp(pmadapter); - if (ret) - goto done; + wlan_recv_event(wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_CMDRESP, MNULL); } if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld && (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_dnld)) { @@ -3655,7 +3687,6 @@ mlan_status wlan_process_msix_int(mlan_adapter *pmadapter) PRINTM(MINFO, "cmd_sent=%d data_sent=%d\n", pmadapter->cmd_sent, pmadapter->data_sent); -done: LEAVE(); return ret; } @@ -3729,10 +3760,9 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter) PRINTM(MINFO, "<--- DATA sent Interrupt --->\n"); pmadapter->callbacks.moal_tp_accounting_rx_param( pmadapter->pmoal_handle, 3, 0); - - ret = wlan_pcie_send_data_complete(pmadapter); - if (ret) - goto done; + wlan_recv_event( + wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE, MNULL); } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_upld_rdy) { @@ -3741,18 +3771,18 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter) PRINTM(MINFO, "Rx DATA\n"); pmadapter->callbacks.moal_tp_accounting_rx_param( pmadapter->pmoal_handle, 0, 0); - ret = wlan_pcie_process_recv_data(pmadapter); - if (ret) - goto done; + wlan_recv_event(wlan_get_priv(pmadapter, + MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_RX_DATA, MNULL); } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_event_rdy) { pcie_ireg &= ~pmadapter->pcard_pcie->reg->host_intr_event_rdy; PRINTM(MINFO, "Rx EVENT\n"); - ret = wlan_pcie_process_event_ready(pmadapter); - if (ret) - goto done; + wlan_recv_event( + wlan_get_priv(pmadapter, MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_RX_EVENT, MNULL); } if (pcie_ireg & pmadapter->pcard_pcie->reg->host_intr_cmd_done) { @@ -3763,9 +3793,9 @@ static mlan_status wlan_process_pcie_int_status(mlan_adapter *pmadapter) PRINTM(MINFO, "<--- CMD sent Interrupt --->\n"); pmadapter->cmd_sent = MFALSE; } - ret = wlan_pcie_process_cmd_resp(pmadapter); - if (ret) - goto done; + wlan_recv_event(wlan_get_priv(pmadapter, + MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_CMDRESP, MNULL); } if (pmadapter->pcard_pcie->reg->host_intr_cmd_dnld && (pcie_ireg & @@ -4049,6 +4079,7 @@ mlan_status wlan_pcie_host_to_card(pmlan_private pmpriv, t_u8 type, { mlan_status ret = MLAN_STATUS_SUCCESS; pmlan_adapter pmadapter = pmpriv->adapter; + pmlan_callbacks pcb = &pmadapter->callbacks; ENTER(); @@ -4057,9 +4088,15 @@ mlan_status wlan_pcie_host_to_card(pmlan_private pmpriv, t_u8 type, return MLAN_STATUS_FAILURE; } - if (type == MLAN_TYPE_DATA) + if (type == MLAN_TYPE_DATA) { + /* synchronize with send_data_complete to sync both txbd_rdptr + * and txbd_wrptr */ + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_tx_lock); ret = wlan_pcie_send_data(pmadapter, type, pmbuf, tx_param); - else if (type == MLAN_TYPE_CMD) + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_tx_lock); + } else if (type == MLAN_TYPE_CMD) ret = wlan_pcie_send_cmd(pmadapter, pmbuf); else if (type == MLAN_TYPE_VDLL) ret = wlan_pcie_send_vdll(pmadapter, pmbuf); @@ -4188,7 +4225,7 @@ mlan_status wlan_alloc_pcie_ring_buf(pmlan_adapter pmadapter) ENTER(); if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || - (pmadapter->card_type == CARD_TYPE_PCIEIW62X) || + (pmadapter->card_type == CARD_TYPE_PCIEIW624) || (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == CARD_TYPE_PCIE9097)) { wlan_pcie_init_adma_ring_size(pmadapter); @@ -4246,7 +4283,7 @@ mlan_status wlan_free_pcie_ring_buf(pmlan_adapter pmadapter) if ((pmadapter->card_type == CARD_TYPE_PCIE9098) || (pmadapter->card_type == CARD_TYPE_PCIEAW693) || (pmadapter->card_type == - CARD_TYPE_PCIEIW62X)(pmadapter->card_type == CARD_TYPE_PCIE9097)) + CARD_TYPE_PCIEIW624)(pmadapter->card_type == CARD_TYPE_PCIE9097)) wlan_pcie_free_rdptrs(pmadapter); #endif @@ -4465,10 +4502,79 @@ static mlan_status wlan_pcie_data_complete(pmlan_adapter pmadapter, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function checks the interrupt status and + * handle it accordingly. + * + * @param pmadapter A pointer to mlan_adapter structure + * + * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE + */ +static mlan_status wlan_pcie_interrupt_ext(t_u16 msg_id, + pmlan_adapter pmadapter) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + ENTER(); + ret = wlan_pcie_interrupt(msg_id, pmadapter); + if (ret == MLAN_STATUS_SUCCESS) { + wlan_process_pcie_int_status(pmadapter); + } + LEAVE(); + return ret; +} + +/** + * @brief This function checks the interrupt status and + * handle it accordingly. + * + * @param pmadapter A pointer to mlan_adapter structure + * + * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE + */ +static mlan_status wlan_process_pcie_int_status_ext(mlan_adapter *pmadapter, + t_u8 type) +{ + pmlan_callbacks pcb = &pmadapter->callbacks; + + ENTER(); + switch (type) { + case RX_DATA: // Rx Data + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_rx_lock); + wlan_pcie_process_recv_data(pmadapter); + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_rx_lock); + break; + case RX_EVENT: // Rx event + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_event_lock); + wlan_pcie_process_event_ready(pmadapter); + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_event_lock); + break; + case TX_COMPLETE: // Tx data complete + /* synchronize with send_data to sync both txbd_rdptr and + * txbd_wrptr */ + pcb->moal_spin_lock(pmadapter->pmoal_handle, + pmadapter->pmlan_tx_lock); + wlan_pcie_send_data_complete(pmadapter); + pcb->moal_spin_unlock(pmadapter->pmoal_handle, + pmadapter->pmlan_tx_lock); + break; + case RX_CMD_RESP: // Rx CMD Resp + wlan_pcie_process_cmd_resp(pmadapter); + break; + default: + break; + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + mlan_adapter_operations mlan_pcie_ops = { .dnld_fw = wlan_pcie_dnld_fw, - .interrupt = wlan_pcie_interrupt, - .process_int_status = wlan_process_pcie_int_status, + .interrupt = wlan_pcie_interrupt_ext, + .process_int_status = wlan_process_pcie_int_status_ext, .host_to_card = wlan_pcie_host_to_card, .wakeup_card = wlan_pm_pcie_wakeup_card, .reset_card = wlan_pcie_wakeup, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_scan.c b/mxm_wifiex/wlan_src/mlan/mlan_scan.c index f950e9c..6e23173 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_scan.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_scan.c @@ -37,9 +37,6 @@ Change log: #include "mlan_11ac.h" #include "mlan_11ax.h" #include "mlan_11h.h" -#ifdef DRV_EMBEDDED_SUPPLICANT -#include "authenticator_api.h" -#endif /******************************************************** Local Constants ********************************************************/ @@ -3854,11 +3851,8 @@ t_s32 wlan_is_network_compatible(mlan_private *pmpriv, t_u32 index, t_u32 mode) } if ((pbss_desc->bss_mode == mode) && - (pmpriv->sec_info.ewpa_enabled == MTRUE -#ifdef DRV_EMBEDDED_SUPPLICANT - || supplicantIsEnabled(pmpriv->psapriv) -#endif - || pmpriv->sec_info.authentication_mode == MLAN_AUTH_MODE_OWE || + (pmpriv->sec_info.ewpa_enabled == MTRUE || + pmpriv->sec_info.authentication_mode == MLAN_AUTH_MODE_OWE || pbss_desc->owe_transition_mode == OWE_TRANS_MODE_OWE)) { if (((pbss_desc->pwpa_ie) && ((*(pbss_desc->pwpa_ie)).vend_hdr.element_id == WPA_IE)) || @@ -5394,7 +5388,7 @@ static t_void wlan_parse_non_trans_bssid_profile( IEEEtypes_NotxBssCap_t *pcap = (IEEEtypes_NotxBssCap_t *)pbss_profile->profile_data; t_u8 *pos = pbss_profile->profile_data; - t_s8 left_len = pbss_profile->ieee_hdr.len; + t_u8 left_len = pbss_profile->ieee_hdr.len; t_u8 ret = MFALSE; mlan_callbacks *pcb = (pmlan_callbacks)&pmadapter->callbacks; BSSDescriptor_t *bss_new_entry = MNULL; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sdio.c b/mxm_wifiex/wlan_src/mlan/mlan_sdio.c index bfcb1cb..0d5851c 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sdio.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sdio.c @@ -311,8 +311,8 @@ static const struct _mlan_card_info mlan_card_info_sd9097 = { }; #endif -#ifdef SDIW62X -static const struct _mlan_card_info mlan_card_info_sdiw62x = { +#ifdef SDIW624 +static const struct _mlan_card_info mlan_card_info_sdiw624 = { .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, .v16_fw_api = 1, .v17_fw_api = 1, @@ -1050,7 +1050,7 @@ static mlan_status wlan_sdio_prog_fw_w_helper(pmlan_adapter pmadapter, t_u8 *fw, } #endif if (IS_SD9097(pmadapter->card_type) || - IS_SDIW62X(pmadapter->card_type) || + IS_SDIW624(pmadapter->card_type) || IS_SDAW693(pmadapter->card_type) || IS_SD9177(pmadapter->card_type)) check_fw_status = MTRUE; @@ -1264,32 +1264,6 @@ static mlan_status wlan_decode_rx_packet(mlan_adapter *pmadapter, ENTER(); switch (upld_typ) { - case MLAN_TYPE_SPA_DATA: - PRINTM(MINFO, "--- Rx: SPA Data packet ---\n"); - pmbuf->data_len = pmadapter->upld_len; - if (pmadapter->rx_work_flag) { - pmbuf->buf_type = MLAN_BUF_TYPE_SPA_DATA; - if (lock_flag) - pmadapter->callbacks.moal_spin_lock( - pmadapter->pmoal_handle, - pmadapter->rx_data_queue.plock); - util_enqueue_list_tail(pmadapter->pmoal_handle, - &pmadapter->rx_data_queue, - (pmlan_linked_list)pmbuf, MNULL, - MNULL); - pmadapter->rx_pkts_queued++; - if (lock_flag) - pmadapter->callbacks.moal_spin_unlock( - pmadapter->pmoal_handle, - pmadapter->rx_data_queue.plock); - } else { - wlan_decode_spa_buffer(pmadapter, - pmbuf->pbuf + pmbuf->data_offset, - pmbuf->data_len); - wlan_free_mlan_buffer(pmadapter, pmbuf); - } - pmadapter->data_received = MTRUE; - break; case MLAN_TYPE_DATA: PRINTM(MINFO, "--- Rx: Data packet ---\n"); if (pmadapter->upld_len > pmbuf->data_len) { @@ -1385,8 +1359,9 @@ static mlan_status wlan_decode_rx_packet(mlan_adapter *pmadapter, case MLAN_TYPE_EVENT: PRINTM(MINFO, "--- Rx: Event ---\n"); - event = *(t_u32 *)&pmbuf->pbuf[pmbuf->data_offset + - SDIO_INTF_HEADER_LEN]; + + event = *(t_u32 *)&pmbuf->pbuf[MIN( + pmbuf->data_offset + SDIO_INTF_HEADER_LEN, UINT_MAX)]; pmadapter->event_cause = wlan_le32_to_cpu(event); if ((pmadapter->upld_len > MLAN_EVENT_HEADER_LEN) && ((pmadapter->upld_len - MLAN_EVENT_HEADER_LEN) < @@ -1443,7 +1418,7 @@ static mlan_status wlan_receive_single_packet(mlan_adapter *pmadapter) ret = MLAN_STATUS_FAILURE; goto done; } - if (pkt_type != MLAN_TYPE_DATA && pkt_type != MLAN_TYPE_SPA_DATA) { + if (pkt_type != MLAN_TYPE_DATA) { PRINTM(MERROR, "receive a wrong pkt from DATA PORT: type=%d, len=%dd\n", pkt_type, pmbuf->data_len); @@ -1577,8 +1552,7 @@ static mlan_status wlan_receive_mp_aggr_buf(mlan_adapter *pmadapter) /* copy pkt to deaggr buf */ mbuf_deaggr = pmadapter->pcard_sd->mpa_rx.mbuf_arr[pind]; - if ((pkt_type == MLAN_TYPE_DATA || - pkt_type == MLAN_TYPE_SPA_DATA) && + if ((pkt_type == MLAN_TYPE_DATA) && (pkt_len <= pmadapter->pcard_sd->mpa_rx.len_arr[pind])) { memcpy_ext(pmadapter, @@ -1739,8 +1713,7 @@ rx_curr_single: goto done; } if (new_mode || (port != CTRL_PORT)) { - if (pkt_type != MLAN_TYPE_DATA && - pkt_type != MLAN_TYPE_SPA_DATA) { + if (pkt_type != MLAN_TYPE_DATA) { PRINTM(MERROR, "receive a wrong pkt from DATA PORT: type=%d, len=%dd\n", pkt_type, pmbuf->data_len); @@ -2432,10 +2405,10 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter) pmadapter->pcard_info = &mlan_card_info_sd9097; break; #endif -#ifdef SDIW62X - case CARD_TYPE_SDIW62X: +#ifdef SDIW624 + case CARD_TYPE_SDIW624: pmadapter->pcard_sd->reg = &mlan_reg_sd8977_sd8997; - pmadapter->pcard_info = &mlan_card_info_sdiw62x; + pmadapter->pcard_info = &mlan_card_info_sdiw624; break; #endif case CARD_TYPE_SDAW693: @@ -2598,6 +2571,7 @@ static mlan_status wlan_sdio_interrupt(t_u16 msg_id, pmlan_adapter pmadapter) * Clear the interrupt status register */ PRINTM(MINTR, "wlan_interrupt: sdio_ireg = 0x%x\n", sdio_ireg); + pmadapter->pm_wakeup_timeout = 0; pmadapter->pcard_sd->num_of_irq++; pcb->moal_spin_lock(pmadapter->pmoal_handle, pmadapter->pint_lock); @@ -2651,7 +2625,7 @@ static mlan_status wlan_sdio_card_to_host_recovery(mlan_adapter *pmadapter, pmadapter->pcard_sd->ioport + port)) { PRINTM(MERROR, "Recovery: Fail to do cmd53\n"); } - if (pkt_type != MLAN_TYPE_DATA && pkt_type != MLAN_TYPE_SPA_DATA) { + if (pkt_type != MLAN_TYPE_DATA) { PRINTM(MERROR, "Recovery: Receive a wrong pkt: type=%d, len=%d\n", pkt_type, pmadapter->upld_len); @@ -2661,12 +2635,6 @@ static mlan_status wlan_sdio_card_to_host_recovery(mlan_adapter *pmadapter, // TODO fill the hole in Rx reorder table PRINTM(MDATA, "Recovery: Drop Data packet\n"); pmadapter->dbg.num_pkt_dropped++; - } else if (pkt_type == MLAN_TYPE_SPA_DATA) { - PRINTM(MDATA, "Recovery: SPA Data packet len=%d\n", - pmadapter->upld_len); - wlan_decode_spa_buffer(pmadapter, pmadapter->pcard_sd->rx_buf, - pmadapter->upld_len); - pmadapter->data_received = MTRUE; } PRINTM(MMSG, "wlan: Success handle rx port=%d, rx_len=%d \n", port, rx_len); @@ -2680,9 +2648,11 @@ done: * @brief This function checks the interrupt status and handle it accordingly. * * @param pmadapter A pointer to mlan_adapter structure + * @param type interrupt type, not used in SDIO * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ -static mlan_status wlan_process_sdio_int_status(mlan_adapter *pmadapter) +static mlan_status wlan_process_sdio_int_status(mlan_adapter *pmadapter, + t_u8 type) { mlan_status ret = MLAN_STATUS_SUCCESS; pmlan_callbacks pcb = &pmadapter->callbacks; @@ -2880,7 +2850,7 @@ static mlan_status wlan_process_sdio_int_status(mlan_adapter *pmadapter) MLAN_SDIO_BLOCK_SIZE; if (rx_len <= SDIO_INTF_HEADER_LEN || (rx_blocks * MLAN_SDIO_BLOCK_SIZE) > - pmadapter->pcard_sd->mpa_rx.buf_size) { + ALLOC_BUF_SIZE) { PRINTM(MERROR, "invalid rx_len=%d\n", rx_len); ret = MLAN_STATUS_FAILURE; goto done; @@ -3124,94 +3094,6 @@ static mlan_status wlan_sdio_host_to_card_ext(pmlan_private pmpriv, t_u8 type, return ret; } -/** - * @brief Deaggregate single port aggregation packet - * - * @param pmadapter A pointer to mlan_adapter structure - * @param buf A pointer to aggregated data packet - * @param len - * - * @return N/A - */ -void wlan_decode_spa_buffer(mlan_adapter *pmadapter, t_u8 *buf, t_u32 len) -{ - int total_pkt_len; - t_u8 block_num = 0; - t_u16 block_size = 0; - t_u8 *data; - t_u32 pkt_len; - mlan_buffer *mbuf_deaggr = MNULL; - - ENTER(); - - data = (t_u8 *)buf; - total_pkt_len = len; - if (total_pkt_len < pmadapter->pcard_sd->sdio_rx_block_size) { - PRINTM(MERROR, "Invalid sp aggr packet size=%d\n", - total_pkt_len); - goto done; - } - while (total_pkt_len >= - (OFFSET_OF_SDIO_HEADER + SDIO_INTF_HEADER_LEN)) { - block_num = *(data + OFFSET_OF_BLOCK_NUMBER); - block_size = - pmadapter->pcard_sd->sdio_rx_block_size * block_num; - if (block_size > total_pkt_len) { - PRINTM(MERROR, - "Error in pkt, block_num=%d, pkt_len=%d\n", - block_num, total_pkt_len); - break; - } - pkt_len = wlan_le16_to_cpu( - *(t_u16 *)(data + OFFSET_OF_SDIO_HEADER)); - if ((pkt_len + OFFSET_OF_SDIO_HEADER) > block_size) { - PRINTM(MERROR, - "Error in pkt, pkt_len=%d, block_size=%d\n", - pkt_len, block_size); - break; - } - mbuf_deaggr = wlan_alloc_mlan_buffer( - pmadapter, pkt_len - SDIO_INTF_HEADER_LEN, - MLAN_RX_HEADER_LEN, MOAL_ALLOC_MLAN_BUFFER); - if (mbuf_deaggr == MNULL) { - PRINTM(MERROR, "Error allocating daggr mlan_buffer\n"); - break; - } - memcpy_ext(pmadapter, - mbuf_deaggr->pbuf + mbuf_deaggr->data_offset, - data + OFFSET_OF_SDIO_HEADER + SDIO_INTF_HEADER_LEN, - pkt_len - SDIO_INTF_HEADER_LEN, - pkt_len - SDIO_INTF_HEADER_LEN); - mbuf_deaggr->data_len = pkt_len - SDIO_INTF_HEADER_LEN; - wlan_handle_rx_packet(pmadapter, mbuf_deaggr); - data += block_size; - total_pkt_len -= block_size; - if (total_pkt_len < pmadapter->pcard_sd->sdio_rx_block_size) - break; - } -done: - LEAVE(); - return; -} - -/** - * @brief This function deaggr rx pkt - * - * @param pmadapter A pointer to mlan_adapter structure - * @param pmbuf A pointer to the SDIO mpa data - * @return N/A - */ -t_void wlan_sdio_deaggr_rx_pkt(pmlan_adapter pmadapter, mlan_buffer *pmbuf) -{ - if (pmbuf->buf_type == MLAN_BUF_TYPE_SPA_DATA) { - wlan_decode_spa_buffer(pmadapter, - pmbuf->pbuf + pmbuf->data_offset, - pmbuf->data_len); - wlan_free_mlan_buffer(pmadapter, pmbuf); - } else - wlan_handle_rx_packet(pmadapter, pmbuf); -} - /** * @brief This function allocates buffer for the SDIO aggregation buffer * related members of adapter structure @@ -3320,80 +3202,6 @@ mlan_status wlan_free_sdio_mpa_buffers(mlan_adapter *pmadapter) return MLAN_STATUS_SUCCESS; } -/** - * @brief This function re-allocate rx mpa buffer - * - * @param pmadapter A pointer to mlan_adapter structure - * - * @return MLAN_STATUS_SUCCESS - */ -mlan_status wlan_re_alloc_sdio_rx_mpa_buffer(mlan_adapter *pmadapter) -{ - mlan_status ret = MLAN_STATUS_SUCCESS; - pmlan_callbacks pcb = &pmadapter->callbacks; - t_u8 mp_aggr_pkt_limit = pmadapter->pcard_sd->mp_aggr_pkt_limit; - t_u32 mpa_rx_buf_size = pmadapter->pcard_sd->mp_tx_aggr_buf_size; - - if (pmadapter->pcard_sd->mpa_rx.buf) { - pcb->moal_mfree(pmadapter->pmoal_handle, - (t_u8 *)pmadapter->pcard_sd->mpa_rx.head_ptr); - pmadapter->pcard_sd->mpa_rx.head_ptr = MNULL; - pmadapter->pcard_sd->mpa_rx.buf = MNULL; - pmadapter->pcard_sd->mpa_rx.buf_size = 0; - } - if (pmadapter->pcard_sd->sdio_rx_aggr_enable) { - mpa_rx_buf_size = MAX(mpa_rx_buf_size, SDIO_CMD53_MAX_SIZE); - /** reallocate rx buffer for recover when single port rx - * aggregation enabled */ - if (pmadapter->pcard_sd->rx_buffer) { - pcb->moal_mfree(pmadapter->pmoal_handle, - (t_u8 *)pmadapter->pcard_sd->rx_buffer); - pmadapter->pcard_sd->rx_buffer = MNULL; - pmadapter->pcard_sd->rx_buf = MNULL; - } - ret = pmadapter->callbacks.moal_malloc( - pmadapter->pmoal_handle, - SDIO_CMD53_MAX_SIZE + DMA_ALIGNMENT, - MLAN_MEM_DEF | MLAN_MEM_DMA, - (t_u8 **)&pmadapter->pcard_sd->rx_buffer); - - if (ret != MLAN_STATUS_SUCCESS || - !pmadapter->pcard_sd->rx_buffer) { - PRINTM(MERROR, "Failed to allocate receive buffer\n"); - ret = MLAN_STATUS_FAILURE; - goto error; - } - pmadapter->pcard_sd->rx_buf = (t_u8 *)ALIGN_ADDR( - pmadapter->pcard_sd->rx_buffer, DMA_ALIGNMENT); - } - if ((pmadapter->pcard_sd->max_segs < mp_aggr_pkt_limit) || - (pmadapter->pcard_sd->max_seg_size < - pmadapter->pcard_sd->max_sp_rx_size)) { - ret = pcb->moal_malloc( - pmadapter->pmoal_handle, - mpa_rx_buf_size + DMA_ALIGNMENT, - MLAN_MEM_DEF | MLAN_MEM_DMA, - (t_u8 **)&pmadapter->pcard_sd->mpa_rx.head_ptr); - if (ret != MLAN_STATUS_SUCCESS || - !pmadapter->pcard_sd->mpa_rx.head_ptr) { - PRINTM(MERROR, - "Could not allocate buffer for SDIO MP RX aggr\n"); - ret = MLAN_STATUS_FAILURE; - goto error; - } - pmadapter->pcard_sd->mpa_rx.buf = (t_u8 *)ALIGN_ADDR( - pmadapter->pcard_sd->mpa_rx.head_ptr, DMA_ALIGNMENT); - } else { - PRINTM(MMSG, "wlan: Enable RX SG mode\n"); - pmadapter->pcard_sd->mpa_rx.head_ptr = MNULL; - pmadapter->pcard_sd->mpa_rx.buf = MNULL; - } - pmadapter->pcard_sd->mpa_rx.buf_size = mpa_rx_buf_size; - PRINTM(MMSG, "mpa_rx_buf_size=%d\n", mpa_rx_buf_size); -error: - return ret; -} - /** * @brief This function wakes up the card. * @@ -3595,8 +3403,8 @@ mlan_status wlan_reset_fw(pmlan_adapter pmadapter) #ifdef SD9097 || IS_SD9097(pmadapter->card_type) #endif -#ifdef SDIW62X - || IS_SDIW62X(pmadapter->card_type) +#ifdef SDIW624 + || IS_SDIW624(pmadapter->card_type) #endif || IS_SDAW693(pmadapter->card_type) #ifdef SD9177 @@ -3638,13 +3446,34 @@ done: * @param pmbuf A pointer to the mlan_buffer * @return N/A */ -static mlan_status wlan_sdio_data_evt_complete(pmlan_adapter pmadapter, +static mlan_status wlan_sdio_evt_complete(pmlan_adapter pmadapter, + mlan_buffer *pmbuf, + mlan_status status) +{ + ENTER(); + pmadapter->event_cause = 0; + pmadapter->pmlan_buffer_event = MNULL; + if (pmbuf) + wlan_free_mlan_buffer(pmadapter, pmbuf); + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function handle data/cmd complete + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pmbuf A pointer to the mlan_buffer + * @return N/A + */ +static mlan_status wlan_sdio_data_cmd_complete(pmlan_adapter pmadapter, mlan_buffer *pmbuf, mlan_status status) { ENTER(); - - wlan_free_mlan_buffer(pmadapter, pmbuf); + if (pmbuf) + wlan_free_mlan_buffer(pmadapter, pmbuf); LEAVE(); return MLAN_STATUS_SUCCESS; @@ -3662,7 +3491,7 @@ static mlan_status wlan_sdio_handle_rx_packet(mlan_adapter *pmadapter, { ENTER(); - wlan_sdio_deaggr_rx_pkt(pmadapter, pmbuf); + wlan_handle_rx_packet(pmadapter, pmbuf); LEAVE(); return MLAN_STATUS_SUCCESS; @@ -3675,9 +3504,9 @@ mlan_adapter_operations mlan_sdio_ops = { .host_to_card = wlan_sdio_host_to_card_ext, .wakeup_card = wlan_pm_sdio_wakeup_card, .reset_card = wlan_pm_sdio_reset_card, - .event_complete = wlan_sdio_data_evt_complete, - .data_complete = wlan_sdio_data_evt_complete, - .cmdrsp_complete = wlan_sdio_data_evt_complete, + .event_complete = wlan_sdio_evt_complete, + .data_complete = wlan_sdio_data_cmd_complete, + .cmdrsp_complete = wlan_sdio_data_cmd_complete, .handle_rx_packet = wlan_sdio_handle_rx_packet, .disable_host_int = wlan_disable_sdio_host_int, .enable_host_int = wlan_enable_sdio_host_int, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sdio.h b/mxm_wifiex/wlan_src/mlan/mlan_sdio.h index 4d0fa3e..0ddc1ec 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sdio.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_sdio.h @@ -358,10 +358,6 @@ mlan_status wlan_get_sdio_device(pmlan_adapter pmadapter); mlan_status wlan_send_mp_aggr_buf(mlan_adapter *pmadapter); -mlan_status wlan_re_alloc_sdio_rx_mpa_buffer(mlan_adapter *pmadapter); - -void wlan_decode_spa_buffer(mlan_adapter *pmadapter, t_u8 *buf, t_u32 len); -t_void wlan_sdio_deaggr_rx_pkt(pmlan_adapter pmadapter, mlan_buffer *pmbuf); /** Transfer data to card */ mlan_status wlan_sdio_host_to_card(mlan_adapter *pmadapter, t_u8 type, mlan_buffer *mbuf, mlan_tx_param *tx_param); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_shim.c b/mxm_wifiex/wlan_src/mlan/mlan_shim.c index 45ba817..3866b33 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_shim.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_shim.c @@ -44,9 +44,6 @@ Change log: #endif #include "mlan_11h.h" #include "mlan_11n_rxreorder.h" -#ifdef DRV_EMBEDDED_AUTHENTICATOR -#include "authenticator_api.h" -#endif /******************************************************** Local Variables @@ -363,8 +360,6 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter) pmadapter->init_para.mpa_tx_cfg = pmdevice->mpa_tx_cfg; pmadapter->init_para.mpa_rx_cfg = pmdevice->mpa_rx_cfg; - pmadapter->pcard_sd->sdio_rx_aggr_enable = - pmdevice->sdio_rx_aggr_enable; } #endif @@ -442,6 +437,7 @@ mlan_status mlan_register(pmlan_device pmdevice, t_void **ppmlan_adapter) pmadapter->inact_tmo = pmdevice->inact_tmo; pmadapter->init_para.drcs_chantime_mode = pmdevice->drcs_chantime_mode; pmadapter->second_mac = pmdevice->second_mac; + pmadapter->napi = pmdevice->napi; pmadapter->hs_wake_interval = pmdevice->hs_wake_interval; if (pmdevice->indication_gpio != 0xff) { pmadapter->ind_gpio = pmdevice->indication_gpio & 0x0f; @@ -1054,18 +1050,6 @@ mlan_status mlan_rx_process(t_void *padapter, t_u8 *rx_pkts) rx_process_start: /* Check for Rx data */ while (MTRUE) { -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (pmadapter->authenticator_priv) { - if (IsAuthenticatorEnabled( - pmadapter->authenticator_priv->psapriv)) { - AuthenticatorKeyMgmtInit( - pmadapter->authenticator_priv->psapriv, - pmadapter->authenticator_priv - ->curr_addr); - pmadapter->authenticator_priv = MNULL; - } - } -#endif if (pmadapter->flush_data) { pmadapter->flush_data = MFALSE; wlan_flush_rxreorder_tbl(pmadapter); @@ -1109,6 +1093,16 @@ rx_process_start: pmadapter->delay_task_flag = MFALSE; mlan_queue_main_work(pmadapter); } +#ifdef PCIE + if (pmadapter->delay_rx_data_flag && + (pmadapter->rx_pkts_queued < LOW_RX_PENDING)) { + PRINTM(MEVENT, "Run\n"); + pmadapter->delay_rx_data_flag = MFALSE; + wlan_recv_event(wlan_get_priv(pmadapter, + MLAN_BSS_ROLE_ANY), + MLAN_EVENT_ID_DRV_DEFER_RX_DATA, MNULL); + } +#endif pmadapter->ops.handle_rx_packet(pmadapter, pmbuf); if (limit && rx_num >= limit) break; @@ -1180,7 +1174,7 @@ process_start: pmadapter->pending_disconnect_priv, MTRUE); pmadapter->pending_disconnect_priv = MNULL; } -#if defined(SDIO) || defined(PCIE) +#if defined(SDIO) if (!IS_USB(pmadapter->card_type)) { if (pmadapter->rx_pkts_queued > HIGH_RX_PENDING) { pcb->moal_tp_accounting_rx_param( @@ -1194,7 +1188,7 @@ process_start: if (pmadapter->ireg) { if (pmadapter->hs_activated == MTRUE) wlan_process_hs_config(pmadapter); - pmadapter->ops.process_int_status(pmadapter); + pmadapter->ops.process_int_status(pmadapter, 0); if (pmadapter->data_received) mlan_queue_rx_work(pmadapter); } @@ -1291,7 +1285,6 @@ process_start: pmadapter->event_received = MFALSE; wlan_process_event(pmadapter); } - /* Check if we need to confirm Sleep Request received previously */ if (pmadapter->ps_state == PS_STATE_PRE_SLEEP) @@ -1859,4 +1852,54 @@ t_void mlan_set_int_mode(t_void *adapter, t_u32 int_mode, t_u8 func_num) pmadapter->pcard_pcie->func_num = func_num; LEAVE(); } + +/** + * @brief This function handle RX/EVENT/CMDRESP/TX_COMPLETE interrupt. + * + * @param adapter A pointer to mlan_adapter structure + * @param type interrupt type + * @return N/A + */ +void mlan_process_pcie_interrupt_cb(t_void *padapter, int type) +{ + mlan_adapter *pmadapter = (mlan_adapter *)padapter; + pmlan_callbacks pcb = &pmadapter->callbacks; + + ENTER(); + + if (type == RX_DATA) { + if (pmadapter->rx_pkts_queued > HIGH_RX_PENDING) { + pcb->moal_tp_accounting_rx_param( + pmadapter->pmoal_handle, 2, 0); + PRINTM(MEVENT, "Pause\n"); + pmadapter->delay_rx_data_flag = MTRUE; + if (pmadapter->napi) + mlan_queue_rx_work(pmadapter); + else + mlan_rx_process(pmadapter, MNULL); + LEAVE(); + return; + } + } + pmadapter->ops.process_int_status(pmadapter, type); + switch (type) { + case RX_DATA: // Rx Data + if (pmadapter->data_received) { + if (pmadapter->napi) + mlan_queue_rx_work(pmadapter); + else + 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); + break; + default: + break; + } + LEAVE(); + return; +} #endif diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c index 62b6a85..e7dd3d5 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c @@ -5,7 +5,7 @@ * it is ready. * * - * 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 @@ -1002,6 +1002,10 @@ static mlan_status wlan_cmd_mac_multicast_adr(pmlan_private pmpriv, HostCmd_DS_MAC_MULTICAST_ADR *pmc_addr = &cmd->params.mc_addr; ENTER(); + if (!pdata_buf) { + LEAVE(); + return MLAN_STATUS_FAILURE; + } cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_MAC_MULTICAST_ADR) + S_DS_GEN); cmd->command = wlan_cpu_to_le16(HostCmd_CMD_MAC_MULTICAST_ADR); @@ -2689,6 +2693,8 @@ static mlan_status wlan_cmd_inactivity_timeout(HostCmd_DS_COMMAND *cmd, wlan_cpu_to_le16((t_u16)inac_to->mcast_timeout); cmd_inac_to->ps_entry_timeout = wlan_cpu_to_le16((t_u16)inac_to->ps_entry_timeout); + cmd_inac_to->ps_cmd_timeout = + wlan_cpu_to_le16((t_u16)inac_to->ps_cmd_timeout); } LEAVE(); @@ -3720,9 +3726,6 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_get_hw_spec(pmpriv, cmd_ptr); break; #ifdef SDIO - case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: - ret = wlan_cmd_sdio_rx_aggr_cfg(cmd_ptr, cmd_action, pdata_buf); - break; #endif case HostCmd_CMD_CFG_DATA: ret = wlan_cmd_cfg_data(pmpriv, cmd_ptr, cmd_action, cmd_oid, @@ -3791,7 +3794,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_ips_config(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HOST_CMD_PMIC_CONFIGURE: + case HostCmd_CMD_PMIC_CONFIGURE: cmd_ptr->command = wlan_cpu_to_le16(cmd_no); cmd_ptr->size = wlan_cpu_to_le16(S_DS_GEN); break; @@ -4082,7 +4085,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, pdata_buf); break; #ifdef WIFI_DIRECT_SUPPORT - case HOST_CMD_WIFI_DIRECT_MODE_CONFIG: + case HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG: ret = wlan_cmd_wifi_direct_mode(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -4127,10 +4130,10 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, case HostCmd_CMD_DRCS_CONFIG: ret = wlan_cmd_drcs_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HostCMD_CONFIG_LOW_POWER_MODE: + case HostCmd_CMD_CONFIG_LOW_POWER_MODE: ret = wlan_cmd_low_pwr_mode(pmpriv, cmd_ptr, pdata_buf); break; - case HostCmd_DFS_REPEATER_MODE: + case HostCmd_CMD_DFS_REPEATER_MODE: ret = wlan_cmd_dfs_repeater_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -4138,7 +4141,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_coalesce_config(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HostCmd_DS_GET_SENSOR_TEMP: + case HostCmd_CMD_DS_GET_SENSOR_TEMP: ret = wlan_cmd_get_sensor_temp(pmpriv, cmd_ptr, cmd_action); break; case HostCmd_CMD_802_11_MIMO_SWITCH: @@ -4176,7 +4179,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_auto_tx(pmpriv, cmd_ptr, cmd_action, cmd_oid, pdata_buf); break; - case HOST_CMD_TX_RX_PKT_STATS: + case HostCmd_CMD_TX_RX_PKT_STATS: ret = wlan_cmd_tx_rx_pkt_stats(pmpriv, cmd_ptr, (pmlan_ioctl_req)pioctl_buf, pdata_buf); @@ -4193,11 +4196,6 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_fw_dump_event(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; -#if defined(DRV_EMBEDDED_SUPPLICANT) - case HostCmd_CMD_CRYPTO: - ret = wlan_cmd_crypto(pmpriv, cmd_ptr, cmd_action, pdata_buf); - break; -#endif case HostCmd_CMD_11AX_CFG: ret = wlan_cmd_11ax_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -4211,7 +4209,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, case HostCmd_CMD_TWT_CFG: ret = wlan_cmd_twt_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: + case HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: ret = wlan_cmd_gpio_tsf_latch(pmpriv, cmd_ptr, cmd_action, pioctl_buf, pdata_buf); break; @@ -4227,6 +4225,14 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_rxabortcfg_ext(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_NAV_MITIGATION_CFG: + ret = wlan_cmd_nav_mitigation(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; + case HostCmd_CMD_802_11_LED_CONTROL: + ret = wlan_cmd_led_config(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; case HostCmd_CMD_ARB_CONFIG: ret = wlan_cmd_arb_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -4246,7 +4252,7 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_cck_desense_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HostCmd_CHANNEL_TRPC_CONFIG: + case HostCmd_CMD_CHANNEL_TRPC_CONFIG: ret = wlan_cmd_get_chan_trpc_config(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c index 2dce752..a92a2c3 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c @@ -4,7 +4,7 @@ * responses generated by firmware. * * - * 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 @@ -181,6 +181,8 @@ static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv, } break; case HostCmd_CMD_802_11_SCAN_EXT: case HostCmd_CMD_802_11_SCAN: + if (resp->result == HostCmd_RESULT_BUSY) + pmadapter->dbg.num_scan_err++; /* Cancel all pending scan command */ wlan_flush_scan_queue(pmadapter); @@ -258,13 +260,15 @@ static mlan_status wlan_process_cmdresp_error(mlan_private *pmpriv, break; #endif case HostCmd_CMD_802_11_ASSOCIATE: + if (resp->result == HostCmd_RESULT_BUSY) + pmadapter->dbg.num_assoc_err++; wlan_reset_connect_state(pmpriv, MTRUE); break; -#ifdef SDIO - case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: - pmadapter->pcard_sd->sdio_rx_aggr_enable = MFALSE; - PRINTM(MMSG, "FW don't support SDIO single port rx aggr\n"); + case HostCmd_CMD_802_11_REMAIN_ON_CHANNEL: + if (resp->result == HostCmd_RESULT_BUSY) + pmadapter->dbg.num_remain_chan_err++; break; +#ifdef SDIO #endif case HostCmd_CMD_MGMT_IE_LIST: { @@ -331,12 +335,6 @@ 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; -#if defined(DRV_EMBEDDED_SUPPLICANT) - case HostCmd_CMD_CRYPTO: - PRINTM(MCMND, "crypto cmd result=0x%x!\n", resp->result); - ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf); - break; -#endif default: break; } @@ -720,8 +718,10 @@ static mlan_status wlan_ret_get_log(pmlan_private pmpriv, wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[0]); pget_info->param.stats.rx_stuck_issue_cnt[1] = wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[1]); - pget_info->param.stats.rx_stuck_recovery_cnt = - wlan_le32_to_cpu(pget_log->rx_stuck_recovery_cnt); + pget_info->param.stats.rx_stuck_poll_recovery_cnt = + wlan_le32_to_cpu(pget_log->rx_stuck_poll_recovery_cnt); + pget_info->param.stats.rx_stuck_intr_recovery_cnt = + wlan_le32_to_cpu(pget_log->rx_stuck_intr_recovery_cnt); pget_info->param.stats.rx_stuck_tsf[0] = wlan_le64_to_cpu(pget_log->rx_stuck_tsf[0]); pget_info->param.stats.rx_stuck_tsf[1] = @@ -2128,6 +2128,8 @@ static mlan_status wlan_ret_inactivity_timeout(pmlan_private pmpriv, wlan_le16_to_cpu(cmd_inac_to->mcast_timeout); inac_to->ps_entry_timeout = wlan_le16_to_cpu(cmd_inac_to->ps_entry_timeout); + inac_to->ps_cmd_timeout = + wlan_le16_to_cpu(cmd_inac_to->ps_cmd_timeout); } LEAVE(); @@ -3226,9 +3228,6 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, ret = wlan_ret_get_hw_spec(pmpriv, resp, pioctl_buf); break; #ifdef SDIO - case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: - ret = wlan_ret_sdio_rx_aggr_cfg(pmpriv, resp); - break; #endif case HostCmd_CMD_CFG_DATA: ret = wlan_ret_cfg_data(pmpriv, resp, pioctl_buf); @@ -3539,7 +3538,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, ret = wlan_ret_remain_on_channel(pmpriv, resp, pioctl_buf); break; #ifdef WIFI_DIRECT_SUPPORT - case HOST_CMD_WIFI_DIRECT_MODE_CONFIG: + case HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG: ret = wlan_ret_wifi_direct_mode(pmpriv, resp, pioctl_buf); break; #endif @@ -3576,9 +3575,9 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_DRCS_CONFIG: ret = wlan_ret_drcs_cfg(pmpriv, resp, pioctl_buf); break; - case HostCMD_CONFIG_LOW_POWER_MODE: + case HostCmd_CMD_CONFIG_LOW_POWER_MODE: break; - case HostCmd_DFS_REPEATER_MODE: + case HostCmd_CMD_DFS_REPEATER_MODE: ret = wlan_ret_dfs_repeater_cfg(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_COALESCE_CFG: @@ -3586,7 +3585,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, break; case HostCmd_CMD_MEF_CFG: break; - case HostCmd_DS_GET_SENSOR_TEMP: + case HostCmd_CMD_DS_GET_SENSOR_TEMP: ret = wlan_ret_get_sensor_temp(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_802_11_MIMO_SWITCH: @@ -3597,7 +3596,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_STA_CONFIGURE: ret = wlan_ret_sta_config(pmpriv, resp, pioctl_buf); break; - case HOST_CMD_PMIC_CONFIGURE: + case HostCmd_CMD_PMIC_CONFIGURE: break; case HostCmd_CMD_INDEPENDENT_RESET_CFG: ret = wlan_ret_ind_rst_cfg(pmpriv, resp, pioctl_buf); @@ -3616,7 +3615,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_AUTO_TX: ret = wlan_ret_auto_tx(pmpriv, resp, pioctl_buf); break; - case HOST_CMD_TX_RX_PKT_STATS: + case HostCmd_CMD_TX_RX_PKT_STATS: ret = wlan_ret_tx_rx_pkt_stats(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_DYN_BW: @@ -3625,11 +3624,6 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_BOOT_SLEEP: ret = wlan_ret_boot_sleep(pmpriv, resp, pioctl_buf); break; -#if defined(DRV_EMBEDDED_SUPPLICANT) - case HostCmd_CMD_CRYPTO: - ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf); - break; -#endif case HostCmd_CMD_11AX_CFG: ret = wlan_ret_11ax_cfg(pmpriv, resp, pioctl_buf); break; @@ -3642,7 +3636,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_TWT_CFG: ret = wlan_ret_twt_report(pmpriv, resp, pioctl_buf); break; - case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: + case HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: ret = wlan_ret_gpio_tsf_latch(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_RX_ABORT_CFG: @@ -3654,6 +3648,12 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_RX_ABORT_CFG_EXT: ret = wlan_ret_rxabortcfg_ext(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_NAV_MITIGATION_CFG: + ret = wlan_ret_nav_mitigation(pmpriv, resp, pioctl_buf); + break; + case HostCmd_CMD_802_11_LED_CONTROL: + ret = wlan_ret_led_config(pmpriv, resp, pioctl_buf); + break; case HostCmd_CMD_ARB_CONFIG: ret = wlan_ret_arb_cfg(pmpriv, resp, pioctl_buf); break; @@ -3676,7 +3676,7 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_CCK_DESENSE_CFG: ret = wlan_ret_cck_desense_cfg(pmpriv, resp, pioctl_buf); break; - case HostCmd_CHANNEL_TRPC_CONFIG: + case HostCmd_CMD_CHANNEL_TRPC_CONFIG: ret = wlan_ret_get_chan_trpc_config(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_LOW_POWER_MODE_CFG: diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c index 2bc5517..c909928 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c @@ -33,9 +33,6 @@ Change log: #include "mlan_wmm.h" #include "mlan_11n.h" #include "mlan_11h.h" -#ifdef DRV_EMBEDDED_SUPPLICANT -#include "authenticator_api.h" -#endif #ifdef PCIE #include "mlan_pcie.h" #endif /* PCIE */ @@ -380,6 +377,10 @@ 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) { @@ -405,18 +406,12 @@ t_void wlan_reset_connect_state(pmlan_private priv, t_u8 drv_disconnect) priv->rxpd_rate_info = 0; priv->max_amsdu = 0; priv->amsdu_disable = MFALSE; - priv->multi_ap_flag = 0; wlan_coex_ampdu_rxwinsize(pmadapter); priv->sec_info.ewpa_enabled = MFALSE; priv->sec_info.wpa_enabled = MFALSE; priv->sec_info.wpa2_enabled = MFALSE; priv->wpa_ie_len = 0; -#ifdef DRV_EMBEDDED_SUPPLICANT - supplicantStopSessionTimer(priv->psapriv); - supplicantClrEncryptKey(priv->psapriv); - supplicantDisable(priv->psapriv); -#endif priv->sec_info.wapi_enabled = MFALSE; priv->wapi_ie_len = 0; @@ -896,6 +891,10 @@ 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: @@ -1127,18 +1126,17 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) break; case EVENT_ADDBA: PRINTM(MEVENT, "EVENT: ADDBA Request\n"); - if (pmpriv->media_connected == MTRUE) - ret = wlan_prepare_cmd(pmpriv, - HostCmd_CMD_11N_ADDBA_RSP, - HostCmd_ACT_GEN_SET, 0, MNULL, - pmadapter->event_body); + if (pmpriv->media_connected == MTRUE && + !pmpriv->adapter->remain_on_channel) + wlan_11n_add_bastream(pmpriv, pmadapter->event_body); else PRINTM(MERROR, "Ignore ADDBA Request event in disconnected state\n"); break; case EVENT_DELBA: PRINTM(MEVENT, "EVENT: DELBA Request\n"); - if (pmpriv->media_connected == MTRUE) + if (pmpriv->media_connected == MTRUE && + !pmpriv->adapter->remain_on_channel) wlan_11n_delete_bastream(pmpriv, pmadapter->event_body); else PRINTM(MERROR, @@ -1146,7 +1144,8 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) break; case EVENT_BA_STREAM_TIMEOUT: PRINTM(MEVENT, "EVENT: BA Stream timeout\n"); - if (pmpriv->media_connected == MTRUE) + if (pmpriv->media_connected == MTRUE && + !pmpriv->adapter->remain_on_channel) wlan_11n_ba_stream_timeout( pmpriv, (HostCmd_DS_11N_BATIMEOUT *) pmadapter->event_body); @@ -1233,6 +1232,7 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) PRINTM_NETINTF(MEVENT, pmpriv); PRINTM(MEVENT, "EVENT: REMAIN_ON_CHANNEL_EXPIRED reason=%d\n", *(t_u16 *)pmadapter->event_body); + pmpriv->adapter->remain_on_channel = MFALSE; wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_FLUSH_RX_WORK, MNULL); wlan_recv_event(pmpriv, MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED, MNULL); @@ -1419,7 +1419,13 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) pmadapter->fw_hang_report = MTRUE; wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_DBG_DUMP, MNULL); break; - case CHAN_LOAD_EVENT: { + case EVENT_IMD3_CAL_START: + PRINTM(MEVENT, "EVENT: EVENT_IMD3_CAL_START\n"); + break; + case EVENT_IMD3_CAL_END: + PRINTM(MEVENT, "EVENT: EVENT_IMD3_CAL_END\n"); + break; + case EVENT_CHAN_LOAD: { t_u8 *ptr = MNULL; HostCmd_DS_GET_CH_LOAD *cfg_cmd = MNULL; ptr = (t_u8 *)(pmbuf->pbuf + pmbuf->data_offset); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c index b6dfd1e..2b3800f 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c @@ -35,9 +35,6 @@ Change log: #include "mlan_11ac.h" #include "mlan_11ax.h" #include "mlan_11h.h" -#ifdef DRV_EMBEDDED_SUPPLICANT -#include "authenticator_api.h" -#endif /******************************************************** Local Variables @@ -1403,10 +1400,6 @@ static mlan_status wlan_bss_ioctl_find_bss(pmlan_adapter pmadapter, { mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; mlan_status ret = MLAN_STATUS_SUCCESS; -#ifdef DRV_EMBEDDED_SUPPLICANT - mlan_ds_bss *bss = MNULL; - mlan_ssid_bssid *ssid_bssid = MNULL; -#endif ENTER(); @@ -1418,14 +1411,6 @@ static mlan_status wlan_bss_ioctl_find_bss(pmlan_adapter pmadapter, return MLAN_STATUS_PENDING; } } -#ifdef DRV_EMBEDDED_SUPPLICANT - if (!IS_FW_SUPPORT_SUPPLICANT(pmpriv->adapter)) { - bss = (mlan_ds_bss *)pioctl_req->pbuf; - ssid_bssid = &bss->param.ssid_bssid; - supplicantQueryPassphraseAndEnable(pmpriv->psapriv, - (t_u8 *)ssid_bssid); - } -#endif ret = wlan_find_bss(pmpriv, pioctl_req); @@ -5179,9 +5164,6 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_HOTSPOT_CFG: status = wlan_misc_hotspot_cfg(pmadapter, pioctl_req); break; - case MLAN_OID_MISC_MULTI_AP_CFG: - status = wlan_misc_multi_ap_cfg(pmadapter, pioctl_req); - break; case MLAN_OID_MISC_OTP_USER_DATA: status = wlan_misc_otp_user_data(pmadapter, pioctl_req); break; @@ -5200,11 +5182,9 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_TXCONTROL: status = wlan_misc_ioctl_txcontrol(pmadapter, pioctl_req); break; -#ifdef STA_SUPPORT case MLAN_OID_MISC_EXT_CAP_CFG: status = wlan_misc_ext_capa_cfg(pmadapter, pioctl_req); break; -#endif case MLAN_OID_MISC_PMFCFG: status = wlan_misc_pmfcfg(pmadapter, pioctl_req); break; @@ -5351,6 +5331,12 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_RX_ABORT_CFG_EXT: status = wlan_misc_ioctl_rxabortcfg_ext(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_NAV_MITIGATION: + status = wlan_misc_ioctl_nav_mitigation(pmadapter, pioctl_req); + break; + case MLAN_OID_MISC_LED_CONFIG: + status = wlan_misc_ioctl_led(pmadapter, pioctl_req); + break; case MLAN_OID_MISC_TX_AMPDU_PROT_MODE: status = wlan_misc_ioctl_tx_ampdu_prot_mode(pmadapter, pioctl_req); @@ -5393,6 +5379,11 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_IPS_CFG: status = wlan_misc_ioctl_ips_cfg(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_REORDER_FLUSH_TIME: + status = wlan_misc_ioctl_reorder_flush_time(pmadapter, + pioctl_req); + break; + default: if (pioctl_req) pioctl_req->status_code = MLAN_ERROR_IOCTL_INVALID; @@ -5477,8 +5468,7 @@ static mlan_status wlan_set_get_scan_cfg(pmlan_adapter pmadapter, * @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING --success, * otherwise fail */ -static mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter, - pmlan_ioctl_req pioctl_req) +mlan_status wlan_scan_ioctl(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req) { pmlan_private pmpriv = pmadapter->priv[pioctl_req->bss_index]; mlan_status status = MLAN_STATUS_SUCCESS; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c index 671f176..41b8d96 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_rx.c @@ -34,9 +34,6 @@ Change log: #include "mlan_11n_aggr.h" #include "mlan_11n_rxreorder.h" #include "mlan_11ax.h" -#ifdef DRV_EMBEDDED_SUPPLICANT -#include "authenticator_api.h" -#endif /******************************************************** Local Variables @@ -510,9 +507,6 @@ mlan_status wlan_process_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf) t_u8 appletalk_aarp_type[2] = {0x80, 0xf3}; t_u8 ipx_snap_type[2] = {0x81, 0x37}; t_u8 tdls_action_type[2] = {0x89, 0x0d}; -#ifdef DRV_EMBEDDED_SUPPLICANT - t_u8 eapol_type[2] = {0x88, 0x8e}; -#endif t_u8 ext_rate_info = 0; ENTER(); @@ -632,23 +626,6 @@ mlan_status wlan_process_rx_packet(pmlan_adapter pmadapter, pmlan_buffer pmbuf) } } -#ifdef DRV_EMBEDDED_SUPPLICANT - if (supplicantIsEnabled(priv->psapriv) && - (!memcmp(pmadapter, &prx_pkt->eth803_hdr.h803_len, eapol_type, - sizeof(eapol_type)))) { - // BML_SET_OFFSET(bufDesc, offset); - if (ProcessEAPoLPkt(priv->psapriv, pmbuf)) { - pmadapter->ops.data_complete(pmadapter, pmbuf, ret); - ret = MLAN_STATUS_SUCCESS; - PRINTM(MMSG, - "host supplicant eapol pkt process done.\n"); - - LEAVE(); - return ret; - } - } -#endif - mon_process: if (pmbuf->flags & MLAN_BUF_FLAG_NET_MONITOR) { // Use some rxpd space to save rxpd info for radiotap header @@ -711,7 +688,8 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) wlan_802_11_header *pwlan_hdr; IEEEtypes_FrameCtl_t *frmctl; pmlan_buffer pmbuf2 = MNULL; - mlan_802_11_mac_addr src_addr, dest_addr; + mlan_802_11_mac_addr dest_addr = {0x00}; + mlan_802_11_mac_addr src_addr = {0x00}; t_u16 hdr_len; t_u8 snap_eth_hdr[5] = {0xaa, 0xaa, 0x03, 0x00, 0x00}; pmlan_private priv = pmadapter->priv[pmbuf->bss_index]; @@ -741,13 +719,6 @@ mlan_status wlan_ops_sta_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) rxpd_rate_info_orig, prx_pd->rate_info); } rx_pkt_type = prx_pd->rx_pkt_type; - if (prx_pd->flags & RXPD_FLAG_PKT_EASYMESH) { - PRINTM_NETINTF(MDAT_D, priv); - PRINTM(MDAT_D, "Easymesh flags : 0x%x\n", prx_pd->flags); - ret = wlan_check_easymesh_pkt(priv, pmbuf, prx_pd); - if (ret != MLAN_STATUS_SUCCESS) - goto done; - } prx_pkt = (RxPacketHdr_t *)((t_u8 *)prx_pd + prx_pd->rx_pkt_offset); if ((prx_pd->rx_pkt_offset + prx_pd->rx_pkt_length) != diff --git a/mxm_wifiex/wlan_src/mlan/mlan_sta_tx.c b/mxm_wifiex/wlan_src/mlan/mlan_sta_tx.c index 7f274b0..49ff34d 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_sta_tx.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_sta_tx.c @@ -127,11 +127,6 @@ t_void *wlan_ops_sta_process_txpd(t_void *priv, pmlan_buffer pmbuf) } if (pmbuf->flags & MLAN_BUF_FLAG_TDLS) plocal_tx_pd->flags |= MRVDRV_TxPD_FLAGS_TDLS_PACKET; - if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) { - plocal_tx_pd->flags |= MRVDRV_TxPD_FLAGS_EASYMESH; - memcpy_ext(pmpriv->adapter, plocal_tx_pd->ra_mac, pmbuf->mac, - MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); - } /* Offset of actual data */ plocal_tx_pd->tx_pkt_offset = (t_u16)( (t_ptr)pmbuf->pbuf + pmbuf->data_offset - (t_ptr)plocal_tx_pd); diff --git a/mxm_wifiex/wlan_src/mlan/mlan_txrx.c b/mxm_wifiex/wlan_src/mlan/mlan_txrx.c index d97e36d..c55c145 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_txrx.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_txrx.c @@ -446,57 +446,3 @@ t_void wlan_process_bypass_tx(pmlan_adapter pmadapter) !wlan_bypass_tx_list_empty(pmadapter)); LEAVE(); } - -/** - * @brief This function will convert 802.11 header to 802.3 header - and save the backhaul station aid to pmbuf - * - * @param priv A pointer to mlan_private - * @param pmbuf A pointer to mlan_buffer - * @param prx_pd A pointer to RxPD - * - * @return MLAN_STATUS_PENDING --success, otherwise fail - */ -mlan_status wlan_check_easymesh_pkt(mlan_private *priv, pmlan_buffer pmbuf, - RxPD *prx_pd) -{ - Eth803Hdr_t *eth_header = MNULL; - sta_node *sta_ptr = MNULL; - mlan_status ret = MLAN_STATUS_SUCCESS; - t_u8 *pos = MNULL; - t_u32 tmp = 0; - - ENTER(); - - pos = (t_u8 *)prx_pd + prx_pd->rx_pkt_offset; - eth_header = (Eth803Hdr_t *)pos; - - PRINTM(MDAT_D, - "Rx Easymesh ETH header destination address: " FULL_MACSTR - "\nETH header source address: " FULL_MACSTR "\n", - FULL_MAC2STR(eth_header->dest_addr), - FULL_MAC2STR(eth_header->src_addr)); - - if (priv->bss_type == MLAN_BSS_TYPE_UAP) { - pmbuf->flags |= MLAN_BUF_FLAG_EASYMESH; - memcpy_ext(priv->adapter, pmbuf->mac, prx_pd->ta_mac, - MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); - - sta_ptr = wlan_get_station_entry(priv, prx_pd->ta_mac); - if (!sta_ptr) { - PRINTM(MERROR, - "Easymesh Error! Can't find station in the station list\n"); - ret = MLAN_STATUS_FAILURE; - goto done; - } - - /* Save station aid to pmbuf and send it to moal */ - tmp = (t_u32)sta_ptr->aid; - pmbuf->priority |= (tmp << 24); - PRINTM(MDAT_D, "Easymesh: Rx for VLAN " FULL_MACSTR "\n", - FULL_MAC2STR(prx_pd->ta_mac)); - } -done: - LEAVE(); - return ret; -} diff --git a/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c b/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c index e89f291..6175dc9 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c @@ -40,9 +40,6 @@ Change log: #include "mlan_11h.h" #include "mlan_11ac.h" #include "mlan_11ax.h" -#ifdef DRV_EMBEDDED_AUTHENTICATOR -#include "authenticator_api.h" -#endif #ifdef PCIE #include "mlan_pcie.h" #endif /* PCIE */ @@ -210,13 +207,9 @@ static mlan_status uap_process_cmdresp_error(mlan_private *pmpriv, */ switch (resp->command) { #ifdef SDIO - case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: - pmadapter->pcard_sd->sdio_rx_aggr_enable = MFALSE; - PRINTM(MMSG, "FW don't support SDIO single port rx aggr\n"); - break; #endif - case HOST_CMD_APCMD_SYS_CONFIGURE: { + case HostCmd_CMD_APCMD_SYS_CONFIGURE: { HostCmd_DS_SYS_CONFIG *sys_config = (HostCmd_DS_SYS_CONFIG *)&resp->params.sys_config; t_u16 resp_len = 0, travel_len = 0, index; @@ -298,10 +291,14 @@ 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; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) - case HostCmd_CMD_CRYPTO: - PRINTM(MCMND, "crypto cmd result=0x%x!\n", resp->result); - ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf); + case HostCmd_CMD_802_11_REMAIN_ON_CHANNEL: + if (resp->result == HostCmd_RESULT_BUSY) + pmadapter->dbg.num_remain_chan_err++; + break; +#ifdef STA_SUPPORT + case HostCmd_CMD_802_11_SCAN_EXT: + if (resp->result == HostCmd_RESULT_BUSY) + pmadapter->dbg.num_scan_err++; break; #endif default: @@ -708,7 +705,6 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, MrvlIETypes_HTCap_t *tlv_htcap = MNULL; MrvlIEtypes_wmm_parameter_t *tlv_wmm_parameter = MNULL; MrvlIEtypes_preamble_t *tlv_preamble = MNULL; - MrvlIEtypes_MultiAp_t *tlv_multi_ap = MNULL; t_u32 cmd_size = 0; t_u8 zero_mac[] = {0, 0, 0, 0, 0, 0}; @@ -724,7 +720,7 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, bss = (mlan_ds_bss *)pioctl_buf->pbuf; - cmd->command = wlan_cpu_to_le16(HOST_CMD_APCMD_SYS_CONFIGURE); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_APCMD_SYS_CONFIGURE); sys_config->action = wlan_cpu_to_le16(cmd_action); cmd_size = sizeof(HostCmd_DS_SYS_CONFIG) - 1 + S_DS_GEN; @@ -966,67 +962,60 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, tlv += sizeof(MrvlIEtypes_retry_limit_t); } -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (IS_FW_SUPPORT_AUTHENTICATOR(pmpriv->adapter)) { -#endif - if (bss->param.bss_config.pairwise_update_timeout < - (MAX_VALID_DWORD)) { - tlv_pairwise_timeout = - (MrvlIEtypes_eapol_pwk_hsk_timeout_t *)tlv; - tlv_pairwise_timeout->header.type = wlan_cpu_to_le16( - TLV_TYPE_UAP_EAPOL_PWK_HSK_TIMEOUT); - tlv_pairwise_timeout->header.len = - wlan_cpu_to_le16(sizeof(t_u32)); - tlv_pairwise_timeout - ->pairwise_update_timeout = wlan_cpu_to_le32( + if (bss->param.bss_config.pairwise_update_timeout < (MAX_VALID_DWORD)) { + tlv_pairwise_timeout = + (MrvlIEtypes_eapol_pwk_hsk_timeout_t *)tlv; + tlv_pairwise_timeout->header.type = + wlan_cpu_to_le16(TLV_TYPE_UAP_EAPOL_PWK_HSK_TIMEOUT); + tlv_pairwise_timeout->header.len = + wlan_cpu_to_le16(sizeof(t_u32)); + tlv_pairwise_timeout->pairwise_update_timeout = + wlan_cpu_to_le32( bss->param.bss_config.pairwise_update_timeout); - cmd_size += sizeof(MrvlIEtypes_eapol_pwk_hsk_timeout_t); - tlv += sizeof(MrvlIEtypes_eapol_pwk_hsk_timeout_t); - } - - if (bss->param.bss_config.pwk_retries < (MAX_VALID_DWORD)) { - tlv_pairwise_retries = - (MrvlIEtypes_eapol_pwk_hsk_retries_t *)tlv; - tlv_pairwise_retries->header.type = wlan_cpu_to_le16( - TLV_TYPE_UAP_EAPOL_PWK_HSK_RETRIES); - tlv_pairwise_retries->header.len = - wlan_cpu_to_le16(sizeof(t_u32)); - tlv_pairwise_retries->pwk_retries = wlan_cpu_to_le32( - bss->param.bss_config.pwk_retries); - cmd_size += sizeof(MrvlIEtypes_eapol_pwk_hsk_retries_t); - tlv += sizeof(MrvlIEtypes_eapol_pwk_hsk_retries_t); - } - - if (bss->param.bss_config.groupwise_update_timeout < - (MAX_VALID_DWORD)) { - tlv_groupwise_timeout = - (MrvlIEtypes_eapol_gwk_hsk_timeout_t *)tlv; - tlv_groupwise_timeout->header.type = wlan_cpu_to_le16( - TLV_TYPE_UAP_EAPOL_GWK_HSK_TIMEOUT); - tlv_groupwise_timeout->header.len = - wlan_cpu_to_le16(sizeof(t_u32)); - tlv_groupwise_timeout - ->groupwise_update_timeout = wlan_cpu_to_le32( - bss->param.bss_config.groupwise_update_timeout); - cmd_size += sizeof(MrvlIEtypes_eapol_gwk_hsk_timeout_t); - tlv += sizeof(MrvlIEtypes_eapol_gwk_hsk_timeout_t); - } - - if (bss->param.bss_config.gwk_retries < (MAX_VALID_DWORD)) { - tlv_groupwise_retries = - (MrvlIEtypes_eapol_gwk_hsk_retries_t *)tlv; - tlv_groupwise_retries->header.type = wlan_cpu_to_le16( - TLV_TYPE_UAP_EAPOL_GWK_HSK_RETRIES); - tlv_groupwise_retries->header.len = - wlan_cpu_to_le16(sizeof(t_u32)); - tlv_groupwise_retries->gwk_retries = wlan_cpu_to_le32( - bss->param.bss_config.gwk_retries); - cmd_size += sizeof(MrvlIEtypes_eapol_gwk_hsk_retries_t); - tlv += sizeof(MrvlIEtypes_eapol_gwk_hsk_retries_t); - } -#ifdef DRV_EMBEDDED_AUTHENTICATOR + cmd_size += sizeof(MrvlIEtypes_eapol_pwk_hsk_timeout_t); + tlv += sizeof(MrvlIEtypes_eapol_pwk_hsk_timeout_t); + } + + if (bss->param.bss_config.pwk_retries < (MAX_VALID_DWORD)) { + tlv_pairwise_retries = + (MrvlIEtypes_eapol_pwk_hsk_retries_t *)tlv; + tlv_pairwise_retries->header.type = + wlan_cpu_to_le16(TLV_TYPE_UAP_EAPOL_PWK_HSK_RETRIES); + tlv_pairwise_retries->header.len = + wlan_cpu_to_le16(sizeof(t_u32)); + tlv_pairwise_retries->pwk_retries = + wlan_cpu_to_le32(bss->param.bss_config.pwk_retries); + cmd_size += sizeof(MrvlIEtypes_eapol_pwk_hsk_retries_t); + tlv += sizeof(MrvlIEtypes_eapol_pwk_hsk_retries_t); + } + + if (bss->param.bss_config.groupwise_update_timeout < + (MAX_VALID_DWORD)) { + tlv_groupwise_timeout = + (MrvlIEtypes_eapol_gwk_hsk_timeout_t *)tlv; + tlv_groupwise_timeout->header.type = + wlan_cpu_to_le16(TLV_TYPE_UAP_EAPOL_GWK_HSK_TIMEOUT); + tlv_groupwise_timeout->header.len = + wlan_cpu_to_le16(sizeof(t_u32)); + tlv_groupwise_timeout->groupwise_update_timeout = + wlan_cpu_to_le32( + bss->param.bss_config.groupwise_update_timeout); + cmd_size += sizeof(MrvlIEtypes_eapol_gwk_hsk_timeout_t); + tlv += sizeof(MrvlIEtypes_eapol_gwk_hsk_timeout_t); + } + + if (bss->param.bss_config.gwk_retries < (MAX_VALID_DWORD)) { + tlv_groupwise_retries = + (MrvlIEtypes_eapol_gwk_hsk_retries_t *)tlv; + tlv_groupwise_retries->header.type = + wlan_cpu_to_le16(TLV_TYPE_UAP_EAPOL_GWK_HSK_RETRIES); + tlv_groupwise_retries->header.len = + wlan_cpu_to_le16(sizeof(t_u32)); + tlv_groupwise_retries->gwk_retries = + wlan_cpu_to_le32(bss->param.bss_config.gwk_retries); + cmd_size += sizeof(MrvlIEtypes_eapol_gwk_hsk_retries_t); + tlv += sizeof(MrvlIEtypes_eapol_gwk_hsk_retries_t); } -#endif if ((bss->param.bss_config.filter.filter_mode <= MAC_FILTER_MODE_BLOCK_MAC) && (bss->param.bss_config.filter.mac_count <= MAX_MAC_FILTER_NUM)) { @@ -1100,6 +1089,10 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, tlv_auth_type->header.len = wlan_cpu_to_le16(sizeof(MrvlIEtypes_auth_type_t) - sizeof(MrvlIEtypesHeader_t)); + tlv_auth_type->PWE_derivation = + bss->param.bss_config.pwe_derivation; + tlv_auth_type->transition_disable = + bss->param.bss_config.transition_disable; tlv_auth_type->auth_type = (t_u8)bss->param.bss_config.auth_mode; cmd_size += sizeof(MrvlIEtypes_auth_type_t); @@ -1190,49 +1183,34 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, tlv += sizeof(MrvlIEtypes_rsn_replay_prot_t); } -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (IS_FW_SUPPORT_AUTHENTICATOR(pmpriv->adapter)) { -#endif - if (bss->param.bss_config.wpa_cfg.length) { - tlv_passphrase = - (MrvlIEtypes_passphrase_t *)tlv; - tlv_passphrase->header.type = wlan_cpu_to_le16( - TLV_TYPE_UAP_WPA_PASSPHRASE); - tlv_passphrase->header - .len = (t_u16)wlan_cpu_to_le16( - bss->param.bss_config.wpa_cfg.length); - memcpy_ext( - pmpriv->adapter, - tlv_passphrase->passphrase, - bss->param.bss_config.wpa_cfg.passphrase, - bss->param.bss_config.wpa_cfg.length, - bss->param.bss_config.wpa_cfg.length); - cmd_size += - sizeof(MrvlIEtypesHeader_t) + - bss->param.bss_config.wpa_cfg.length; - tlv += sizeof(MrvlIEtypesHeader_t) + - bss->param.bss_config.wpa_cfg.length; - } - - if (bss->param.bss_config.wpa_cfg.gk_rekey_time < - MAX_GRP_TIMER) { - tlv_rekey_time = - (MrvlIEtypes_group_rekey_time_t *)tlv; - tlv_rekey_time->header.type = wlan_cpu_to_le16( - TLV_TYPE_UAP_GRP_REKEY_TIME); - tlv_rekey_time->header.len = - wlan_cpu_to_le16(sizeof(t_u32)); - tlv_rekey_time->gk_rekey_time = - wlan_cpu_to_le32( - bss->param.bss_config.wpa_cfg - .gk_rekey_time); - cmd_size += - sizeof(MrvlIEtypes_group_rekey_time_t); - tlv += sizeof(MrvlIEtypes_group_rekey_time_t); - } -#ifdef DRV_EMBEDDED_AUTHENTICATOR + if (bss->param.bss_config.wpa_cfg.length) { + tlv_passphrase = (MrvlIEtypes_passphrase_t *)tlv; + tlv_passphrase->header.type = + wlan_cpu_to_le16(TLV_TYPE_UAP_WPA_PASSPHRASE); + tlv_passphrase->header.len = (t_u16)wlan_cpu_to_le16( + bss->param.bss_config.wpa_cfg.length); + memcpy_ext(pmpriv->adapter, tlv_passphrase->passphrase, + bss->param.bss_config.wpa_cfg.passphrase, + bss->param.bss_config.wpa_cfg.length, + bss->param.bss_config.wpa_cfg.length); + cmd_size += sizeof(MrvlIEtypesHeader_t) + + bss->param.bss_config.wpa_cfg.length; + tlv += sizeof(MrvlIEtypesHeader_t) + + bss->param.bss_config.wpa_cfg.length; + } + + if (bss->param.bss_config.wpa_cfg.gk_rekey_time < + MAX_GRP_TIMER) { + tlv_rekey_time = (MrvlIEtypes_group_rekey_time_t *)tlv; + tlv_rekey_time->header.type = + wlan_cpu_to_le16(TLV_TYPE_UAP_GRP_REKEY_TIME); + tlv_rekey_time->header.len = + wlan_cpu_to_le16(sizeof(t_u32)); + tlv_rekey_time->gk_rekey_time = wlan_cpu_to_le32( + bss->param.bss_config.wpa_cfg.gk_rekey_time); + cmd_size += sizeof(MrvlIEtypes_group_rekey_time_t); + tlv += sizeof(MrvlIEtypes_group_rekey_time_t); } -#endif } else { if ((bss->param.bss_config.wep_cfg.key0.length) && ((bss->param.bss_config.wep_cfg.key0.length == 5) || @@ -1342,7 +1320,7 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, bss->param.bss_config.supported_mcs_set, 16, sizeof(tlv_htcap->ht_cap.supported_mcs_set)); if (IS_CARD9098(pmpriv->adapter->card_type) || - IS_CARDIW62X(pmpriv->adapter->card_type) || + IS_CARDIW624(pmpriv->adapter->card_type) || IS_CARD9097(pmpriv->adapter->card_type)) { if (bss->param.bss_config.supported_mcs_set[0]) { if (bss->param.bss_config.bandcfg.chanBand == @@ -1441,11 +1419,6 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, cmd_size += sizeof(MrvlIEtypes_wmm_parameter_t); tlv += sizeof(MrvlIEtypes_wmm_parameter_t); } -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (!IS_FW_SUPPORT_AUTHENTICATOR(pmpriv->adapter)) - AuthenticatorBssConfig(pmpriv->psapriv, - (t_u8 *)&bss->param.bss_config, 0, 0, 0); -#endif if (pmpriv->adapter->pcard_info->v17_fw_api && bss->param.bss_config.preamble_type) { tlv_preamble = (MrvlIEtypes_preamble_t *)tlv; @@ -1460,16 +1433,6 @@ static mlan_status wlan_uap_cmd_ap_config(pmlan_private pmpriv, cmd_size += sizeof(MrvlIEtypes_preamble_t); tlv += sizeof(MrvlIEtypes_preamble_t); } - if (bss->param.bss_config.multi_ap_flag) { - /** Add multi AP tlv here */ - tlv_multi_ap = (MrvlIEtypes_MultiAp_t *)tlv; - tlv_multi_ap->header.type = wlan_cpu_to_le16(TLV_TYPE_MULTI_AP); - tlv_multi_ap->header.len = - wlan_cpu_to_le16(sizeof(tlv_multi_ap->flag)); - tlv_multi_ap->flag = bss->param.bss_config.multi_ap_flag; - cmd_size += sizeof(MrvlIEtypes_MultiAp_t); - tlv += sizeof(MrvlIEtypes_MultiAp_t); - } cmd->size = (t_u16)wlan_cpu_to_le16(cmd_size); PRINTM(MCMND, "AP config: cmd_size=%d\n", cmd_size); LEAVE(); @@ -1526,7 +1489,7 @@ static mlan_status wlan_uap_cmd_sys_configure(pmlan_private pmpriv, ENTER(); - cmd->command = wlan_cpu_to_le16(HOST_CMD_APCMD_SYS_CONFIGURE); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_APCMD_SYS_CONFIGURE); sys_config->action = wlan_cpu_to_le16(cmd_action); cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_SYS_CONFIG) - 1 + S_DS_GEN); @@ -2036,6 +1999,7 @@ static mlan_status wlan_uap_ret_cmd_ap_config(pmlan_private pmpriv, MrvlIEtypes_gwk_cipher_t *tlv_gwk_cipher = MNULL; MrvlIEtypes_rsn_replay_prot_t *tlv_rsn_prot = MNULL; MrvlIEtypes_passphrase_t *tlv_passphrase = MNULL; + MrvlIEtypes_SAE_Password_t *tlv_sae_password = MNULL; #ifdef WIFI_DIRECT_SUPPORT MrvlIEtypes_psk_t *tlv_psk = MNULL; #endif /* WIFI_DIRECT_SUPPORT */ @@ -2327,6 +2291,18 @@ static mlan_status wlan_uap_ret_cmd_ap_config(pmlan_private pmpriv, sizeof(bss->param.bss_config.wpa_cfg .passphrase)); break; + case TLV_TYPE_SAE_PASSWORD: + tlv_sae_password = (MrvlIEtypes_SAE_Password_t *)tlv; + bss->param.bss_config.wpa_cfg.sae_password_length = + MIN(MLAN_PMK_HEXSTR_LENGTH, tlv_len); + memcpy_ext(pmpriv->adapter, + bss->param.bss_config.wpa_cfg.sae_password, + tlv_sae_password->sae_password, + bss->param.bss_config.wpa_cfg + .sae_password_length, + sizeof(bss->param.bss_config.wpa_cfg + .sae_password)); + break; #ifdef WIFI_DIRECT_SUPPORT case TLV_TYPE_UAP_PSK: tlv_psk = (MrvlIEtypes_psk_t *)tlv; @@ -2428,11 +2404,6 @@ static mlan_status wlan_uap_ret_cmd_ap_config(pmlan_private pmpriv, tlv = (MrvlIEtypesHeader_t *)((t_u8 *)tlv + tlv_len + sizeof(MrvlIEtypesHeader_t)); } -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (!IS_FW_SUPPORT_AUTHENTICATOR(pmpriv->adapter)) - AuthenticatorBssConfig(pmpriv->psapriv, - (t_u8 *)&bss->param.bss_config, 0, 0, 1); -#endif LEAVE(); return MLAN_STATUS_SUCCESS; } @@ -3027,7 +2998,7 @@ static mlan_status wlan_uap_cmd_bss_start(pmlan_private pmpriv, MrvlIEtypes_HostMlme_t *tlv; ENTER(); - cmd->command = wlan_cpu_to_le16(HOST_CMD_APCMD_BSS_START); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_APCMD_BSS_START); cmd->size = S_DS_GEN; if (pmpriv->uap_host_based & UAP_FLAG_HOST_MLME) { tlv = (MrvlIEtypes_HostMlme_t *)((t_u8 *)cmd + cmd->size); @@ -3265,8 +3236,10 @@ static mlan_status wlan_uap_ret_get_log(pmlan_private pmpriv, wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[0]); pget_info->param.stats.rx_stuck_issue_cnt[1] = wlan_le32_to_cpu(pget_log->rx_stuck_issue_cnt[1]); - pget_info->param.stats.rx_stuck_recovery_cnt = - wlan_le32_to_cpu(pget_log->rx_stuck_recovery_cnt); + pget_info->param.stats.rx_stuck_poll_recovery_cnt = + wlan_le32_to_cpu(pget_log->rx_stuck_poll_recovery_cnt); + pget_info->param.stats.rx_stuck_intr_recovery_cnt = + wlan_le32_to_cpu(pget_log->rx_stuck_intr_recovery_cnt); pget_info->param.stats.rx_stuck_tsf[0] = wlan_le64_to_cpu(pget_log->rx_stuck_tsf[0]); pget_info->param.stats.rx_stuck_tsf[1] = @@ -3428,7 +3401,7 @@ static mlan_status wlan_uap_cmd_sta_deauth(pmlan_private pmpriv, mlan_deauth_param *deauth = (mlan_deauth_param *)pdata_buf; ENTER(); - cmd->command = wlan_cpu_to_le16(HOST_CMD_APCMD_STA_DEAUTH); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_APCMD_STA_DEAUTH); cmd->size = wlan_cpu_to_le16(S_DS_GEN + sizeof(HostCmd_DS_STA_DEAUTH)); memcpy_ext(pmpriv->adapter, pcmd_sta_deauth->mac, deauth->mac_addr, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); @@ -3437,6 +3410,34 @@ static mlan_status wlan_uap_cmd_sta_deauth(pmlan_private pmpriv, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function send deauth command + * + * @param pmpriv A pointer to mlan_private structure + * @param sta_addr A pointer to sta mac address + * @param reason_code reason code + * @return MLAN_STATUS_SUCCESS + */ +static mlan_status wlan_send_deauth_cmd(pmlan_private pmpriv, t_u8 *sta_addr, + t_u16 reason_code) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + mlan_deauth_param param; + + ENTER(); + + param.reason_code = reason_code; + memcpy_ext(pmpriv->adapter, param.mac_addr, sta_addr, + MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_STA_DEAUTH, + HostCmd_ACT_GEN_SET, 0, MNULL, (t_void *)¶m); + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + /** * @brief This function prepares command of report mic_err * @@ -3453,7 +3454,7 @@ static mlan_status wlan_uap_cmd_report_mic(pmlan_private pmpriv, (HostCmd_DS_REPORT_MIC *)&cmd->params.report_mic; ENTER(); - cmd->command = wlan_cpu_to_le16(HOST_CMD_APCMD_REPORT_MIC); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_APCMD_REPORT_MIC); cmd->size = wlan_cpu_to_le16(S_DS_GEN + sizeof(HostCmd_DS_REPORT_MIC)); memcpy_ext(pmpriv->adapter, pcmd_report_mic->mac, pdata_buf, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); @@ -3909,6 +3910,10 @@ static void wlan_check_uap_capability(pmlan_private priv, pmlan_buffer pevent) priv->is_11ax_enabled = MTRUE; } } + if (priv->is_11n_enabled || priv->is_11ac_enabled || + priv->is_11ax_enabled) { + PRINTM(MCMND, "STBC NOT supported, Will be disabled\n"); + } if (tlv_type == VENDOR_SPECIFIC_221) { if (!memcmp(priv->adapter, @@ -3986,7 +3991,7 @@ static void wlan_check_uap_capability(pmlan_private priv, pmlan_buffer pevent) bandwidth; ret = wlan_prepare_cmd( - priv, HOST_CMD_APCMD_SYS_CONFIGURE, + priv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_SET, 0, MNULL, &chan_bw_oper); if (ret != MLAN_STATUS_SUCCESS && @@ -4209,7 +4214,7 @@ static mlan_status wlan_uap_cmd_oper_ctrl(pmlan_private pmpriv, ENTER(); - cmd->command = wlan_cpu_to_le16(HOST_CMD_APCMD_OPER_CTRL); + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_APCMD_OPER_CTRL); cmd->size = wlan_cpu_to_le16(sizeof(HostCmd_DS_UAP_OPER_CTRL) + S_DS_GEN); poper_ctl->action = wlan_cpu_to_le16(cmd_action); @@ -4364,8 +4369,6 @@ static mlan_status wlan_uap_cmd_add_station(pmlan_private pmpriv, LEAVE(); return MLAN_STATUS_FAILURE; } - /* Save station aid for multi-ap */ - sta_ptr->aid = bss->param.sta_info.aid; memcpy_ext(pmadapter, new_sta->peer_mac, bss->param.sta_info.peer_mac, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); if (cmd_action != HostCmd_ACT_ADD_STA) @@ -4470,16 +4473,16 @@ static mlan_status wlan_uap_cmd_add_station(pmlan_private pmpriv, if (pext_tlv == MNULL) { tlv = (MrvlIEtypesHeader_t *)pos; tlv->type = wlan_cpu_to_le16(EXTENSION); - tlv->len = wlan_cpu_to_le16( - MIN(sta_ptr->he_cap.ieee_hdr.len, - sizeof(IEEEtypes_HECap_t) - - sizeof(IEEEtypes_Header_t))); + tlv->len = MIN(sta_ptr->he_cap.ieee_hdr.len, + sizeof(IEEEtypes_HECap_t) - + sizeof(IEEEtypes_Header_t)); pos += sizeof(MrvlIEtypesHeader_t); memcpy_ext(pmadapter, pos, (t_u8 *)&sta_ptr->he_cap.ext_id, tlv->len, tlv->len); travel_len += sizeof(MrvlIEtypesHeader_t) + tlv->len; + tlv->len = wlan_cpu_to_le16(tlv->len); } } @@ -4523,6 +4526,34 @@ done: return MLAN_STATUS_SUCCESS; } +/** + * @brief clean up station's ralist and rx_reordering table. + * + * @param pmpriv A pointer to pmlan_private structure + * @param sta_addr A pointer to station mac address + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +static void wlan_clean_up_station(pmlan_private pmpriv, t_u8 *sta_addr) +{ + if (pmpriv->is_11n_enabled || pmpriv->is_11ax_enabled) { + wlan_cleanup_reorder_tbl(pmpriv, sta_addr); + wlan_11n_cleanup_txbastream_tbl(pmpriv, sta_addr); + } + wlan_wmm_delete_peer_ralist(pmpriv, sta_addr); + return; +} + +static mlan_status wlan_ret_add_station(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + HostCmd_DS_ADD_STATION *add_sta = &resp->params.sta_info; + + wlan_clean_up_station(pmpriv, add_sta->peer_mac); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function prepares command of per peer stats * @@ -4628,23 +4659,19 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, /* Prepare command */ switch (cmd_no) { - case HostCMD_APCMD_ACS_SCAN: + case HostCmd_CMD_APCMD_ACS_SCAN: case HostCmd_CMD_SOFT_RESET: - case HOST_CMD_APCMD_BSS_STOP: - case HOST_CMD_APCMD_SYS_INFO: - case HOST_CMD_APCMD_SYS_RESET: - case HOST_CMD_APCMD_STA_LIST: + case HostCmd_CMD_APCMD_BSS_STOP: + case HostCmd_CMD_APCMD_SYS_INFO: + case HostCmd_CMD_APCMD_SYS_RESET: + case HostCmd_CMD_APCMD_STA_LIST: cmd_ptr->command = wlan_cpu_to_le16(cmd_no); cmd_ptr->size = wlan_cpu_to_le16(S_DS_GEN); break; - case HOST_CMD_APCMD_BSS_START: + case HostCmd_CMD_APCMD_BSS_START: ret = wlan_uap_cmd_bss_start(pmpriv, cmd_ptr); -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (IsAuthenticatorEnabled(pmpriv->psapriv)) - AuthenticatorBssConfig(pmpriv->psapriv, MNULL, 1, 0, 0); -#endif break; - case HOST_CMD_APCMD_SYS_CONFIGURE: + case HostCmd_CMD_APCMD_SYS_CONFIGURE: ret = wlan_uap_cmd_sys_configure(pmpriv, cmd_ptr, cmd_action, (pmlan_ioctl_req)pioctl_buf, pdata_buf); @@ -4694,10 +4721,10 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, case HostCmd_CMD_CHAN_REPORT_REQUEST: ret = wlan_11h_cmd_process(pmpriv, cmd_ptr, pdata_buf); break; - case HOST_CMD_APCMD_STA_DEAUTH: + case HostCmd_CMD_APCMD_STA_DEAUTH: ret = wlan_uap_cmd_sta_deauth(pmpriv, cmd_ptr, pdata_buf); break; - case HOST_CMD_APCMD_REPORT_MIC: + case HostCmd_CMD_APCMD_REPORT_MIC: ret = wlan_uap_cmd_report_mic(pmpriv, cmd_ptr, pdata_buf); break; case HostCmd_CMD_802_11_KEY_MATERIAL: @@ -4708,9 +4735,6 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_get_hw_spec(pmpriv, cmd_ptr); break; #ifdef SDIO - case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: - ret = wlan_cmd_sdio_rx_aggr_cfg(cmd_ptr, cmd_action, pdata_buf); - break; #endif case HostCmd_CMD_802_11_HS_CFG_ENH: ret = wlan_uap_cmd_802_11_hs_cfg(pmpriv, cmd_ptr, cmd_action, @@ -4818,16 +4842,16 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, pdata_buf); break; #ifdef WIFI_DIRECT_SUPPORT - case HOST_CMD_WIFI_DIRECT_MODE_CONFIG: + case HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG: ret = wlan_cmd_wifi_direct_mode(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HOST_CMD_P2P_PARAMS_CONFIG: + case HostCmd_CMD_P2P_PARAMS_CONFIG: ret = wlan_cmd_p2p_params_config(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; #endif - case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: + case HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: ret = wlan_cmd_gpio_tsf_latch(pmpriv, cmd_ptr, cmd_action, pioctl_buf, pdata_buf); break; @@ -4873,7 +4897,7 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, case HostCmd_CMD_DRCS_CONFIG: ret = wlan_cmd_drcs_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HOST_CMD_APCMD_OPER_CTRL: + case HostCmd_CMD_APCMD_OPER_CTRL: ret = wlan_uap_cmd_oper_ctrl(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -4912,7 +4936,7 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, break; #endif #endif - case HOST_CMD_TX_RX_PKT_STATS: + case HostCmd_CMD_TX_RX_PKT_STATS: ret = wlan_cmd_tx_rx_pkt_stats(pmpriv, cmd_ptr, (pmlan_ioctl_req)pioctl_buf, pdata_buf); @@ -4933,11 +4957,6 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_boot_sleep(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) - case HostCmd_CMD_CRYPTO: - ret = wlan_cmd_crypto(pmpriv, cmd_ptr, cmd_action, pdata_buf); - break; -#endif case HostCmd_CMD_11AX_CFG: ret = wlan_cmd_11ax_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -4960,6 +4979,14 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_rxabortcfg_ext(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_NAV_MITIGATION_CFG: + ret = wlan_cmd_nav_mitigation(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; + case HostCmd_CMD_802_11_LED_CONTROL: + ret = wlan_cmd_led_config(pmpriv, cmd_ptr, cmd_action, + pdata_buf); + break; case HostCmd_CMD_TX_AMPDU_PROT_MODE: ret = wlan_cmd_tx_ampdu_prot_mode(pmpriv, cmd_ptr, cmd_action, pdata_buf); @@ -4976,7 +5003,7 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_cck_desense_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; - case HostCmd_CHANNEL_TRPC_CONFIG: + case HostCmd_CMD_CHANNEL_TRPC_CONFIG: ret = wlan_cmd_get_chan_trpc_config(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; @@ -5011,9 +5038,14 @@ mlan_status wlan_ops_uap_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_DS_GET_SENSOR_TEMP: + case HostCmd_CMD_DS_GET_SENSOR_TEMP: wlan_cmd_get_sensor_temp(pmpriv, cmd_ptr, cmd_action); break; +#ifdef STA_SUPPORT + case HostCmd_CMD_802_11_SCAN_EXT: + ret = wlan_cmd_802_11_scan_ext(pmpriv, cmd_ptr, pdata_buf); + break; +#endif default: PRINTM(MERROR, "PREP_CMD: unknown command- %#x\n", cmd_no); if (pioctl_req) @@ -5060,7 +5092,7 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, /* Command successful, handle response */ switch (cmdresp_no) { - case HOST_CMD_APCMD_BSS_STOP: + case HostCmd_CMD_APCMD_BSS_STOP: pmpriv->uap_bss_started = MFALSE; /* Timestamp update is required because bss_start after skip_cac * enabled should not select non-current channel just because @@ -5085,15 +5117,13 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, if (pmpriv->adapter->state_rdh.stage == RDH_STOP_INTFS) wlan_11h_radar_detected_callback((t_void *)pmpriv); wlan_coex_ampdu_rxwinsize(pmadapter); -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (IsAuthenticatorEnabled(pmpriv->psapriv)) { - AuthenticatorBssConfig(pmpriv->psapriv, MNULL, 0, 1, 0); - AuthenticatorkeyClear(pmpriv->psapriv); - } -#endif pmpriv->uap_host_based = 0; +#if defined(USB) + if (IS_USB(pmadapter->card_type)) + wlan_resync_usb_port(pmadapter); +#endif break; - case HOST_CMD_APCMD_BSS_START: + case HostCmd_CMD_APCMD_BSS_START: if (!pmpriv->intf_state_11h.is_11h_host && pmpriv->adapter->state_rdh.stage == RDH_RESTART_INTFS) wlan_11h_radar_detected_callback((t_void *)pmpriv); @@ -5107,20 +5137,21 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, pmpriv->msdu_in_rx_amsdu_cnt = 0; pmpriv->msdu_in_tx_amsdu_cnt = 0; break; - case HOST_CMD_APCMD_SYS_RESET: + case HostCmd_CMD_APCMD_SYS_RESET: pmpriv->uap_bss_started = MFALSE; pmpriv->uap_host_based = 0; -#ifdef DRV_EMBEDDED_AUTHENTICATOR - AuthenitcatorInitBssConfig(pmpriv->psapriv); -#endif ret = wlan_uap_ret_sys_reset(pmpriv, resp, pioctl_buf); - wlan_reset_all_chan_dfs_state(priv, BAND_A, DFS_USABLE); + 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 HOST_CMD_APCMD_SYS_INFO: + case HostCmd_CMD_APCMD_SYS_INFO: break; - case HOST_CMD_APCMD_SYS_CONFIGURE: + case HostCmd_CMD_APCMD_SYS_CONFIGURE: ret = wlan_uap_ret_sys_config(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_802_11_PS_MODE_ENH: @@ -5145,22 +5176,19 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_CHAN_REPORT_REQUEST: ret = wlan_11h_cmdresp_process(pmpriv, resp); break; - case HOST_CMD_APCMD_STA_DEAUTH: + case HostCmd_CMD_APCMD_STA_DEAUTH: break; - case HOST_CMD_APCMD_REPORT_MIC: + case HostCmd_CMD_APCMD_REPORT_MIC: break; case HostCmd_CMD_802_11_KEY_MATERIAL: break; - case HOST_CMD_APCMD_STA_LIST: + case HostCmd_CMD_APCMD_STA_LIST: ret = wlan_uap_ret_sta_list(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_GET_HW_SPEC: ret = wlan_ret_get_hw_spec(pmpriv, resp, pioctl_buf); break; #ifdef SDIO - case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG: - ret = wlan_ret_sdio_rx_aggr_cfg(pmpriv, resp); - break; #endif case HostCmd_CMD_CFG_DATA: ret = wlan_ret_cfg_data(pmpriv, resp, pioctl_buf); @@ -5278,14 +5306,14 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, ret = wlan_ret_remain_on_channel(pmpriv, resp, pioctl_buf); break; #ifdef WIFI_DIRECT_SUPPORT - case HOST_CMD_WIFI_DIRECT_MODE_CONFIG: + case HostCmd_CMD_WIFI_DIRECT_MODE_CONFIG: ret = wlan_ret_wifi_direct_mode(pmpriv, resp, pioctl_buf); break; - case HOST_CMD_P2P_PARAMS_CONFIG: + case HostCmd_CMD_P2P_PARAMS_CONFIG: ret = wlan_ret_p2p_params_config(pmpriv, resp, pioctl_buf); break; #endif - case HOST_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: + case HostCmd_CMD_GPIO_TSF_LATCH_PARAM_CONFIG: ret = wlan_ret_gpio_tsf_latch(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_802_11_RF_ANTENNA: @@ -5325,10 +5353,10 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_DRCS_CONFIG: ret = wlan_ret_drcs_cfg(pmpriv, resp, pioctl_buf); break; - case HostCMD_APCMD_ACS_SCAN: + case HostCmd_CMD_APCMD_ACS_SCAN: ret = wlan_ret_cmd_uap_acs_scan(pmpriv, resp, pioctl_buf); break; - case HOST_CMD_APCMD_OPER_CTRL: + case HostCmd_CMD_APCMD_OPER_CTRL: ret = wlan_uap_ret_oper_ctrl(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_INDEPENDENT_RESET_CFG: @@ -5353,7 +5381,7 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, break; #endif #endif - case HOST_CMD_TX_RX_PKT_STATS: + case HostCmd_CMD_TX_RX_PKT_STATS: ret = wlan_ret_tx_rx_pkt_stats(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_802_11_LINK_STATS: @@ -5363,12 +5391,8 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, ret = wlan_ret_boot_sleep(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_ADD_NEW_STATION: + ret = wlan_ret_add_station(pmpriv, resp, pioctl_buf); break; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) - case HostCmd_CMD_CRYPTO: - ret = wlan_ret_crypto(pmpriv, resp, pioctl_buf); - break; -#endif case HostCmd_CMD_11AX_CFG: ret = wlan_ret_11ax_cfg(pmpriv, resp, pioctl_buf); break; @@ -5381,6 +5405,12 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_RX_ABORT_CFG: ret = wlan_ret_rxabortcfg(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_NAV_MITIGATION_CFG: + ret = wlan_ret_nav_mitigation(pmpriv, resp, pioctl_buf); + break; + case HostCmd_CMD_802_11_LED_CONTROL: + ret = wlan_ret_led_config(pmpriv, resp, pioctl_buf); + break; case HostCmd_CMD_OFDM_DESENSE_CFG: ret = wlan_ret_ofdmdesense_cfg(pmpriv, resp, pioctl_buf); break; @@ -5403,7 +5433,7 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_CCK_DESENSE_CFG: ret = wlan_ret_cck_desense_cfg(pmpriv, resp, pioctl_buf); break; - case HostCmd_CHANNEL_TRPC_CONFIG: + case HostCmd_CMD_CHANNEL_TRPC_CONFIG: ret = wlan_ret_get_chan_trpc_config(pmpriv, resp, pioctl_buf); break; case HostCmd_CMD_LOW_POWER_MODE_CFG: @@ -5430,9 +5460,16 @@ mlan_status wlan_ops_uap_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_DS_GET_SENSOR_TEMP: + case HostCmd_CMD_DS_GET_SENSOR_TEMP: ret = wlan_ret_get_sensor_temp(pmpriv, resp, pioctl_buf); break; +#ifdef STA_SUPPORT + case HostCmd_CMD_802_11_SCAN_EXT: + ret = wlan_ret_802_11_scan_ext(pmpriv, resp, pioctl_buf); + pioctl_buf = MNULL; + pmadapter->curr_cmd->pioctl_buf = MNULL; + break; +#endif default: PRINTM(MERROR, "CMD_RESP: Unknown command response %#x\n", resp->command); @@ -5462,6 +5499,7 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) t_u8 *event_buf = MNULL; mlan_event *pevent = MNULL; t_u8 sta_addr[MLAN_MAC_ADDR_LENGTH]; + t_u16 reason_code = 0; sta_node *sta_ptr = MNULL; t_u8 i = 0; t_u8 channel = 0; @@ -5514,15 +5552,12 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) pevent->event_id = MLAN_EVENT_ID_UAP_FW_BSS_START; wlan_check_uap_capability(pmpriv, pmbuf); wlan_coex_ampdu_rxwinsize(pmadapter); -#ifdef DRV_EMBEDDED_AUTHENTICATOR - if (IsAuthenticatorEnabled(pmpriv->psapriv)) { - pmadapter->authenticator_priv = pmpriv; - wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_DEFER_RX_WORK, - MNULL); - } -#endif 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"); @@ -5582,11 +5617,7 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) if (!sta_ptr) break; wlan_check_sta_capability(pmpriv, pmbuf, sta_ptr); - if (pmpriv->is_11n_enabled || pmpriv->is_11ax_enabled -#ifdef DRV_EMBEDDED_AUTHENTICATOR - || IsAuthenticatorEnabled(pmpriv->psapriv) -#endif - ) { + if (pmpriv->is_11n_enabled || pmpriv->is_11ax_enabled) { for (i = 0; i < MAX_NUM_TID; i++) { if (sta_ptr->is_11n_enabled || sta_ptr->is_11ax_enabled) @@ -5602,12 +5633,6 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) } if (pmpriv->sec_info.wapi_enabled) wlan_update_wapi_info_tlv(pmpriv, pmbuf); -#ifdef DRV_EMBEDDED_AUTHENTICATOR - /**enter authenticator*/ - if (IsAuthenticatorEnabled(pmpriv->psapriv)) - AuthenticatorSendEapolPacket( - pmpriv->psapriv, sta_ptr->cm_connectioninfo); -#endif pevent->event_id = MLAN_EVENT_ID_DRV_PASSTHRU; break; case EVENT_MICRO_AP_STA_DEAUTH: @@ -5621,10 +5646,19 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) wlan_recv_event(pmpriv, pevent->event_id, pevent); memcpy_ext(pmadapter, sta_addr, pmadapter->event_body + 2, MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + reason_code = *(t_u16 *)pmadapter->event_body; sta_ptr = wlan_get_station_entry(pmpriv, sta_addr); + PRINTM_NETINTF(MMSG, pmpriv); - PRINTM(MMSG, "wlan: EVENT: MICRO_AP_STA_DEAUTH " MACSTR "\n", - MAC2STR(sta_addr)); + PRINTM(MMSG, + "wlan: EVENT: MICRO_AP_STA_DEAUTH reason=0x%x " MACSTR + "\n", + reason_code, MAC2STR(sta_addr)); + if (pmpriv->uap_host_based & UAP_FLAG_HOST_MLME && sta_ptr) { + if (!(reason_code & MBIT(14))) + wlan_send_deauth_cmd(pmpriv, sta_addr, + reason_code); + } if (pmpriv->is_11n_enabled || pmpriv->is_11ax_enabled) { wlan_cleanup_reorder_tbl(pmpriv, sta_addr); wlan_11n_cleanup_txbastream_tbl(pmpriv, sta_addr); @@ -5640,18 +5674,17 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) break; case EVENT_ADDBA: PRINTM(MEVENT, "EVENT: ADDBA Request\n"); - if (pmpriv->media_connected == MTRUE) - ret = wlan_prepare_cmd(pmpriv, - HostCmd_CMD_11N_ADDBA_RSP, - HostCmd_ACT_GEN_SET, 0, MNULL, - pmadapter->event_body); + if (pmpriv->media_connected == MTRUE && + !pmpriv->adapter->remain_on_channel) + wlan_11n_add_bastream(pmpriv, pmadapter->event_body); else PRINTM(MERROR, "Ignore ADDBA Request event in BSS idle state\n"); break; case EVENT_DELBA: PRINTM(MEVENT, "EVENT: DELBA Request\n"); - if (pmpriv->media_connected == MTRUE) + if (pmpriv->media_connected == MTRUE && + !pmpriv->adapter->remain_on_channel) wlan_11n_delete_bastream(pmpriv, pmadapter->event_body); else PRINTM(MERROR, @@ -5659,7 +5692,8 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) break; case EVENT_BA_STREAM_TIMEOUT: PRINTM(MEVENT, "EVENT: BA Stream timeout\n"); - if (pmpriv->media_connected == MTRUE) + if (pmpriv->media_connected == MTRUE && + !pmpriv->adapter->remain_on_channel) wlan_11n_ba_stream_timeout( pmpriv, (HostCmd_DS_11N_BATIMEOUT *) pmadapter->event_body); @@ -5837,6 +5871,12 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) pmpriv->uap_state_chan_cb.bandcfg = pchan_info->bandcfg; if (wlan_11h_radar_detect_required(pmpriv, pchan_info->channel)) wlan_11h_update_dfs_master_state_by_uap(pmpriv); + else { + PRINTM(MCMND, + "Disable DFS master operation after channel switch\n"); + wlan_11h_config_master_radar_det(pmpriv, MFALSE); + wlan_11h_check_update_radar_det_state(pmpriv); + } if ((pmpriv->adapter->state_rdh.stage != RDH_OFF && !pmpriv->intf_state_11h.is_11h_host) || pmpriv->adapter->dfs_test_params.no_channel_change_on_radar || @@ -5887,6 +5927,7 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) PRINTM_NETINTF(MEVENT, pmpriv); PRINTM(MEVENT, "EVENT: REMAIN_ON_CHANNEL_EXPIRED reason=%d\n", *(t_u16 *)pmadapter->event_body); + pmpriv->adapter->remain_on_channel = MFALSE; wlan_recv_event(pmpriv, MLAN_EVENT_ID_DRV_FLUSH_RX_WORK, MNULL); pevent->event_id = MLAN_EVENT_ID_FW_REMAIN_ON_CHAN_EXPIRED; break; @@ -5977,7 +6018,7 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) sizeof(eventcause), sizeof(t_u16), sizeof(t_u16)); break; - case CHAN_LOAD_EVENT: { + case EVENT_CHAN_LOAD: { t_u8 *ptr = MNULL; HostCmd_DS_GET_CH_LOAD *cfg_cmd = MNULL; ptr = (t_u8 *)(pmbuf->pbuf + pmbuf->data_offset); @@ -5992,6 +6033,21 @@ mlan_status wlan_ops_uap_process_event(t_void *priv) PRINTM(MINFO, "EVENT: Dump FW info\n"); pevent->event_id = MLAN_EVENT_ID_FW_DUMP_INFO; break; +#ifdef STA_SUPPORT + case EVENT_EXT_SCAN_REPORT: + PRINTM(MEVENT, "EVENT: EXT_SCAN Report (%d)\n", + pmbuf->data_len); + if (pmadapter->pscan_ioctl_req && pmadapter->ext_scan) + ret = wlan_handle_event_ext_scan_report(priv, pmbuf); + break; + case EVENT_EXT_SCAN_STATUS_REPORT: + PRINTM(MEVENT, "EVENT: EXT_SCAN status report (%d)\n", + pmbuf->data_len); + pmadapter->ext_scan_timeout = MFALSE; + ret = wlan_handle_event_ext_scan_status(priv, pmbuf); + break; +#endif + default: pevent->event_id = MLAN_EVENT_ID_DRV_PASSTHRU; break; @@ -6032,7 +6088,7 @@ static mlan_status wlan_uap_set_uap_max_sta(pmlan_private pmpriv, wlan_cpu_to_le16(TLV_TYPE_UAP_MAX_STA_CNT_PER_CHIP); tlv_uap_max_sta.header.len = wlan_cpu_to_le16(sizeof(t_u16)); tlv_uap_max_sta.uap_max_sta = wlan_cpu_to_le16(uap_max_sta); - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_SET, 0, MNULL, &tlv_uap_max_sta); LEAVE(); return ret; @@ -6070,13 +6126,13 @@ mlan_status wlan_ops_uap_init_cmd(t_void *priv, t_u8 first_bss) wlan_uap_set_uap_max_sta( pmpriv, pmpriv->adapter->init_para.uap_max_sta); - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_GET, 0, MNULL, MNULL); if (ret) { ret = MLAN_STATUS_FAILURE; goto done; } - last_cmd = HOST_CMD_APCMD_SYS_CONFIGURE; + last_cmd = HostCmd_CMD_APCMD_SYS_CONFIGURE; /** set last_init_cmd */ if (last_cmd) { pmpriv->adapter->last_init_cmd = last_cmd; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c b/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c index acb1dc1..72eedba 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c @@ -3,7 +3,7 @@ * @brief This file contains the handling of AP mode ioctls * * - * Copyright 2009-2022 NXP + * Copyright 2009-2023 NXP * * This software file (the File) is distributed by NXP * under the terms of the GNU General Public License Version 2, June 1991 @@ -62,7 +62,7 @@ static mlan_status wlan_uap_bss_ioctl_stop(pmlan_adapter pmadapter, ENTER(); - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_BSS_STOP, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_BSS_STOP, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) @@ -253,7 +253,7 @@ static mlan_status wlan_uap_callback_bss_ioctl_start(t_void *priv) prep_bss_start: /* else okay to send command: not DFS channel or no radar */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_BSS_START, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_BSS_START, HostCmd_ACT_GEN_SET, 0, (t_void *)puap_state_chan_cb->pioctl_req_curr, MNULL); @@ -304,7 +304,7 @@ static mlan_status wlan_uap_bss_ioctl_start(pmlan_adapter pmadapter, if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; } else { - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_BSS_START, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_BSS_START, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) @@ -355,7 +355,7 @@ static mlan_status wlan_uap_bss_ioctl_reset(pmlan_adapter pmadapter, pmpriv->addba_reject[6] = pmpriv->addba_reject[7] = ADDBA_RSP_STATUS_REJECT; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_RESET, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_RESET, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) @@ -418,8 +418,8 @@ static mlan_status wlan_uap_bss_ioctl_mac_address(pmlan_adapter pmadapter, } else cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -450,8 +450,8 @@ static mlan_status wlan_uap_bss_ioctl_uap_wmm_param(pmlan_adapter pmadapter, else cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -481,8 +481,8 @@ wlan_uap_bss_ioctl_action_chan_switch(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_SET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -514,8 +514,8 @@ wlan_uap_bss_ioctl_uap_scan_channels(pmlan_adapter pmadapter, else cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -546,8 +546,8 @@ static mlan_status wlan_uap_bss_ioctl_uap_channel(pmlan_adapter pmadapter, else cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -580,7 +580,7 @@ static mlan_status wlan_uap_bss_ioctl_uap_oper_ctrl(pmlan_adapter pmadapter, else cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_OPER_CTRL, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_OPER_CTRL, cmd_action, 0, (t_void *)pioctl_req, (t_void *)pioctl_req->pbuf); @@ -690,8 +690,8 @@ static mlan_status wlan_uap_bss_ioctl_config(pmlan_adapter pmadapter, cmd_action = HostCmd_ACT_GEN_GET; /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, cmd_action, - 0, (t_void *)pioctl_req, MNULL); + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, + cmd_action, 0, (t_void *)pioctl_req, MNULL); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; @@ -718,7 +718,7 @@ static mlan_status wlan_uap_bss_ioctl_deauth_sta(pmlan_adapter pmadapter, ENTER(); bss = (mlan_ds_bss *)pioctl_req->pbuf; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_STA_DEAUTH, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_STA_DEAUTH, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, (t_void *)&bss->param.deauth_param); if (ret == MLAN_STATUS_SUCCESS) @@ -745,7 +745,7 @@ static mlan_status wlan_uap_get_sta_list(pmlan_adapter pmadapter, ENTER(); /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_STA_LIST, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_STA_LIST, HostCmd_ACT_GEN_GET, 0, (t_void *)pioctl_req, MNULL); @@ -908,7 +908,7 @@ static mlan_status wlan_uap_set_wapi_ie(mlan_private *priv, } /* Send request to firmware */ - ret = wlan_prepare_cmd(priv, HOST_CMD_APCMD_SYS_CONFIGURE, + ret = wlan_prepare_cmd(priv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, MNULL); @@ -1013,7 +1013,7 @@ wlan_uap_sec_ioctl_report_mic_error(pmlan_adapter pmadapter, ENTER(); sec = (mlan_ds_sec_cfg *)pioctl_req->pbuf; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_REPORT_MIC, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_REPORT_MIC, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, (t_void *)sec->param.sta_mac); if (ret == MLAN_STATUS_SUCCESS) @@ -1735,7 +1735,7 @@ static mlan_status wlan_uap_bss_ioctl_acs_scan(pmlan_adapter pmadapter, return MLAN_STATUS_FAILURE; } /* Send request to firmware */ - ret = wlan_prepare_cmd(pmpriv, HostCMD_APCMD_ACS_SCAN, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_ACS_SCAN, HostCmd_ACT_GEN_SET, 0, (t_void *)pioctl_req, MNULL); @@ -1768,7 +1768,7 @@ mlan_status wlan_uap_get_channel(pmlan_private pmpriv) tlv_chan_band.header.len = sizeof(MrvlIEtypes_channel_band_t) - sizeof(MrvlIEtypesHeader_t); - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_GET, 0, MNULL, &tlv_chan_band); LEAVE(); return ret; @@ -1797,7 +1797,7 @@ mlan_status wlan_uap_set_channel(pmlan_private pmpriv, tlv_chan_band.bandcfg = uap_band_cfg; tlv_chan_band.channel = channel; - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_SET, 0, MNULL, &tlv_chan_band); LEAVE(); return ret; @@ -1833,7 +1833,7 @@ mlan_status wlan_uap_get_beacon_dtim(pmlan_private pmpriv) ptlv_dtim_pd->header.len = sizeof(MrvlIEtypes_dtim_period_t) - sizeof(MrvlIEtypesHeader_t); - ret = wlan_prepare_cmd(pmpriv, HOST_CMD_APCMD_SYS_CONFIGURE, + ret = wlan_prepare_cmd(pmpriv, HostCmd_CMD_APCMD_SYS_CONFIGURE, HostCmd_ACT_GEN_GET, 0, MNULL, tlv_buffer); LEAVE(); return ret; @@ -1971,9 +1971,6 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) mlan_ds_rate *rate = MNULL; mlan_ds_reg_mem *reg_mem = MNULL; mlan_private *pmpriv = pmadapter->priv[pioctl_req->bss_index]; -#if defined(STA_SUPPORT) && defined(UAP_SUPPORT) - pmlan_ds_scan pscan; -#endif ENTER(); switch (pioctl_req->req_id) { @@ -2038,25 +2035,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) status = wlan_uap_bss_ioctl_action_chan_switch( pmadapter, pioctl_req); break; -#if defined(STA_SUPPORT) && defined(UAP_SUPPORT) +#ifdef STA_SUPPORT case MLAN_IOCTL_SCAN: - pscan = (mlan_ds_scan *)pioctl_req->pbuf; - if ((pscan->sub_command == MLAN_OID_SCAN_NORMAL) && - (pioctl_req->action == MLAN_ACT_GET)) { - PRINTM(MIOCTL, "Get scan table in uap\n"); - pscan->param.scan_resp.pscan_table = - (t_u8 *)pmadapter->pscan_table; - pscan->param.scan_resp.num_in_scan_table = - pmadapter->num_in_scan_table; - pscan->param.scan_resp.age_in_secs = - pmadapter->age_in_secs; - pioctl_req->data_read_written = - sizeof(mlan_scan_resp) + MLAN_SUB_COMMAND_SIZE; - pscan->param.scan_resp.pchan_stats = - (t_u8 *)pmadapter->pchan_stats; - pscan->param.scan_resp.num_in_chan_stats = - pmadapter->num_in_chan_stats; - } + status = wlan_scan_ioctl(pmadapter, pioctl_req); break; #endif case MLAN_IOCTL_GET_INFO: @@ -2276,6 +2257,11 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) if (misc->sub_command == MLAN_OID_MISC_RX_ABORT_CFG_EXT) status = wlan_misc_ioctl_rxabortcfg_ext(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_NAV_MITIGATION) + status = wlan_misc_ioctl_nav_mitigation(pmadapter, + pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_LED_CONFIG) + status = wlan_misc_ioctl_led(pmadapter, pioctl_req); if (misc->sub_command == MLAN_OID_MISC_TX_AMPDU_PROT_MODE) status = wlan_misc_ioctl_tx_ampdu_prot_mode(pmadapter, pioctl_req); @@ -2330,6 +2316,11 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) if (misc->sub_command == MLAN_OID_MISC_COUNTRY_CODE) status = wlan_misc_ioctl_country_code(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_REORDER_FLUSH_TIME) + status = wlan_misc_ioctl_reorder_flush_time(pmadapter, + pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_EXT_CAP_CFG) + status = wlan_misc_ext_capa_cfg(pmadapter, pioctl_req); break; case MLAN_IOCTL_POWER_CFG: power = (mlan_ds_power_cfg *)pioctl_req->pbuf; diff --git a/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c b/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c index 6f3201e..426a8da 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_uap_txrx.c @@ -36,9 +36,6 @@ Change log: #include "mlan_wmm.h" #include "mlan_11n_aggr.h" #include "mlan_11n_rxreorder.h" -#ifdef DRV_EMBEDDED_AUTHENTICATOR -#include "authenticator_api.h" -#endif /******************************************************** Local Functions @@ -249,11 +246,6 @@ t_void *wlan_ops_uap_process_txpd(t_void *priv, pmlan_buffer pmbuf) plocal_tx_pd->tx_pkt_type = (t_u16)pkt_type; plocal_tx_pd->tx_control = tx_control; } - if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) { - plocal_tx_pd->flags |= MRVDRV_TxPD_FLAGS_EASYMESH; - memcpy_ext(pmpriv->adapter, plocal_tx_pd->ra_mac, pmbuf->mac, - MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); - } if (pmbuf->flags & MLAN_BUF_FLAG_TX_CTRL) { if (pmbuf->u.tx_info.data_rate) { @@ -346,9 +338,6 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) t_u8 ta[MLAN_MAC_ADDR_LENGTH]; t_u16 rx_pkt_type = 0; sta_node *sta_ptr = MNULL; -#ifdef DRV_EMBEDDED_AUTHENTICATOR - t_u8 eapol_type[2] = {0x88, 0x8e}; -#endif t_u16 adj_rx_rate = 0; t_u8 antenna = 0; @@ -359,7 +348,8 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) wlan_802_11_header *pwlan_hdr; IEEEtypes_FrameCtl_t *frmctl; pmlan_buffer pmbuf2 = MNULL; - mlan_802_11_mac_addr src_addr, dest_addr; + mlan_802_11_mac_addr src_addr = {0x00}; + mlan_802_11_mac_addr dest_addr = {0x00}; t_u16 hdr_len; t_u8 snap_eth_hdr[5] = {0xaa, 0xaa, 0x03, 0x00, 0x00}; t_u8 ext_rate_info = 0; @@ -398,14 +388,6 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) } rx_pkt_type = prx_pd->rx_pkt_type; - if (prx_pd->flags & RXPD_FLAG_PKT_EASYMESH) { - PRINTM_NETINTF(MDAT_D, priv); - PRINTM(MDAT_D, "UAP Rx Easymesh pkt flags : 0x%x\n", - prx_pd->flags); - ret = wlan_check_easymesh_pkt(priv, pmbuf, prx_pd); - if (ret != MLAN_STATUS_SUCCESS) - goto done; - } prx_pkt = (RxPacketHdr_t *)((t_u8 *)prx_pd + prx_pd->rx_pkt_offset); PRINTM(MINFO, @@ -567,11 +549,7 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) } } - if (prx_pd->flags & RXPD_FLAG_PKT_EASYMESH) - sta_ptr = wlan_get_station_entry(priv, prx_pd->ta_mac); - else - sta_ptr = wlan_get_station_entry(priv, - prx_pkt->eth803_hdr.src_addr); + sta_ptr = wlan_get_station_entry(priv, prx_pkt->eth803_hdr.src_addr); if (sta_ptr) { sta_ptr->snr = prx_pd->snr; sta_ptr->nf = prx_pd->nf; @@ -585,33 +563,14 @@ mlan_status wlan_ops_uap_process_rx_packet(t_void *adapter, pmlan_buffer pmbuf) } } -#ifdef DRV_EMBEDDED_AUTHENTICATOR - /**process eapol packet for uap*/ - if (IsAuthenticatorEnabled(priv->psapriv) && - (!memcmp(pmadapter, &prx_pkt->eth803_hdr.h803_len, eapol_type, - sizeof(eapol_type)))) { - ret = AuthenticatorProcessEapolPacket( - priv->psapriv, ((t_u8 *)prx_pd + prx_pd->rx_pkt_offset), - prx_pd->rx_pkt_length); - if (ret == MLAN_STATUS_SUCCESS) { - pmadapter->ops.data_complete(pmadapter, pmbuf, ret); - goto done; - } - } -#endif - pmbuf->priority |= prx_pd->priority; if (pmadapter->enable_net_mon && (prx_pd->rx_pkt_type == PKT_TYPE_802DOT11)) { wlan_process_uap_rx_packet(priv, pmbuf); goto done; } - if (prx_pd->flags & RXPD_FLAG_PKT_EASYMESH) - memcpy_ext(pmadapter, ta, prx_pd->ta_mac, MLAN_MAC_ADDR_LENGTH, - MLAN_MAC_ADDR_LENGTH); - else - memcpy_ext(pmadapter, ta, prx_pkt->eth803_hdr.src_addr, - MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + memcpy_ext(pmadapter, ta, prx_pkt->eth803_hdr.src_addr, + MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); if ((rx_pkt_type != PKT_TYPE_BAR) && (prx_pd->priority < MAX_NUM_TID)) { sta_ptr = wlan_get_station_entry(priv, ta); if (sta_ptr) { diff --git a/mxm_wifiex/wlan_src/mlan/mlan_usb.c b/mxm_wifiex/wlan_src/mlan/mlan_usb.c index 4a72647..d1b3d5d 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_usb.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_usb.c @@ -99,8 +99,8 @@ static const struct _mlan_card_info mlan_card_info_usb9097 = { }; #endif -#ifdef USBIW62X -static const struct _mlan_card_info mlan_card_info_usbIW62X = { +#ifdef USBIW624 +static const struct _mlan_card_info mlan_card_info_usbIW624 = { .max_tx_buf_size = MLAN_TX_DATA_BUF_SIZE_4K, .v16_fw_api = 1, .v17_fw_api = 1, @@ -262,8 +262,8 @@ static mlan_status wlan_usb_prog_fw_w_helper(pmlan_adapter pmadapter, if (IS_USB9097(pmadapter->card_type)) check_fw_status = MTRUE; #endif -#if defined(USBIW62X) - if (IS_USBIW62X(pmadapter->card_type)) +#if defined(USBIW624) + if (IS_USBIW624(pmadapter->card_type)) check_fw_status = MTRUE; #endif @@ -806,9 +806,9 @@ mlan_status wlan_get_usb_device(pmlan_adapter pmadapter) pmadapter->pcard_info = &mlan_card_info_usb9097; break; #endif -#ifdef USBIW62X - case CARD_TYPE_USBIW62X: - pmadapter->pcard_info = &mlan_card_info_usbIW62X; +#ifdef USBIW624 + case CARD_TYPE_USBIW624: + pmadapter->pcard_info = &mlan_card_info_usbIW624; break; #endif default: @@ -1305,7 +1305,7 @@ static mlan_status wlan_usb_host_to_card(pmlan_private pmpriv, t_u8 type, return MLAN_STATUS_FAILURE; } if (type == MLAN_TYPE_CMD -#if (defined(USB9098) || defined(USB9097) || defined(USBIW62X)) +#if (defined(USB9098) || defined(USB9097) || defined(USBIW624)) || type == MLAN_TYPE_VDLL #endif ) { @@ -1356,18 +1356,36 @@ static mlan_status wlan_usb_host_to_card(pmlan_private pmpriv, t_u8 type, } /** - * @brief This function handle event/cmd complete + * @brief This function handle event complete * * @param pmadapter A pointer to mlan_adapter structure * @param pmbuf A pointer to the mlan_buffer * @return N/A */ -static mlan_status wlan_usb_cmdevt_complete(pmlan_adapter pmadapter, - mlan_buffer *pmbuf, - mlan_status status) +static mlan_status wlan_usb_evt_complete(pmlan_adapter pmadapter, + mlan_buffer *pmbuf, mlan_status status) { ENTER(); + pmadapter->event_cause = 0; + pmadapter->pmlan_buffer_event = MNULL; + pmadapter->callbacks.moal_recv_complete(pmadapter->pmoal_handle, pmbuf, + pmadapter->rx_cmd_ep, status); + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function handle cmd complete + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pmbuf A pointer to the mlan_buffer + * @return N/A + */ +static mlan_status wlan_usb_cmd_complete(pmlan_adapter pmadapter, + mlan_buffer *pmbuf, mlan_status status) +{ + ENTER(); pmadapter->callbacks.moal_recv_complete(pmadapter->pmoal_handle, pmbuf, pmadapter->rx_cmd_ep, status); @@ -1419,9 +1437,9 @@ mlan_adapter_operations mlan_usb_ops = { .dnld_fw = wlan_usb_dnld_fw, .host_to_card = wlan_usb_host_to_card, .wakeup_card = wlan_pm_usb_wakeup_card, - .event_complete = wlan_usb_cmdevt_complete, + .event_complete = wlan_usb_evt_complete, .data_complete = wlan_usb_data_complete, - .cmdrsp_complete = wlan_usb_cmdevt_complete, + .cmdrsp_complete = wlan_usb_cmd_complete, .handle_rx_packet = wlan_usb_handle_rx_packet, .intf_header_len = USB_INTF_HEADER_LEN, diff --git a/mxm_wifiex/wlan_src/mlan/mlan_util.h b/mxm_wifiex/wlan_src/mlan/mlan_util.h index 5f96256..2efa6f4 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_util.h +++ b/mxm_wifiex/wlan_src/mlan/mlan_util.h @@ -47,6 +47,11 @@ typedef struct _mlan_list_head { t_void *plock; } mlan_list_head, *pmlan_list_head; +struct reflective_enum_element { + int id; + const char *name; +}; + /** MLAN MNULL pointer */ #define MNULL ((void *)0) @@ -497,4 +502,17 @@ static INLINE t_u32 bitcount(t_u32 num) return count; } +static INLINE const char * +reflective_enum_lookup_name(const struct reflective_enum_element *elements, + int id) +{ + const struct reflective_enum_element *elem = elements; + + while (elem->name && elem->id != id) { + elem++; + } + + return elem->name; +} + #endif /* !_MLAN_UTIL_H_ */ diff --git a/mxm_wifiex/wlan_src/mlan/mlan_wmm.c b/mxm_wifiex/wlan_src/mlan/mlan_wmm.c index 17e9a46..5c641fc 100644 --- a/mxm_wifiex/wlan_src/mlan/mlan_wmm.c +++ b/mxm_wifiex/wlan_src/mlan/mlan_wmm.c @@ -1122,7 +1122,7 @@ static int wlan_dequeue_tx_packet(pmlan_adapter pmadapter) } } } - if (!ptr->is_wmm_enabled || + if (!ptr->is_wmm_enabled || priv->adapter->remain_on_channel || (ptr->ba_status || ptr->del_ba_count >= DEL_BA_THRESHOLD) #ifdef STA_SUPPORT || priv->wps.session_enable @@ -1148,7 +1148,7 @@ static int wlan_dequeue_tx_packet(pmlan_adapter pmadapter) priv, tid, ptr->ra, MFALSE)) { wlan_11n_create_txbastream_tbl( priv, ptr->ra, tid, - BA_STREAM_SETUP_INPROGRESS); + BA_STREAM_SETUP_SENT_ADDBA); wlan_send_addba(priv, tid, ptr->ra); } } else if (wlan_find_stream_to_delete(priv, ptr, tid, @@ -1160,6 +1160,9 @@ static int wlan_dequeue_tx_packet(pmlan_adapter pmadapter) wlan_11n_create_txbastream_tbl( priv, ptr->ra, tid, BA_STREAM_SETUP_INPROGRESS); + wlan_11n_set_txbastream_status( + priv, tid_del, ra, + BA_STREAM_SENT_DELBA, MFALSE); wlan_send_delba(priv, MNULL, tid_del, ra, 1); } @@ -2156,13 +2159,8 @@ t_void wlan_wmm_add_buf_txqueue(pmlan_adapter pmadapter, pmlan_buffer pmbuf) &priv->wmm.tid_tbl_ptr[tid_down].ra_list, MNULL, MNULL); } else { - if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) - memcpy_ext(pmadapter, ra, pmbuf->mac, - MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); - else - memcpy_ext(pmadapter, ra, - pmbuf->pbuf + pmbuf->data_offset, - MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); + memcpy_ext(pmadapter, ra, pmbuf->pbuf + pmbuf->data_offset, + MLAN_MAC_ADDR_LENGTH, MLAN_MAC_ADDR_LENGTH); /** put multicast/broadcast packet in the same ralist */ if (ra[0] & 0x01) memset(pmadapter, ra, 0xff, sizeof(ra)); diff --git a/mxm_wifiex/wlan_src/mlinux/mlan_decl.h b/mxm_wifiex/wlan_src/mlinux/mlan_decl.h index 53eefff..fee793e 100644 --- a/mxm_wifiex/wlan_src/mlinux/mlan_decl.h +++ b/mxm_wifiex/wlan_src/mlinux/mlan_decl.h @@ -24,7 +24,7 @@ #define _MLAN_DECL_H_ /** MLAN release version */ -#define MLAN_RELEASE_VERSION "391.p3" +#define MLAN_RELEASE_VERSION "408" /** Re-define generic data types for MLAN/MOAL */ /** Signed char (1-byte) */ @@ -157,6 +157,10 @@ 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 @@ -269,6 +273,10 @@ typedef t_s32 t_sval; /** pcie inband reset */ #define FW_RELOAD_PCIE_INBAND_RESET 6 +#ifdef PCIE +/* Interrupt type */ +enum { RX_DATA, RX_EVENT, TX_COMPLETE, RX_CMD_RESP }; +#endif #ifdef USB #define MLAN_USB_BLOCK_SIZE (512) #define MLAN_USB_AGGR_MODE_NUM (0) @@ -374,7 +382,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; /** 8801 card type */ #define CARD_TYPE_8801 0x0a /** OWL card type */ -#define CARD_TYPE_IW62X 0x0b +#define CARD_TYPE_IW624 0x0b /** Black bird card type */ #define CARD_TYPE_AW693 0x0c @@ -408,9 +416,9 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_SD9177 (CARD_TYPE_9177 | (INTF_SD << 8)) /** SD8801 card type */ #define CARD_TYPE_SD8801 (CARD_TYPE_8801 | (INTF_SD << 8)) -/** SD_IW62X card type */ -#define CARD_TYPE_SDIW62X (CARD_TYPE_IW62X | (INTF_SD << 8)) -/** SD_IW62X card type */ +/** SD_IW624 card type */ +#define CARD_TYPE_SDIW624 (CARD_TYPE_IW624 | (INTF_SD << 8)) +/** SD_IW624 card type */ #define CARD_TYPE_SDAW693 (CARD_TYPE_AW693 | (INTF_SD << 8)) #define IS_SD8887(ct) (CARD_TYPE_SD8887 == (ct)) @@ -423,7 +431,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_SD9098(ct) (CARD_TYPE_SD9098 == (ct)) #define IS_SD9177(ct) (CARD_TYPE_SD9177 == (ct)) #define IS_SD8801(ct) (CARD_TYPE_SD8801 == (ct)) -#define IS_SDIW62X(ct) (CARD_TYPE_SDIW62X == (ct)) +#define IS_SDIW624(ct) (CARD_TYPE_SDIW624 == (ct)) #define IS_SDAW693(ct) (CARD_TYPE_SDAW693 == (ct)) /** SD8887 Card */ @@ -446,8 +454,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_SD9177 "SDIW612" /** SD8801 Card */ #define CARD_SD8801 "SD8801" -/** SDIW62X Card */ -#define CARD_SDIW62X "SDIW62X" +/** SDIW624 Card */ +#define CARD_SDIW624 "SDIW624" /** SDAW693 Card */ #define CARD_SDAW693 "SDAW693" #endif @@ -461,8 +469,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_PCIE9097 (CARD_TYPE_9097 | (INTF_PCIE << 8)) /** PCIE9098 card type */ #define CARD_TYPE_PCIE9098 (CARD_TYPE_9098 | (INTF_PCIE << 8)) -/** PCIEIW62X card type */ -#define CARD_TYPE_PCIEIW62X (CARD_TYPE_IW62X | (INTF_PCIE << 8)) +/** PCIEIW624 card type */ +#define CARD_TYPE_PCIEIW624 (CARD_TYPE_IW624 | (INTF_PCIE << 8)) /** PCIEAW693 card type */ #define CARD_TYPE_PCIEAW693 (CARD_TYPE_AW693 | (INTF_PCIE << 8)) @@ -470,7 +478,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_PCIE8997(ct) (CARD_TYPE_PCIE8997 == (ct)) #define IS_PCIE9097(ct) (CARD_TYPE_PCIE9097 == (ct)) #define IS_PCIE9098(ct) (CARD_TYPE_PCIE9098 == (ct)) -#define IS_PCIEIW62X(ct) (CARD_TYPE_PCIEIW62X == (ct)) +#define IS_PCIEIW624(ct) (CARD_TYPE_PCIEIW624 == (ct)) #define IS_PCIEAW693(ct) (CARD_TYPE_PCIEAW693 == (ct)) /** PCIE8897 Card */ @@ -485,8 +493,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_PCIE9098 "PCIE9098" /** PCIEAW690 Card */ #define CARD_PCIEAW690 "PCIEAW690" -/** PCIEIW62X Card */ -#define CARD_PCIEIW62X "PCIEIW62X" +/** PCIEIW624 Card */ +#define CARD_PCIEIW624 "PCIEIW624" /** PCIEAW693 Card */ #define CARD_PCIEAW693 "PCIEAW693" /** PCIEIW629 Card */ @@ -506,8 +514,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_TYPE_USB9098 (CARD_TYPE_9098 | (INTF_USB << 8)) /** USB9097 card type */ #define CARD_TYPE_USB9097 (CARD_TYPE_9097 | (INTF_USB << 8)) -/** USBIW62X card type */ -#define CARD_TYPE_USBIW62X (CARD_TYPE_IW62X | (INTF_USB << 8)) +/** USBIW624 card type */ +#define CARD_TYPE_USBIW624 (CARD_TYPE_IW624 | (INTF_USB << 8)) #define IS_USB8801(ct) (CARD_TYPE_USB8801 == (ct)) #define IS_USB8897(ct) (CARD_TYPE_USB8897 == (ct)) @@ -515,7 +523,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_USB8978(ct) (CARD_TYPE_USB8978 == (ct)) #define IS_USB9098(ct) (CARD_TYPE_USB9098 == (ct)) #define IS_USB9097(ct) (CARD_TYPE_USB9097 == (ct)) -#define IS_USBIW62X(ct) (CARD_TYPE_USBIW62X == (ct)) +#define IS_USBIW624(ct) (CARD_TYPE_USBIW624 == (ct)) /** USB8801 Card */ #define CARD_USB8801 "USB8801" @@ -529,8 +537,8 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define CARD_USB9098 "USB9098" /** USB9097 Card */ #define CARD_USB9097 "USBIW620" -/** USBIW62X Card */ -#define CARD_USBIW62X "USBIW62X" +/** USBIW624 Card */ +#define CARD_USBIW624 "USBIW624" #endif #define IS_CARD8801(ct) (CARD_TYPE_8801 == ((ct)&0xf)) @@ -542,7 +550,7 @@ typedef t_u8 mlan_802_11_mac_addr[MLAN_MAC_ADDR_LENGTH]; #define IS_CARD9098(ct) (CARD_TYPE_9098 == ((ct)&0xf)) #define IS_CARD9097(ct) (CARD_TYPE_9097 == ((ct)&0xf)) #define IS_CARD9177(ct) (CARD_TYPE_9177 == ((ct)&0xf)) -#define IS_CARDIW62X(ct) (CARD_TYPE_IW62X == ((ct)&0xf)) +#define IS_CARDIW624(ct) (CARD_TYPE_IW624 == ((ct)&0xf)) #define IS_CARDAW693(ct) (CARD_TYPE_AW693 == ((ct)&0xf)) typedef struct _card_type_entry { @@ -613,8 +621,6 @@ typedef enum { #define MLAN_BUF_FLAG_TX_CTRL MBIT(14) -#define MLAN_BUF_FLAG_EASYMESH MBIT(16) - #define MLAN_BUF_FLAG_MC_AGGR_PKT MBIT(17) #ifdef DEBUG_LEVEL1 @@ -701,7 +707,6 @@ typedef enum _mlan_buf_type { MLAN_BUF_TYPE_EVENT, MLAN_BUF_TYPE_RAW_DATA, #ifdef SDIO - MLAN_BUF_TYPE_SPA_DATA, #endif } mlan_buf_type; @@ -844,6 +849,13 @@ typedef enum _mlan_event_id { MLAN_EVENT_ID_DRV_DISCONNECT_LOGGER = 0x80000028, MLAN_EVENT_ID_DRV_WIFI_STATUS = 0x80000029, MLAN_EVENT_ID_STORE_HOST_CMD_RESP = 0x80000030, + MLAN_EVENT_ID_DRV_ADDBA_TIMEOUT = 0x80000031, +#ifdef PCIE + MLAN_EVENT_ID_DRV_DEFER_RX_DATA = 0x80000032, + MLAN_EVENT_ID_DRV_DEFER_RX_EVENT = 0x80000033, + MLAN_EVENT_ID_DRV_DEFER_CMDRESP = 0x80000034, + MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE = 0x80000035, +#endif } mlan_event_id; /** Data Structures */ @@ -985,14 +997,14 @@ typedef enum _dfs_moe_t { /** Band_Config_t */ typedef MLAN_PACK_START struct _Band_Config_t { #ifdef BIG_ENDIAN_SUPPORT - /** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/ - t_u8 scanMode : 2; - /** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */ - t_u8 chan2Offset : 2; /** Channel Width - (00)=20MHz, (10)=40MHz, (11)=80MHz */ t_u8 chanWidth : 2; /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; + /** Channel Selection Mode - (00)=manual, (01)=ACS, (02)=user*/ + t_u8 scanMode : 2; + /** Secondary Channel Offset - (00)=None, (01)=Above, (11)=Below */ + t_u8 chan2Offset : 2; #else /** Band Info - (00)=2.4GHz, (01)=5GHz, (10)=6GHz */ t_u8 chanBand : 2; @@ -1323,8 +1335,6 @@ typedef struct _mlan_buffer { t_u32 extra_ts_sec; /** Time stamp when packet is dequed from rx_q(micro seconds) */ t_u32 extra_ts_usec; - /** When TX ra mac address, When Rx Ta mac address*/ - t_u8 mac[MLAN_MAC_ADDR_LENGTH]; /** Fields below are valid for MLAN module only */ /** Pointer to parent mlan_buffer */ struct _mlan_buffer *pparent; @@ -1715,6 +1725,14 @@ typedef struct _tdls_tear_down_event { t_u16 reason_code; } tdls_tear_down_event; +/** Event structure for addba timeout */ +typedef struct _addba_timeout_event { + /** Peer mac address */ + t_u8 peer_mac_addr[MLAN_MAC_ADDR_LENGTH]; + /** Tid */ + t_u8 tid; +} addba_timeout_event; + /** channel width */ typedef enum wifi_channel_width { WIFI_CHAN_WIDTH_20 = 0, @@ -2516,12 +2534,6 @@ typedef struct _mlan_callbacks { t_void (*moal_updata_peer_signal)(t_void *pmoal, t_u32 bss_index, t_u8 *peer_addr, t_s8 snr, t_s8 nflr); t_u64 (*moal_do_div)(t_u64 num, t_u32 base); -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - mlan_status (*moal_wait_hostcmd_complete)(t_void *pmoal, - t_u32 bss_index); - mlan_status (*moal_notify_hostcmd_complete)(t_void *pmoal, - t_u32 bss_index); -#endif void (*moal_tp_accounting)(t_void *pmoal, t_void *buf, t_u32 drop_point); void (*moal_tp_accounting_rx_param)(t_void *pmoal, unsigned int type, @@ -2610,8 +2622,6 @@ typedef struct _mlan_device { /** SDIO MPA Rx */ t_u32 mpa_rx_cfg; #ifdef SDIO - /** SDIO Single port rx aggr */ - t_u8 sdio_rx_aggr_enable; /* see blk_queue_max_segment_size */ t_u32 max_seg_size; /* see blk_queue_max_segments */ @@ -2680,6 +2690,8 @@ typedef struct _mlan_device { t_u8 mcs32; /** second mac flag */ t_u8 second_mac; + /** napi */ + t_u8 napi; } mlan_device, *pmlan_device; /** MLAN API function prototype */ @@ -2760,6 +2772,9 @@ MLAN_API t_u8 mlan_select_wmm_queue(t_void *padapter, t_u8 bss_num, t_u8 tid); MLAN_API mlan_status mlan_disable_host_int(t_void *padapter); /** mlan unmask host interrupt */ MLAN_API mlan_status mlan_enable_host_int(t_void *padapter); +#ifdef PCIE +MLAN_API void mlan_process_pcie_interrupt_cb(t_void *pmadapter, int type); +#endif #define CSI_SIGNATURE 0xABCD diff --git a/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h b/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h index 877cb25..a4dce18 100644 --- a/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h +++ b/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h @@ -357,7 +357,6 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_TP_STATE = 0x0020007D, MLAN_OID_MISC_HAL_PHY_CFG = 0x0020007E, MLAN_OID_MISC_RF_TEST_HE_POWER = 0X0020007F, - MLAN_OID_MISC_MULTI_AP_CFG = 0x00200080, #ifdef UAP_SUPPORT MLAN_OID_MISC_WACP_MODE = 0x00200081, #endif @@ -373,6 +372,9 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_CROSS_CHIP_SYNCH = 0x0020008B, MLAN_OID_MISC_RF_TEST_CONFIG_TRIGGER_FRAME = 0x0020008C, MLAN_OID_MISC_OFDM_DESENSE_CFG = 0x0020008D, + MLAN_OID_MISC_REORDER_FLUSH_TIME = 0x0020008F, + MLAN_OID_MISC_NAV_MITIGATION = 0x00200090, + MLAN_OID_MISC_LED_CONFIG = 0x00200091, }; /** Sub command size */ @@ -924,6 +926,12 @@ typedef struct _mlan_deauth_param { #define PROTOCOL_WAPI 0x80 /** WPA3 SAE */ #define PROTOCOL_WPA3_SAE 0x100 +/* hunting-and-pecking loop only */ +#define SAE_PWE_HUNT_AND_PECK 0 +/** hash-to-element only */ +#define SAE_PWE_HASH_TO_ELEMENT 1 +/** both hunting-and-pecking loop and hash-to-element */ +#define SAE_PWE_BOTH 2 /** OWE */ #define PROTOCOL_OWE 0x200 @@ -995,6 +1003,10 @@ typedef struct _wpa_param { t_u32 length; /** passphrase */ t_u8 passphrase[64]; + /** SAE Password length */ + t_u32 sae_password_length; + /** Passphrase */ + t_u8 sae_password[255]; /**group key rekey time in seconds */ t_u32 gk_rekey_time; } wpa_param; @@ -1173,8 +1185,6 @@ typedef struct _mlan_uap_bss_param { /** uap host based config */ t_u32 uap_host_based_config; - /** multi ap flag */ - t_u8 multi_ap_flag; } mlan_uap_bss_param, *pmlan_uap_bss_param; /** mlan_uap_scan_channels */ @@ -1708,8 +1718,10 @@ typedef struct _mlan_ds_get_stats { /** Rx Stuck Related Info*/ /** Rx Stuck Issue count */ t_u32 rx_stuck_issue_cnt[2]; - /** Rx Stuck Recovery count */ - t_u32 rx_stuck_recovery_cnt; + /** Rx Stuck Recovery count polling based */ + t_u32 rx_stuck_poll_recovery_cnt; + /** Rx Stuck Recovery count interrupt based */ + t_u32 rx_stuck_intr_recovery_cnt; /** Rx Stuck TSF */ t_u64 rx_stuck_tsf[2]; /** Tx Watchdog Recovery Related Info */ @@ -1970,87 +1982,7 @@ typedef struct _mlan_ver_ext { /** Extended Capabilities Data */ typedef struct MLAN_PACK_START _ExtCap_t { /** Extended Capabilities value */ - t_u8 rsvdBit87 : 1; /* bit 87 */ - t_u8 rsvdBit86 : 1; /* bit 86 */ - t_u8 rsvdBit85 : 1; /* bit 85 */ - t_u8 beacon_prot : 1; /* bit 84 */ - t_u8 rsvdBit83 : 1; /* bit 83 */ - t_u8 rsvdBit82 : 1; /* bit 82 */ - t_u8 rsvdBit81 : 1; /* bit 81 */ - t_u8 rsvdBit80 : 1; /* bit 80 */ - t_u8 rsvdBit79 : 1; /* bit 79 */ - t_u8 TWTResp : 1; /* bit 78 */ - t_u8 TWTReq : 1; /* bit 77 */ - t_u8 rsvdBit76 : 1; /* bit 76 */ - t_u8 rsvdBit75 : 1; /* bit 75 */ - t_u8 rsvdBit74 : 1; /* bit 74 */ - t_u8 rsvdBit73 : 1; /* bit 73 */ - t_u8 FILS : 1; /* bit 72 */ - t_u8 FTMI : 1; /* bit 71 */ - t_u8 FTMR : 1; /* bit 70 */ - t_u8 CAQ : 1; /* bit 69 */ - t_u8 rsvdBit68 : 1; /* bit 68 */ - t_u8 NCC : 1; /* bit 67 */ - t_u8 rsvdBit66 : 1; /* bit 66 */ - t_u8 chanSchedMgnt : 1; /* bit 65 */ - t_u8 MaxAMSDU1 : 1; /* bit 64 */ - t_u8 MaxAMSDU0 : 1; /* bit 63 */ - t_u8 OperModeNtf : 1; /* bit 62 */ - t_u8 TDLSWildBandwidth : 1; /* bit 61 */ - t_u8 rsvdBit60 : 1; /* bit 60 */ - t_u8 rsvdBit59 : 1; /* bit 59 */ - t_u8 rsvdBit58 : 1; /* bit 58 */ - t_u8 rsvdBit57 : 1; /* bit 57 */ - t_u8 rsvdBit56 : 1; /* bit 56 */ - t_u8 rsvdBit55 : 1; /* bit 55 */ - t_u8 rsvdBit54 : 1; /* bit 54 */ - t_u8 rsvdBit53 : 1; /* bit 53 */ - t_u8 rsvdBit52 : 1; /* bit 52 */ - t_u8 rsvdBit51 : 1; /* bit 51 */ - t_u8 rsvdBit50 : 1; /* bit 50 */ - t_u8 rsvdBit49 : 1; /* bit 49 */ - t_u8 rsvdBit48 : 1; /* bit 48 */ - t_u8 rsvdBit47 : 1; /* bit 47 */ - t_u8 rsvdBit46 : 1; /* bit 46 */ - t_u8 rsvdBit45 : 1; /* bit 45 */ - t_u8 rsvdBit44 : 1; /* bit 44 */ - t_u8 rsvdBit43 : 1; /* bit 43 */ - t_u8 rsvdBit42 : 1; /* bit 42 */ - t_u8 rsvdBit41 : 1; /* bit 41 */ - t_u8 rsvdBit40 : 1; /* bit 40 */ - t_u8 TDLSChlSwitchProhib : 1; /* bit 39 */ - t_u8 TDLSProhibited : 1; /* bit 38 */ - t_u8 TDLSSupport : 1; /* bit 37 */ - t_u8 MSGCF_Capa : 1; /* bit 36 */ - t_u8 Reserved35 : 1; /* bit 35 */ - t_u8 SSPN_Interface : 1; /* bit 34 */ - t_u8 EBR : 1; /* bit 33 */ - t_u8 Qos_Map : 1; /* bit 32 */ - t_u8 Interworking : 1; /* bit 31 */ - t_u8 TDLSChannelSwitching : 1; /* bit 30 */ - t_u8 TDLSPeerPSMSupport : 1; /* bit 29 */ - t_u8 TDLSPeerUAPSDSupport : 1; /* bit 28 */ - t_u8 UTC : 1; /* bit 27 */ - t_u8 DMS : 1; /* bit 26 */ - t_u8 SSID_List : 1; /* bit 25 */ - t_u8 ChannelUsage : 1; /* bit 24 */ - t_u8 TimingMeasurement : 1; /* bit 23 */ - t_u8 MultipleBSSID : 1; /* bit 22 */ - t_u8 AC_StationCount : 1; /* bit 21 */ - t_u8 QoSTrafficCap : 1; /* bit 20 */ - t_u8 BSS_Transition : 1; /* bit 19 */ - t_u8 TIM_Broadcast : 1; /* bit 18 */ - t_u8 WNM_Sleep : 1; /* bit 17 */ - t_u8 TFS : 1; /* bit 16 */ - t_u8 GeospatialLocation : 1; /* bit 15 */ - t_u8 CivicLocation : 1; /* bit 14 */ - t_u8 CollocatedIntf : 1; /* bit 13 */ - t_u8 ProxyARPService : 1; /* bit 12 */ - t_u8 FMS : 1; /* bit 11 */ - t_u8 LocationTracking : 1; /* bit 10 */ - t_u8 MulticastDiagnostics : 1; /* bit 9 */ - t_u8 Diagnostics : 1; /* bit 8 */ - t_u8 Event : 1; /* bit 7 */ + t_u8 Event : 1; /* bit 7 */ /* Byte 1 */ t_u8 SPSMP_Support : 1; /* bit 6 */ t_u8 Reserved5 : 1; /* bit 5 */ t_u8 PSMP_Capable : 1; /* bit 4 */ @@ -2058,6 +1990,86 @@ typedef struct MLAN_PACK_START _ExtCap_t { t_u8 ExtChanSwitching : 1; /* bit 2 */ t_u8 Reserved1 : 1; /* bit 1 */ t_u8 BSS_CoexistSupport : 1; /* bit 0 */ + t_u8 GeospatialLocation : 1; /* bit 15 */ /* Byte 2 */ + t_u8 CivicLocation : 1; /* bit 14 */ + t_u8 CollocatedIntf : 1; /* bit 13 */ + t_u8 ProxyARPService : 1; /* bit 12 */ + t_u8 FMS : 1; /* bit 11 */ + t_u8 LocationTracking : 1; /* bit 10 */ + t_u8 MulticastDiagnostics : 1; /* bit 9 */ + t_u8 Diagnostics : 1; /* bit 8 */ + t_u8 TimingMeasurement : 1; /* bit 23 */ /* Byte 3 */ + t_u8 MultipleBSSID : 1; /* bit 22 */ + t_u8 AC_StationCount : 1; /* bit 21 */ + t_u8 QoSTrafficCap : 1; /* bit 20 */ + t_u8 BSS_Transition : 1; /* bit 19 */ + t_u8 TIM_Broadcast : 1; /* bit 18 */ + t_u8 WNM_Sleep : 1; /* bit 17 */ + t_u8 TFS : 1; /* bit 16 */ + t_u8 Interworking : 1; /* bit 31 */ /* Byte 4 */ + t_u8 TDLSChannelSwitching : 1; /* bit 30 */ + t_u8 TDLSPeerPSMSupport : 1; /* bit 29 */ + t_u8 TDLSPeerUAPSDSupport : 1; /* bit 28 */ + t_u8 UTC : 1; /* bit 27 */ + t_u8 DMS : 1; /* bit 26 */ + t_u8 SSID_List : 1; /* bit 25 */ + t_u8 ChannelUsage : 1; /* bit 24 */ + t_u8 TDLSChlSwitchProhib : 1; /* bit 39 */ /* Byte 5 */ + t_u8 TDLSProhibited : 1; /* bit 38 */ + t_u8 TDLSSupport : 1; /* bit 37 */ + t_u8 MSGCF_Capa : 1; /* bit 36 */ + t_u8 Reserved35 : 1; /* bit 35 */ + t_u8 SSPN_Interface : 1; /* bit 34 */ + t_u8 EBR : 1; /* bit 33 */ + t_u8 Qos_Map : 1; /* bit 32 */ + t_u8 rsvdBit47 : 1; /* bit 47 */ /* Byte 6 */ + t_u8 rsvdBit46 : 1; /* bit 46 */ + t_u8 rsvdBit45 : 1; /* bit 45 */ + t_u8 rsvdBit44 : 1; /* bit 44 */ + t_u8 rsvdBit43 : 1; /* bit 43 */ + t_u8 rsvdBit42 : 1; /* bit 42 */ + t_u8 rsvdBit41 : 1; /* bit 41 */ + t_u8 rsvdBit40 : 1; /* bit 40 */ + t_u8 rsvdBit55 : 1; /* bit 55 */ /* Byte 7 */ + t_u8 rsvdBit54 : 1; /* bit 54 */ + t_u8 rsvdBit53 : 1; /* bit 53 */ + t_u8 rsvdBit52 : 1; /* bit 52 */ + t_u8 rsvdBit51 : 1; /* bit 51 */ + t_u8 rsvdBit50 : 1; /* bit 50 */ + t_u8 rsvdBit49 : 1; /* bit 49 */ + t_u8 rsvdBit48 : 1; /* bit 48 */ + t_u8 MaxAMSDU0 : 1; /* bit 63 */ /* Byte 8 */ + t_u8 OperModeNtf : 1; /* bit 62 */ + t_u8 TDLSWildBandwidth : 1; /* bit 61 */ + t_u8 rsvdBit60 : 1; /* bit 60 */ + t_u8 rsvdBit59 : 1; /* bit 59 */ + t_u8 rsvdBit58 : 1; /* bit 58 */ + t_u8 rsvdBit57 : 1; /* bit 57 */ + t_u8 rsvdBit56 : 1; /* bit 56 */ + t_u8 FTMI : 1; /* bit 71 */ /* Byte 9 */ + t_u8 FTMR : 1; /* bit 70 */ + t_u8 CAQ : 1; /* bit 69 */ + t_u8 rsvdBit68 : 1; /* bit 68 */ + t_u8 NCC : 1; /* bit 67 */ + t_u8 rsvdBit66 : 1; /* bit 66 */ + t_u8 chanSchedMgnt : 1; /* bit 65 */ + t_u8 MaxAMSDU1 : 1; /* bit 64 */ + t_u8 rsvdBit79 : 1; /* bit 79 */ /* Byte 10 */ + t_u8 TWTResp : 1; /* bit 78 */ + t_u8 TWTReq : 1; /* bit 77 */ + t_u8 rsvdBit76 : 1; /* bit 76 */ + t_u8 rsvdBit75 : 1; /* bit 75 */ + t_u8 rsvdBit74 : 1; /* bit 74 */ + t_u8 rsvdBit73 : 1; /* bit 73 */ + t_u8 FILS : 1; /* bit 72 */ + t_u8 rsvdBit87 : 1; /* bit 87 */ /* Byte 11 */ + t_u8 rsvdBit86 : 1; /* bit 86 */ + t_u8 rsvdBit85 : 1; /* bit 85 */ + t_u8 beacon_prot : 1; /* bit 84 */ + t_u8 rsvdBit83 : 1; /* bit 83 */ + t_u8 rsvdBit82 : 1; /* bit 82 */ + t_u8 rsvdBit81 : 1; /* bit 81 */ + t_u8 rsvdBit80 : 1; /* bit 80 */ } MLAN_PACK_END ExtCap_t, *pExtCap_t; #else /** Extended Capabilities Data */ @@ -2397,8 +2409,6 @@ typedef struct _mlan_debug_info { t_u32 last_int_status; /** number of interrupt receive */ t_u32 num_of_irq; - /** flag for sdio rx aggr */ - t_u8 sdio_rx_aggr; /** FW update port number */ t_u32 mp_update[SDIO_MP_AGGR_DEF_PKT_LIMIT_MAX * 2]; /** Invalid port update count */ @@ -2473,6 +2483,12 @@ typedef struct _mlan_debug_info { t_u16 last_event_index; /** Number of no free command node */ t_u16 num_no_cmd_node; + /** num_assoc_cmd_error, count result 4 error */ + t_u16 num_assoc_err; + /** num_scan_cmd_error, count result 4 error */ + t_u16 num_scan_err; + /** num_remain_on_channel_cmd_error, count result 4 error */ + t_u16 num_remain_chan_err; /** pending command id */ t_u16 pending_cmd; /** time stamp for dnld last cmd */ @@ -2853,51 +2869,6 @@ typedef struct _mlan_ds_sec_cfg { } param; } mlan_ds_sec_cfg, *pmlan_ds_sec_cfg; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -#define BIT_TLV_TYPE_CRYPTO_KEY (1 << 0) -#define BIT_TLV_TYPE_CRYPTO_KEY_IV (1 << 1) -#define BIT_TLV_TYPE_CRYPTO_KEY_PREFIX (1 << 2) -#define BIT_TLV_TYPE_CRYPTO_KEY_DATA_BLK (1 << 3) - -/** Type definition of mlan_ds_sup_cfg */ -typedef struct _mlan_ds_sup_cfg { - /** Sub-command */ - t_u8 sub_command; - /** output length */ - t_u16 output_len; - /** number of data blks */ - t_u16 data_blks_nr; - /** sub action code */ - t_u8 sub_action_code; - /** skip bytes */ - t_u16 skip_bytes; - /** iteration */ - t_u32 iteration; - /** count */ - t_u32 count; - /** pointer to output */ - t_u8 *output; - /** key length */ - t_u16 key_len; - /** pointer to key */ - t_u8 *key; - /** key iv length */ - t_u16 key_iv_len; - /** pointer to key iv */ - t_u8 *key_iv; - /** key prefix length */ - t_u16 key_prefix_len; - /** pointer to key prefix */ - t_u8 *key_prefix; - /** pointer to data blk length array */ - t_u32 *key_data_blk_len; - /** pointer to key data blk pointer array */ - t_u8 **key_data_blk; - /** callback */ - t_u8 call_back; -} mlan_ds_sup_cfg, *pmlan_ds_sup_cfg; -#endif - /*-----------------------------------------------------------------*/ /** Rate Configuration Group */ /*-----------------------------------------------------------------*/ @@ -3122,6 +3093,8 @@ typedef struct _mlan_ds_beacon_stuck_param_cfg { /** Host sleep config GPIO : Default */ #define HOST_SLEEP_DEF_GPIO 0xff +/** Host sleep config gap : Special setting (host acknowledge required) */ +#define HOST_SLEEP_GAP_SPECIAL 0xff /** Host sleep config gap : Default */ #define HOST_SLEEP_DEF_GAP 200 /** Host sleep config min wake holdoff */ @@ -3143,7 +3116,7 @@ typedef struct _mlan_ds_hs_cfg { /** GPIO pin or 0xff for interface */ t_u32 gpio; /** Gap in milliseconds or or 0xff for special - * setting when GPIO is used to wakeup host + * setting (host acknowledge required) */ t_u32 gap; /** Host sleep wake interval */ @@ -3240,6 +3213,8 @@ typedef struct _mlan_ds_inactivity_to { t_u32 mcast_timeout; /** Timeout for additional Rx traffic after Null PM1 packet exchange */ t_u32 ps_entry_timeout; + /** Inactivity timeout for cmd */ + t_u32 ps_cmd_timeout; } mlan_ds_inactivity_to, *pmlan_ds_inactivity_to; /** Minimum sleep period in milliseconds */ @@ -4027,6 +4002,8 @@ typedef struct _mlan_ds_11ax_cfg { #define MLAN_11AXCMD_CFG_ID_TXOP_RTS 5 #define MLAN_11AXCMD_CFG_ID_TX_OMI 6 #define MLAN_11AXCMD_CFG_ID_OBSSNBRU_TOLTIME 7 +#define MLAN_11AXCMD_CFG_ID_SET_BSRP 8 +#define MLAN_11AXCMD_CFG_ID_LLDE 9 #define MLAN_11AXCMD_SR_SUBID 0x102 #define MLAN_11AXCMD_BEAM_SUBID 0x103 @@ -4034,6 +4011,8 @@ typedef struct _mlan_ds_11ax_cfg { #define MLAN_11AXCMD_TXOMI_SUBID 0x105 #define MLAN_11AXCMD_OBSS_TOLTIME_SUBID 0x106 #define MLAN_11AXCMD_TXOPRTS_SUBID 0x108 +#define MLAN_11AXCMD_SET_BSRP_SUBID 0x109 +#define MLAN_11AXCMD_LLDE_SUBID 0x110 #define MLAN_11AX_TWT_SETUP_SUBID 0x114 #define MLAN_11AX_TWT_TEARDOWN_SUBID 0x115 @@ -4108,6 +4087,29 @@ typedef struct _mlan_ds_11ax_toltime_cmd { t_u32 tol_time; } mlan_ds_11ax_toltime_cmd, *pmlan_ds_11ax_toltime_cmd; +/** Type definition of mlan_ds_11ax_set_bsrp_cmd for MLAN_OID_11AX_CMD_CFG */ +typedef struct _mlan_ds_11ax_set_bsrp_cmd { + /** command value: 1 is enable, 0 is disable*/ + t_u8 value; +} mlan_ds_11ax_set_bsrp_cmd, *pmlan_ds_11ax_set_bsrp_cmd; + +/** Type definition of mlan_ds_11ax_llde_cmd for MLAN_OID_11AX_CMD_CFG */ +typedef struct _mlan_ds_11ax_llde_cmd { + t_u8 llde; // Uplink LLDE: enable=1,disable=0 + t_u8 mode; // operation mode: default=0,carplay=1,gameplay=2 + t_u8 fixrate; // trigger frame rate: auto=0xff + 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 mu_rts_successcnt; + t_u16 mu_rts_failcnt; + t_u16 basic_trigger_successcnt; + t_u16 basic_trigger_failcnt; + t_u16 tbppdu_nullcnt; + t_u16 tbppdu_datacnt; +} mlan_ds_11ax_llde_cmd, *pmlan_ds_11ax_llde_cmd; + /** Type definition of mlan_ds_11ax_cmd_cfg for MLAN_OID_11AX_CMD_CFG */ typedef struct _mlan_ds_11ax_cmd_cfg { /** Sub-command */ @@ -4129,6 +4131,10 @@ typedef struct _mlan_ds_11ax_cmd_cfg { /** OBSS tolerance time configuration for * MLAN_11AXCMD_TOLTIME_SUBID */ mlan_ds_11ax_toltime_cmd toltime_cfg; + /** SET_BSRP configuration for MLAN_11AXCMD_SET_BSRP_SUBID */ + mlan_ds_11ax_set_bsrp_cmd setbsrp_cfg; + /* MLAN_11AXCMD_LLDE_SUBID */ + mlan_ds_11ax_llde_cmd llde_cfg; } param; } mlan_ds_11ax_cmd_cfg, *pmlan_ds_11ax_cmd_cfg; @@ -4583,6 +4589,39 @@ typedef struct _mlan_ds_misc_rx_abort_cfg_ext { t_u8 edmac_enable; } mlan_ds_misc_rx_abort_cfg_ext; +/** Type definition of mlan_ds_misc_nav_mitigation + * for MLAN_OID_MISC_NAV_MITIGATION + */ +typedef struct _mlan_ds_misc_nav_mitigation { + /** start/stop nav mitigation */ + t_u16 start_nav_mitigation; + /** Duration value in us to set as threshold in ACT_SET action */ + t_u16 threshold; + /** Counter for NAV mitigation detected */ + t_u16 detect_cnt; + /** Counter for NAV mitigation stopped */ + t_u16 stop_cnt; + +} mlan_ds_misc_nav_mitigation; + +#define MAX_FW_STATES 6 +typedef struct _mlan_ds_led_behavior { + t_u8 firmwarestate; + t_u8 ledstate; + t_u8 ledargs; +} mlan_ds_misc_led_behavior; + +/** Type definition of mlan_ds_misc_led_cfg + * for MLAN_OID_MISC_LED_CONFIG + */ +typedef struct _mlan_ds_misc_led_cfg { + t_u32 sub_command; + t_u8 enable; + /** tlv len */ + t_u16 led_cfg_len; + mlan_ds_misc_led_behavior misc_led_behvr[MAX_FW_STATES]; +} mlan_ds_misc_led_cfg; + /** Type definition of mlan_ds_misc_rx_abort_cfg_ext * for MLAN_OID_MISC_TX_AMDPU_PROT_MODE */ @@ -6075,6 +6114,13 @@ typedef struct _mlan_ds_cross_chip_synch { t_u32 init_tsf_high; } mlan_ds_cross_chip_synch; +typedef struct _mlan_ds_reorder_flush_time { + /** AC BK/BE_flush time*/ + t_u16 flush_time_ac_be_bk; + /** AC VI/VO flush time */ + t_u16 flush_time_ac_vi_vo; +} mlan_ds_reorder_flush_time; + /** Type definition of mlan_ds_misc_cfg for MLAN_IOCTL_MISC_CFG */ typedef struct _mlan_ds_misc_cfg { /** Sub-command */ @@ -6142,8 +6188,6 @@ typedef struct _mlan_ds_misc_cfg { #endif /** Hotspot config param set */ t_u32 hotspot_cfg; - /** Multi AP flag */ - t_u8 multi_ap_flag; #ifdef STA_SUPPORT ExtCap_t ext_cap; #endif @@ -6214,6 +6258,8 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_rx_abort_cfg rx_abort_cfg; mlan_ds_misc_ofdm_desense_cfg ofdm_desense_cfg; mlan_ds_misc_rx_abort_cfg_ext rx_abort_cfg_ext; + mlan_ds_misc_nav_mitigation nav_mitigation; + mlan_ds_misc_led_cfg led_config; mlan_ds_misc_tx_ampdu_prot_mode tx_ampdu_prot_mode; mlan_ds_misc_rate_adapt_cfg rate_adapt_cfg; mlan_ds_misc_cck_desense_cfg cck_desense_cfg; @@ -6242,6 +6288,7 @@ typedef struct _mlan_ds_misc_cfg { t_u32 ips_ctrl; mlan_ds_ch_load ch_load; mlan_ds_cross_chip_synch cross_chip_synch; + mlan_ds_reorder_flush_time flush_time; } param; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c index 928d22f..75009a7 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.c @@ -2999,7 +2999,7 @@ int woal_cfg80211_mgmt_tx(struct wiphy *wiphy, /* pkt_type + tx_control */ #define HEADER_SIZE 8 - packet_len = (t_u16)len + MLAN_MAC_ADDR_LENGTH; + 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)); @@ -3399,10 +3399,10 @@ done: * * @return out IE length */ -static t_u16 woal_get_specific_ie(const t_u8 *ie, int len, t_u8 *ie_out, +static t_u16 woal_get_specific_ie(const t_u8 *ie, size_t len, t_u8 *ie_out, t_u32 ie_out_len, t_u16 mask) { - int left_len = len; + size_t left_len = len; const t_u8 *pos = ie; int length; t_u8 id = 0; @@ -3825,9 +3825,9 @@ static t_u8 is_selected_registrar_on(const t_u8 *ie, int len) * * @return MTRUE/MFALSE */ -static t_u16 woal_is_selected_registrar_on(const t_u8 *ie, int len) +static t_u16 woal_is_selected_registrar_on(const t_u8 *ie, size_t len) { - int left_len = len; + size_t left_len = len; const t_u8 *pos = ie; int length; t_u8 id = 0; @@ -5082,7 +5082,7 @@ void woal_cfg80211_notify_channel(moal_private *priv, #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) cfg80211_ch_switch_notify(priv->netdev, &chandef, 0, 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && IMX_ANDROID_13)) - cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0); + cfg80211_ch_switch_notify(priv->netdev, &chandef, 0, 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \ IMX_ANDROID_13 || IMX_ANDROID_12_BACKPORT) cfg80211_ch_switch_notify(priv->netdev, &chandef, 0); @@ -5093,6 +5093,7 @@ void woal_cfg80211_notify_channel(moal_private *priv, mutex_unlock(&priv->wdev->mtx); #endif priv->channel = pchan_info->channel; + priv->bandwidth = pchan_info->bandcfg.chanWidth; #ifdef UAP_CFG80211 moal_memcpy_ext(priv->phandle, &priv->chan, &chandef, sizeof(struct cfg80211_chan_def), @@ -5110,6 +5111,7 @@ void woal_cfg80211_notify_channel(moal_private *priv, return; } priv->channel = pchan_info->channel; + priv->bandwidth = pchan_info->bandcfg.chanWidth; freq = ieee80211_channel_to_frequency(pchan_info->channel, band); switch (pchan_info->bandcfg.chanWidth) { case CHAN_BW_20MHZ: diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h index 402c1aa..dcc3329 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211.h @@ -66,10 +66,6 @@ #define MRVL_PKT_TYPE_MGMT_FRAME 0xE5 -#if defined(UAP_CFG80211) || defined(STA_CFG80211) -#define MRVL_PKT_TYPE_MGMT_EASYMESH 0xCF -#endif - 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, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c index aa31346..4086234 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.c @@ -144,6 +144,7 @@ static const struct nla_policy woal_attr_policy[ATTR_WIFI_MAX + 1] = { [ATTR_SCAN_MAC_OUI_SET] = {.type = NLA_STRING, .len = 3}, [ATTR_NODFS_VALUE] = {.type = NLA_U32}, [ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX] = {.type = NLA_U32}, + [ATTR_SCAN_BAND_SET] = {.type = NLA_U8}, }; // clang-format off @@ -785,6 +786,9 @@ static int woal_cfg80211_subcmd_get_drv_dump(struct wiphy *wiphy, int ret = MLAN_STATUS_SUCCESS; int length = 0; char driver_dump_file[128]; +#ifndef DUMP_TO_PROC + char path_name[64]; +#endif struct sk_buff *skb = NULL; ENTER(); @@ -796,6 +800,7 @@ static int woal_cfg80211_subcmd_get_drv_dump(struct wiphy *wiphy, dev = wdev->netdev; priv = (moal_private *)woal_get_netdev_priv(dev); handle = priv->phandle; +#ifdef DUMP_TO_PROC memset(driver_dump_file, 0, sizeof(driver_dump_file)); snprintf(driver_dump_file, sizeof(driver_dump_file), "/proc/mwlan/"); if (handle->handle_idx) @@ -804,6 +809,15 @@ static int woal_cfg80211_subcmd_get_drv_dump(struct wiphy *wiphy, else snprintf(driver_dump_file, sizeof(driver_dump_file), "drv_dump"); +#else + memset(path_name, 0, sizeof(path_name)); + woal_create_dump_dir(handle, path_name, sizeof(path_name)); + PRINTM(MMSG, "driver dump path name is %s\n", path_name); + woal_dump_drv_info(handle, path_name); + memset(driver_dump_file, 0, sizeof(driver_dump_file)); + snprintf(driver_dump_file, sizeof(driver_dump_file), "%s/%s", path_name, + "file_drv_info"); +#endif PRINTM(MMSG, "driver dump file is %s\n", driver_dump_file); length = sizeof(driver_dump_file); skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, length); @@ -2795,7 +2809,7 @@ int woal_filter_packet(moal_private *priv, t_u8 *data, t_u32 len, unsigned long flags; ENTER(); - pkt_filter = priv->packet_filter; + pkt_filter = (packet_filter *)priv->packet_filter; if (!unlikely(pkt_filter)) { PRINTM(MINFO, "packet_filter not init\n"); goto done; @@ -3342,12 +3356,12 @@ void woal_cfg80211_rssi_monitor_event(moal_private *priv, t_s16 rssi) priv->conn_bssid) || nla_put_s8(skb, ATTR_RSSI_MONITOR_CUR_RSSI, rssi_value)) { PRINTM(MERROR, "nla_put failed!\n"); - kfree(skb); + dev_kfree_skb(skb); goto done; } woal_cfg80211_vendor_event(priv, event_rssi_monitor, (t_u8 *)skb->data, skb->len); - kfree(skb); + dev_kfree_skb(skb); done: LEAVE(); } @@ -3376,7 +3390,7 @@ void woal_cfg80211_driver_hang_event(moal_private *priv, t_u8 reload_mode) if (nla_put_u8(skb, ATTR_FW_RELOAD_MODE, reload_mode)) { PRINTM(MERROR, "woal_cfg80211_driver_hang_event: nla_put failed!\n"); - kfree(skb); + dev_kfree_skb(skb); goto done; } @@ -3386,7 +3400,7 @@ void woal_cfg80211_driver_hang_event(moal_private *priv, t_u8 reload_mode) woal_cfg80211_vendor_event(priv, event_hang, (t_u8 *)skb->data, skb->len); - kfree(skb); + dev_kfree_skb(skb); done: LEAVE(); } @@ -3917,6 +3931,57 @@ done: return ret; } +/** + * @brief vendor command to set scan band + * + * @param wiphy A pointer to wiphy struct + * @param wdev A pointer to wireless_dev struct + * @param data a pointer to data + * @param data_len data length + * + * @return 0: success <0: fail + */ +static int woal_cfg80211_subcmd_set_scan_band(struct wiphy *wiphy, + struct wireless_dev *wdev, + const void *data, int data_len) +{ + struct net_device *dev = NULL; + moal_private *priv = NULL; + struct nlattr *tb_vendor[ATTR_WIFI_MAX + 1]; + int ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!wdev || !wdev->netdev) { + LEAVE(); + return -EFAULT; + } + dev = wdev->netdev; + priv = (moal_private *)woal_get_netdev_priv(dev); + + nla_parse(tb_vendor, ATTR_WIFI_MAX, (struct nlattr *)data, data_len, + NULL +#if KERNEL_VERSION(4, 12, 0) <= CFG80211_VERSION_CODE + , + NULL +#endif + ); + if (!tb_vendor[ATTR_SCAN_BAND_SET]) { + PRINTM(MERROR, "%s: ATTR_SCAN_BAND_SET not found\n", __func__); + ret = -EFAULT; + goto done; + } + priv->scan_setband_mask = + *(u8 *)nla_data(tb_vendor[ATTR_SCAN_BAND_SET]); + PRINTM(MMSG, + "woal_cfg80211_subcmd_set_scan_band: scan_setband_mask :%d", + priv->scan_setband_mask); + +done: + LEAVE(); + return ret; +} + /** * @brief vendor command to start keep alive * @@ -4430,7 +4495,7 @@ static int woal_cfg80211_subcmd_rtt_range_cancel(struct wiphy *wiphy, t_u8 rtt_config_num = handle->rtt_params.rtt_config_num; struct nlattr *tb[ATTR_RTT_MAX + 1]; t_u32 target_num = 0; - t_u8 addr[MAX_RTT_CONFIG_NUM][MLAN_MAC_ADDR_LENGTH]; + t_u8 addr[MAX_RTT_CONFIG_NUM][MLAN_MAC_ADDR_LENGTH] = {0x00}; int i = 0, j = 0; mlan_status ret = MLAN_STATUS_SUCCESS; int err = 0; @@ -4569,7 +4634,7 @@ mlan_status woal_cfg80211_event_rtt_result(moal_private *priv, t_u8 *data, complete = *pos; nla_put(skb, ATTR_RTT_RESULT_COMPLETE, sizeof(complete), &complete); - pos++; + pos = (t_u8 *)(pos + 1); event_left_len--; while (event_left_len > sizeof(wifi_rtt_result_element)) { @@ -5256,6 +5321,13 @@ static mlan_status woal_save_csi_dump_to_file(char *dir_name, char *file_name, t_u8 format, char *name) { mlan_status ret = MLAN_STATUS_SUCCESS; +#ifndef DUMP_TO_PROC + struct file *pfile = NULL; + loff_t pos; + char dw_string[10]; + int i = 0; + t_u32 *tmp = NULL; +#endif ENTER(); if (!dir_name || !file_name || !buf) { @@ -5263,6 +5335,55 @@ static mlan_status woal_save_csi_dump_to_file(char *dir_name, char *file_name, ret = MLAN_STATUS_FAILURE; goto done; } +#ifndef DUMP_TO_PROC + snprintf(name, MAX_BUF_LEN, "%s/%s", dir_name, file_name); + pfile = filp_open(name, O_CREAT | O_RDWR | O_APPEND, 0644); + + if (IS_ERR(pfile)) { + PRINTM(MMSG, + "Create file %s error, try to save dump file in /var\n", + name); + snprintf(name, MAX_BUF_LEN, "%s/%s", "/var", file_name); + pfile = filp_open(name, O_CREAT | O_RDWR | O_APPEND, 0644); + } + if (IS_ERR(pfile)) { + PRINTM(MERROR, "Create Dump file for %s error\n", name); + ret = MLAN_STATUS_FAILURE; + goto done; + } + + PRINTM(MMSG, "Dump data %s saved in %s\n", file_name, name); + + pos = 0; + /* Save CSI dump directly to file */ + if (format == 1) { +#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE + vfs_write(pfile, (const char __user *)buf, buf_len, &pos); +#else + kernel_write(pfile, buf, buf_len, &pos); +#endif + } else { + tmp = (t_u32 *)buf; + for (i = 0; i < buf_len / 4; i++) { + if ((i + 1) % 8 == 0) + snprintf(dw_string, sizeof(dw_string), "%08x\n", + *tmp); + else + snprintf(dw_string, sizeof(dw_string), "%08x ", + *tmp); +#if KERNEL_VERSION(4, 14, 0) > LINUX_VERSION_CODE + vfs_write(pfile, (const char __user *)dw_string, 9, + &pos); +#else + kernel_write(pfile, dw_string, 9, &pos); +#endif + tmp++; + } + } + filp_close(pfile, NULL); + + PRINTM(MMSG, "Dump data saved in %s successfully\n", name); +#endif done: LEAVE(); return ret; @@ -5350,6 +5471,19 @@ static const struct wiphy_vendor_command vendor_commands[] = { #if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE .policy = woal_attr_policy, .maxattr = ATTR_WIFI_MAX, +#endif + }, + { + .info = { + .vendor_id = MRVL_VENDOR_ID, + .subcmd = sub_cmd_set_scan_band, + }, + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | + WIPHY_VENDOR_CMD_NEED_NETDEV, + .doit = woal_cfg80211_subcmd_set_scan_band, +#if KERNEL_VERSION(5, 3, 0) <= CFG80211_VERSION_CODE + .policy = woal_attr_policy, + .maxattr = ATTR_WIFI_MAX, #endif }, { diff --git a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h index bf29b69..85fa54e 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_cfg80211_util.h @@ -612,6 +612,7 @@ typedef enum wifi_attr { ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE_MAX = 8, ATTR_GET_CONCURRENCY_MATRIX_SET_SIZE = 9, ATTR_GET_CONCURRENCY_MATRIX_SET = 10, + ATTR_SCAN_BAND_SET = 11, ATTR_WIFI_AFTER_LAST, ATTR_WIFI_MAX = ATTR_WIFI_AFTER_LAST - 1 } wifi_attr_t; @@ -707,6 +708,7 @@ enum vendor_sub_command { sub_cmd_stop_keep_alive = 0x0004, sub_cmd_dfs_capability = 0x0005, sub_cmd_set_scan_mac_oui = 0x0007, + sub_cmd_set_scan_band = 0x0008, sub_cmd_set_packet_filter = 0x0011, sub_cmd_get_packet_filter_capability, sub_cmd_nd_offload = 0x0100, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_debug.c b/mxm_wifiex/wlan_src/mlinux/moal_debug.c index 1252ab5..c584624 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_debug.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_debug.c @@ -162,8 +162,6 @@ static struct debug_data items[] = { INFO_ADDR | (INTF_SD << 8)}, {"mp_invalid_update", item_size(mp_invalid_update), item_addr(mp_invalid_update), INFO_ADDR | (INTF_SD << 8)}, - {"sdio_rx_aggr", item_size(sdio_rx_aggr), item_addr(sdio_rx_aggr), - INFO_ADDR | (INTF_SD << 8)}, {"mpa_sent_last_pkt", item_size(mpa_sent_last_pkt), item_addr(mpa_sent_last_pkt), INFO_ADDR | (INTF_SD << 8)}, {"mpa_sent_no_ports", item_size(mpa_sent_no_ports), @@ -361,8 +359,6 @@ static struct debug_data uap_items[] = { INFO_ADDR | (INTF_SD << 8)}, {"mp_invalid_update", item_size(mp_invalid_update), item_addr(mp_invalid_update), INFO_ADDR | (INTF_SD << 8)}, - {"sdio_rx_aggr", item_size(sdio_rx_aggr), item_addr(sdio_rx_aggr), - INFO_ADDR | (INTF_SD << 8)}, {"mpa_sent_last_pkt", item_size(mpa_sent_last_pkt), item_addr(mpa_sent_last_pkt), INFO_ADDR | (INTF_SD << 8)}, {"mpa_sent_no_ports", item_size(mpa_sent_no_ports), diff --git a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c index 1a379a4..e2aceb6 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c @@ -450,7 +450,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[4] = {0}; + int data[8] = {0}; ENTER(); req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_11ax_cmd_cfg)); @@ -470,7 +470,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 > 4 || user_data_len == 0) { + if (user_data_len > 8 || user_data_len == 0) { PRINTM(MERROR, "Invalid parameters\n"); ret = -EFAULT; goto done; @@ -514,6 +514,20 @@ static int woal_setget_priv_11axcmdcfg(moal_private *priv, t_u8 *respbuf, cfg->sub_id = MLAN_11AXCMD_OBSS_TOLTIME_SUBID; cfg->param.toltime_cfg.tol_time = data[1]; break; + case MLAN_11AXCMD_CFG_ID_SET_BSRP: + cfg->sub_id = MLAN_11AXCMD_SET_BSRP_SUBID; + cfg->param.setbsrp_cfg.value = data[1]; + break; + case MLAN_11AXCMD_CFG_ID_LLDE: + cfg->sub_id = MLAN_11AXCMD_LLDE_SUBID; + cfg->param.llde_cfg.llde = data[1]; + cfg->param.llde_cfg.mode = data[2]; + cfg->param.llde_cfg.fixrate = data[3]; + 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]; + break; default: PRINTM(MERROR, "unknown 11axcmd\n"); ret = -EFAULT; @@ -2899,116 +2913,6 @@ done: } #endif -#if defined(UAP_SUPPORT) -#if defined(STA_CFG80211) && defined(UAP_CFG80211) -/** - * @brief easymesh uap Set/Get multi AP mode handler - * - * @param priv A pointer to moal_private structure - * @param req A pointer to ifreq structure - * @return 0 --success, otherwise fail - */ -static int woal_uap_set_multiap_mode(moal_private *priv, t_u8 *respbuf, - t_u32 respbuflen) -{ - mlan_ioctl_req *req = NULL; - mlan_ds_misc_cfg *misc = NULL; - mlan_status status = MLAN_STATUS_SUCCESS; - int mode[1] = {0}; - int ret = 0; - int header_len = 0; - int user_data_len = 0; - - ENTER(); - - if (!respbuf) { - PRINTM(MERROR, "response buffer is not available!\n"); - ret = -EINVAL; - goto done; - } - - header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_SETMODE); - user_data_len = strlen(respbuf) - header_len; - - /* Allocate an IOCTL request buffer */ - req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); - if (req == NULL) { - ret = -ENOMEM; - goto done; - } - - /* Fill request buffer */ - misc = (mlan_ds_misc_cfg *)req->pbuf; - misc->sub_command = MLAN_OID_MISC_MULTI_AP_CFG; - req->req_id = MLAN_IOCTL_MISC_CFG; - - if ((int)strlen(respbuf) == header_len) { - /* GET operation */ - user_data_len = 0; - req->action = MLAN_ACT_GET; - } else { - /* SET operation */ - parse_arguments(respbuf + header_len, mode, ARRAY_SIZE(mode), - &user_data_len); - if (user_data_len > 1) { - PRINTM(MERROR, "Invalid number of args!\n"); - ret = -EINVAL; - goto done; - } - if ((mode[0] != EASY_MESH_MULTI_AP_BSS_MODE_3) && - (mode[0] != EASY_MESH_MULTI_AP_BSS_MODE_2) && - (mode[0] != EASY_MESH_MULTI_AP_BSS_MODE_1)) { - PRINTM(MERROR, "Invalid setmode value\n"); - ret = -EINVAL; - goto done; - } - - if (mode[0] == EASY_MESH_MULTI_AP_BSS_MODE_3) - /* Supports backhaul and fronthaul BSS */ - priv->multi_ap_flag = EASY_MESH_MULTI_AP_BH_AND_FH_BSS; - else if (mode[0] == EASY_MESH_MULTI_AP_BSS_MODE_2) - /* Supports backhaul BSS */ - priv->multi_ap_flag = EASY_MESH_MULTI_AP_BH_BSS; - else if (mode[0] == EASY_MESH_MULTI_AP_BSS_MODE_1) - /* Supports fronthaul BSS */ - priv->multi_ap_flag = EASY_MESH_MULTI_AP_FH_BSS; - PRINTM(MINFO, "[EM:%s:%d] priv->multi_ap_flag 0x%x\n", __func__, - __LINE__, priv->multi_ap_flag); - - req->action = MLAN_ACT_SET; - } - - /* Send IOCTL request to MLAN */ - status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); - if (status != MLAN_STATUS_SUCCESS) { - ret = -EFAULT; - goto done; - } - - if (req->action == MLAN_ACT_GET) { - if (priv->multi_ap_flag == EASY_MESH_MULTI_AP_BH_AND_FH_BSS) - mode[0] = EASY_MESH_MULTI_AP_BSS_MODE_3; - else if (priv->multi_ap_flag == EASY_MESH_MULTI_AP_BH_BSS) - mode[0] = EASY_MESH_MULTI_AP_BSS_MODE_2; - else if (priv->multi_ap_flag == EASY_MESH_MULTI_AP_FH_BSS) - mode[0] = EASY_MESH_MULTI_AP_BSS_MODE_1; - - PRINTM(MINFO, "[EM:%s:%d] setmode to 0x%x\n", __func__, - __LINE__, mode[0]); - moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)mode, - sizeof(mode), respbuflen); - ret = sizeof(mode); - } -done: - if (status != MLAN_STATUS_PENDING) - kfree(req); - - LEAVE(); - return ret; -} -#endif -#endif - #ifdef WIFI_DIRECT_SUPPORT #if defined(STA_SUPPORT) && defined(UAP_SUPPORT) /** @@ -3401,6 +3305,110 @@ done: } #endif +/* + * @brief Set/Get reorder flush time + * + * @param priv A pointer to moal_private structure + * @param action Action set or get + * @param data A pointer to the data buf + * + * @return MLAN_STATUS_SUCCESS/MLAN_STATUS_PENDING -- + * success, otherwise fail + */ +static mlan_status woal_set_get_reorder_flush_time(moal_private *priv, + t_u32 action, int *data) +{ + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + mlan_status ret = MLAN_STATUS_SUCCESS; + + ENTER(); + + /* Allocate an IOCTL request buffer */ + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = MLAN_STATUS_FAILURE; + goto done; + } + + /* Fill request buffer */ + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_REORDER_FLUSH_TIME; + req->req_id = MLAN_IOCTL_MISC_CFG; + req->action = action; + + if (action == MLAN_ACT_SET) { + misc->param.flush_time.flush_time_ac_be_bk = (t_u16)data[0]; + misc->param.flush_time.flush_time_ac_vi_vo = (t_u16)data[1]; + } + + /* Send IOCTL request to MLAN */ + ret = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); + if (ret == MLAN_STATUS_SUCCESS) { + data[0] = misc->param.flush_time.flush_time_ac_be_bk; + data[1] = misc->param.flush_time.flush_time_ac_vi_vo; + } +done: + if (ret != MLAN_STATUS_PENDING) + kfree(req); + LEAVE(); + return ret; +} + +/** + * @brief Set/Get AMPDU reordering flush time configurations + * + * @param priv A pointer to moal_private structure + * @param respbuf A pointer to response buffer + * @param respbuflen Available length of response buffer + * + * @return Number of bytes written, negative for failure. + */ +static int woal_priv_set_get_reorder_flush_time(moal_private *priv, + t_u8 *respbuf, t_u32 respbuflen) +{ + t_u32 data[2]; + int ret = 0; + int user_data_len = 0; + t_u8 action; + + ENTER(); + + if (strlen(respbuf) == + (strlen(CMD_NXP) + strlen(PRIV_CMD_REORDER_FLUSH_TIME))) { + /* GET operation */ + user_data_len = 0; + } else { + /* SET operation */ + memset((char *)data, 0, sizeof(data)); + parse_arguments(respbuf + strlen(CMD_NXP) + + strlen(PRIV_CMD_REORDER_FLUSH_TIME), + data, ARRAY_SIZE(data), &user_data_len); + } + + if (user_data_len >= 3) { + PRINTM(MERROR, "Too many arguments\n"); + ret = -EINVAL; + goto done; + } + + if (user_data_len == 0) + action = MLAN_ACT_GET; + else + action = MLAN_ACT_SET; + + if (MLAN_STATUS_SUCCESS != + woal_set_get_reorder_flush_time(priv, action, data)) { + ret = -EFAULT; + goto done; + } + sprintf(respbuf, "BE/BK=%d VI/VO=%d", data[0], data[1]); + ret = strlen(respbuf) + 1; +done: + LEAVE(); + return ret; +} + /** * @brief Set/Get deep sleep mode configurations * @@ -5545,8 +5553,6 @@ static int woal_priv_set_get_usbaggrctrl(moal_private *priv, t_u8 *respbuf, if (cardp->rx_data_list[i].urb) { usb_kill_urb( cardp->rx_data_list[i].urb); - usb_init_urb( - cardp->rx_data_list[i].urb); } } } @@ -10639,7 +10645,7 @@ done: static int woal_priv_inactivity_timeout_ext(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen) { - int data[4]; + int data[5]; mlan_ioctl_req *req = NULL; mlan_ds_pm_cfg *pmcfg = NULL; pmlan_ds_inactivity_to inac_to = NULL; @@ -10660,7 +10666,8 @@ static int woal_priv_inactivity_timeout_ext(moal_private *priv, t_u8 *respbuf, &user_data_len); } - if (user_data_len != 0 && user_data_len != 3 && user_data_len != 4) { + if (user_data_len != 0 && user_data_len != 3 && user_data_len != 4 && + user_data_len != 5) { PRINTM(MERROR, "Invalid number of parameters\n"); ret = -EINVAL; goto done; @@ -10689,6 +10696,8 @@ static int woal_priv_inactivity_timeout_ext(moal_private *priv, t_u8 *respbuf, inac_to->mcast_timeout = data[2]; if (user_data_len == 4) inac_to->ps_entry_timeout = data[3]; + if (user_data_len == 5) + inac_to->ps_cmd_timeout = data[4]; req->action = MLAN_ACT_SET; status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); @@ -10701,6 +10710,7 @@ static int woal_priv_inactivity_timeout_ext(moal_private *priv, t_u8 *respbuf, data[1] = inac_to->unicast_timeout; data[2] = inac_to->mcast_timeout; data[3] = inac_to->ps_entry_timeout; + data[4] = inac_to->ps_cmd_timeout; moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)data, sizeof(data), respbuflen); @@ -12072,9 +12082,11 @@ static int woal_channel_switch(moal_private *priv, t_u8 block_tx, priv->phandle->chsw_wait_q_woken = MFALSE; /* wait for channel switch to complete */ - wait_event_interruptible_timeout( - priv->phandle->chsw_wait_q, priv->phandle->chsw_wait_q_woken, - (u32)HZ * (switch_count + 2) * 110 / 1000); + if (!wait_event_interruptible_timeout(priv->phandle->chsw_wait_q, + priv->phandle->chsw_wait_q_woken, + (u32)HZ * (switch_count + 2) * + 110 / 1000)) + PRINTM(MMSG, "chsw_wait_q failed to wakeup\n"); pcust_chansw_ie->ie_index = 0xffff; /*Auto index */ pcust_chansw_ie->mgmt_subtype_mask = 0; @@ -12159,8 +12171,9 @@ static void woal_get_dfs_chan_list(moal_private *priv) sband = wiphy->bands[NL80211_BAND_5GHZ]; if (sband) { for (i = 0; i < sband->n_channels; i++) { - if (sband->channels[i].flags & - IEEE80211_CHAN_RADAR) { + if ((sband->channels[i].flags & + IEEE80211_CHAN_RADAR) && + (priv->auto_dfs_cfg.num_of_chan <= 0xFF)) { priv->auto_dfs_cfg.dfs_chan_list [priv->auto_dfs_cfg.num_of_chan] = sband->channels[i].hw_value; @@ -13305,7 +13318,7 @@ 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_CARDIW62X(priv->phandle->card_type)) { + IS_CARDIW624(priv->phandle->card_type)) { woal_cfg80211_notify_antcfg( priv, priv->phandle->wiphy, radio); } @@ -14387,7 +14400,7 @@ static int woal_priv_robustcoex(moal_private *priv, t_u8 *respbuf, robust_coex_cfg = (mlan_ds_misc_cfg *)req->pbuf; while (respbuf[0] == ' ') { /** skip space */ - respbuf++; + respbuf = (t_u8 *)(respbuf + 1); } if (strncmp(respbuf, "gpiocfg", strlen("gpiocfg")) == 0) { @@ -16852,6 +16865,79 @@ done: return ret; } +/** + * @brief Set the new CSA parameter for target channel and backup + * channel + * + * @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_channel_switch_param(moal_private *priv, t_u8 *respbuf, + t_u32 respbuflen) +{ + int ret = 0; + int user_data_len = 0; + int data[2] = {0}; + + ENTER(); + + if (!priv || !priv->phandle || (priv->bss_role != MLAN_BSS_ROLE_UAP)) { + PRINTM(MERROR, + "priv or handle is null or interface is not AP/GO\n"); + ret = -EFAULT; + LEAVE(); + return ret; + } + + if (strlen(respbuf) == + (strlen(CMD_NXP) + strlen(PRIV_CMD_SET_CHAN_SWITCH_PARAM))) { + /* GET operation */ + respbuf[0] = priv->chan_mode; + respbuf[1] = priv->chan_num_pkts; + ret = 2; + goto done; + } else { + parse_arguments(respbuf + strlen(CMD_NXP) + + strlen(PRIV_CMD_SET_CHAN_SWITCH_PARAM), + data, ARRAY_SIZE(data), &user_data_len); + } + + if (sizeof(int) * user_data_len > sizeof(data)) { + PRINTM(MERROR, "Too many arguments\n"); + ret = -EINVAL; + LEAVE(); + return ret; + } + if (user_data_len < 2) { + PRINTM(MERROR, "Too few arguments\n"); + ret = -EINVAL; + LEAVE(); + return ret; + } + + if (data[0] && (data[0] < 0 || data[0] > 3)) { + PRINTM(MERROR, + "Wrong channel switch parameter for ucast action frame!\n"); + ret = -EINVAL; + goto done; + } + + if (!data[0] && (data[1] < 0 || data[1] > MAX_NUM_PKTS)) { + PRINTM(MERROR, "Bcast action frame count exceeds maximum %d!\n", + MAX_NUM_PKTS); + ret = -EINVAL; + goto done; + } + priv->chan_mode = data[0] & DEFAULT_CHAN_MODE_MASK; + priv->chan_num_pkts = data[1]; +done: + LEAVE(); + return ret; +} + /** * @brief P2P extended channel switch * @@ -18684,6 +18770,222 @@ done: return ret; } +/** + * @brief Set/Get NAV mitigation config parameters + * + * @param priv A pointer to moal_private structure + * @param respbuf A pointer to response buffer + * @param respbuflen Available length of response buffer + * + * @return Number of bytes written, negative for failure. + */ +static int woal_priv_nav_mitigation(moal_private *priv, t_u8 *respbuf, + t_u32 respbuflen) +{ + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + int ret = 0; + int data[4] = {0}; + int header_len = 0, user_data_len = 0; + mlan_status status = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!respbuf) { + PRINTM(MERROR, "response buffer is not available!\n"); + ret = -EINVAL; + goto done; + } + header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_NAV_MITIGATION); + user_data_len = strlen(respbuf) - header_len; + + /* Allocate an IOCTL request buffer */ + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = -ENOMEM; + goto done; + } + + /* Fill request buffer */ + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_NAV_MITIGATION; + req->req_id = MLAN_IOCTL_MISC_CFG; + if ((int)strlen(respbuf) == header_len) { + /* GET operation */ + user_data_len = 0; + req->action = MLAN_ACT_GET; + } else { + /* SET operation */ + parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data), + &user_data_len); + if (user_data_len > 2 || + (user_data_len == 1 && data[0] != MFALSE)) { + PRINTM(MERROR, "Invalid number of args!\n"); + ret = -EINVAL; + goto done; + } + + misc->param.nav_mitigation.start_nav_mitigation = data[0]; + if (data[0] == MTRUE) + misc->param.nav_mitigation.threshold = data[1]; + else + misc->param.nav_mitigation.threshold = 0; + + // Not used for MLAN_ACT_SET, Set to 0 + misc->param.nav_mitigation.detect_cnt = 0; + misc->param.nav_mitigation.stop_cnt = 0; + req->action = MLAN_ACT_SET; + } + /* Send IOCTL request to MLAN */ + status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + + if (req->action == MLAN_ACT_GET) { + data[0] = misc->param.nav_mitigation.start_nav_mitigation; + data[1] = misc->param.nav_mitigation.threshold; + data[2] = misc->param.nav_mitigation.detect_cnt; + data[3] = misc->param.nav_mitigation.stop_cnt; + moal_memcpy_ext(priv->phandle, respbuf, (t_u8 *)data, + sizeof(data), respbuflen); + } + ret = sizeof(data); +done: + if (status != MLAN_STATUS_PENDING) + kfree(req); + + LEAVE(); + return ret; +} + +/** + * @brief Set/Get LED config parameters + * + * @param priv A pointer to moal_private structure + * @param respbuf A pointer to response buffer + * @param respbuflen Available length of response buffer + * + * @return Number of bytes written, negative for failure. + */ +static int woal_priv_led(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen) +{ + mlan_ioctl_req *req = NULL; + mlan_ds_misc_cfg *misc = NULL; + int ret = 0, config_count = 0, i = 0, j = 0; + int data[25] = {0}; + int header_len = 0, user_data_len = 0; + mlan_status status = MLAN_STATUS_SUCCESS; + + ENTER(); + + if (!respbuf) { + PRINTM(MERROR, "response buffer is not available!\n"); + ret = -EINVAL; + goto done; + } + header_len = strlen(CMD_NXP) + strlen(PRIV_CMD_LED); + user_data_len = strlen(respbuf) - header_len; + + /* Allocate an IOCTL request buffer */ + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); + if (req == NULL) { + ret = -ENOMEM; + goto done; + } + /* Fill request buffer */ + memset(req->pbuf, 0, sizeof(mlan_ds_misc_cfg)); + misc = (mlan_ds_misc_cfg *)req->pbuf; + misc->sub_command = MLAN_OID_MISC_LED_CONFIG; + req->req_id = MLAN_IOCTL_MISC_CFG; + + if ((int)strlen(respbuf) == header_len) { + /* GET operation */ + user_data_len = 0; + req->action = MLAN_ACT_GET; + } else { + /* SET operation */ + parse_arguments(respbuf + header_len, data, ARRAY_SIZE(data), + &user_data_len); + + req->action = MLAN_ACT_SET; + misc->param.led_config.enable = data[0]; + misc->param.led_config.led_cfg_len = 0; + if (user_data_len > 1) { + /* Calculate the number of LED config passed */ + i = 1; + while (i < user_data_len) { + if (data[i + 1] < 5) + i += 2; + else + i += 4; + config_count++; + } + misc->param.led_config.led_cfg_len = config_count; + + j = 1; + i = 0; + while (i < config_count && j < user_data_len) { + if (data[j + 1] < 5) { + misc->param.led_config.misc_led_behvr[i] + .firmwarestate = data[j]; + misc->param.led_config.misc_led_behvr[i] + .ledstate = data[j + 1]; + misc->param.led_config.misc_led_behvr[i] + .ledargs = 0x0000; // keep empty + j += 2; + } else { + if (data[j + 3] > 4) { + PRINTM(MERROR, + "Invalid value passed for Duty cycle index %d!\n", + data[j + 3]); + ret = -EINVAL; + } + misc->param.led_config.misc_led_behvr[i] + .firmwarestate = data[j]; + misc->param.led_config.misc_led_behvr[i] + .ledstate = data[j + 1]; + misc->param.led_config.misc_led_behvr[i] + .ledargs = + (((data[j + 3] & 0x0F) << 4) | + (data[j + 2] & 0x0F)); + j += 4; + } + i++; + } + } + } + /* Send IOCTL request to MLAN */ + status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); + if (status != MLAN_STATUS_SUCCESS) { + ret = -EFAULT; + goto done; + } + + if (req->action == MLAN_ACT_GET) { + respbuf[0] = misc->param.led_config.enable; + if (misc->param.led_config.enable == 1) { + moal_memcpy_ext( + priv->phandle, &respbuf[1], + (t_u8 *)misc->param.led_config.misc_led_behvr, + (MAX_FW_STATES * + sizeof(mlan_ds_misc_led_behavior)), + respbuflen); + ret = ((MAX_FW_STATES * + sizeof(mlan_ds_misc_led_behavior)) + + 1); + } else + ret = 1; + } +done: + if (status != MLAN_STATUS_PENDING) + kfree(req); + + LEAVE(); + return ret; +} + /** * @brief Enable/Disable Un-associated Dot11mc FTM Frame exchanges * @@ -19732,16 +20034,6 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) priv_cmd.total_len); goto handled; #endif -#if defined(UAP_SUPPORT) -#if defined(STA_CFG80211) && defined(UAP_CFG80211) - } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_SETMODE, - strlen(PRIV_CMD_SETMODE)) == 0) { - /* Set multi_ap mode */ - len = woal_uap_set_multiap_mode(priv, buf, - priv_cmd.total_len); - goto handled; -#endif -#endif #ifdef WIFI_DIRECT_SUPPORT #if defined(STA_SUPPORT) && defined(UAP_SUPPORT) } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_BSSROLE, @@ -19791,6 +20083,13 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_setgetdeepsleep(priv, buf, priv_cmd.total_len); goto handled; + } else if (strnicmp(buf + strlen(CMD_NXP), + PRIV_CMD_REORDER_FLUSH_TIME, + strlen(PRIV_CMD_REORDER_FLUSH_TIME)) == 0) { + /* reorder flush time */ + len = woal_priv_set_get_reorder_flush_time( + priv, buf, priv_cmd.total_len); + goto handled; } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_IPADDR, strlen(PRIV_CMD_IPADDR)) == 0) { /* IP address */ @@ -19981,6 +20280,18 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_rx_abort_cfg_ext(priv, buf, priv_cmd.total_len); goto handled; + } else if (strnicmp(buf + strlen(CMD_NXP), + PRIV_CMD_NAV_MITIGATION, + strlen(PRIV_CMD_NAV_MITIGATION)) == 0) { + /* dconfigure nav mitigate */ + len = woal_priv_nav_mitigation(priv, buf, + priv_cmd.total_len); + goto handled; + } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_LED, + strlen(PRIV_CMD_LED)) == 0) { + /* dconfigure nav mitigate */ + len = woal_priv_led(priv, buf, priv_cmd.total_len); + goto handled; } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_RX_ABORT_CFG, strlen(PRIV_CMD_RX_ABORT_CFG)) == 0) { @@ -20750,6 +21061,14 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_extend_channel_switch( priv, buf, priv_cmd.total_len); goto handled; + } else if (strnicmp(buf + strlen(CMD_NXP), + PRIV_CMD_SET_CHAN_SWITCH_PARAM, + strlen(PRIV_CMD_SET_CHAN_SWITCH_PARAM)) == + 0) { + /* set CSA/ECSA parameters */ + len = woal_priv_set_channel_switch_param( + priv, buf, priv_cmd.total_len); + goto handled; #endif } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_DYN_BW, strlen(PRIV_CMD_DYN_BW)) == 0) { @@ -21118,6 +21437,12 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-CONFIG", strlen("BGSCAN-CONFIG")) == 0) { +#ifdef STA_CFG80211 +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME)) + goto done; +#endif +#endif if (MLAN_STATUS_SUCCESS != woal_set_bg_scan(priv, buf, priv_cmd.total_len)) { ret = -EFAULT; @@ -21127,6 +21452,13 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) priv->bg_scan_reported = MFALSE; len = snprintf(buf, CMD_BUF_LEN, "OK\n") + 1; } else if (strncmp(buf, "BGSCAN-STOP", strlen("BGSCAN-STOP")) == 0) { +#ifdef STA_CFG80211 +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME)) + goto done; +#endif +#endif + if (priv->bg_scan_start && !priv->scan_cfg.rssi_threshold) { if (MLAN_STATUS_FAILURE == woal_stop_bg_scan(priv, MOAL_NO_WAIT)) { diff --git a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h index 9eca736..6b1dc2c 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h @@ -82,9 +82,6 @@ Change log: #define PRIV_CMD_GET_STA_LIST "getstalist" #define PRIV_CMD_BSS_CONFIG "bssconfig" #endif -#if defined(UAP_SUPPORT) -#define PRIV_CMD_SETMODE "setmode" -#endif #ifdef WIFI_DIRECT_SUPPORT #if defined(STA_SUPPORT) && defined(UAP_SUPPORT) #define PRIV_CMD_BSSROLE "bssrole" @@ -103,6 +100,8 @@ typedef struct _chan_stats { #define PRIV_CMD_EXTCAPCFG "extcapcfg" #define PRIV_CMD_CANCELSCAN "cancelscan" #endif +#define PRIV_CMD_REORDER_FLUSH_TIME "flush_time" + #define PRIV_CMD_DEEPSLEEP "deepsleep" #define PRIV_CMD_IPADDR "ipaddr" #define PRIV_CMD_WPSSESSION "wpssession" @@ -274,6 +273,7 @@ typedef struct _chan_stats { #define PRIV_CMD_GET_CFG_CHAN_LIST "getcfgchanlist" #if defined(UAP_SUPPORT) #define PRIV_CMD_EXTEND_CHAN_SWITCH "channel_switch" +#define PRIV_CMD_SET_CHAN_SWITCH_PARAM "chanswitch_param" #endif #define PRIV_CMD_TDLS_IDLE_TIME "tdls_idle_time" @@ -310,6 +310,9 @@ typedef struct _chan_stats { #define PRIV_CMD_OFDM_DESENSE_CFG "ofdm_desense_cfg" /**Private command to configure dynamic rx abort config */ #define PRIV_CMD_RX_ABORT_CFG_EXT "rx_abort_cfg_ext" +/** configure NAV mitigation parameters. */ +#define PRIV_CMD_NAV_MITIGATION "nav_mitigation" +#define PRIV_CMD_LED "led" #define TX_AMPDU_RTS_CTS 0 #define TX_AMPDU_CTS_2_SELF 1 #define TX_AMPDU_DISABLE_PROTECTION 2 diff --git a/mxm_wifiex/wlan_src/mlinux/moal_init.c b/mxm_wifiex/wlan_src/mlinux/moal_init.c index 0ce0adb..7038666 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_init.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_init.c @@ -275,7 +275,6 @@ static int indrstcfg = 0xffffffff; #define DEFAULT_DEV_CAP_MASK 0xffffffff static t_u32 dev_cap_mask = DEFAULT_DEV_CAP_MASK; #ifdef SDIO -static int sdio_rx_aggr = MTRUE; #endif /** The global variable of scan beacon buffer **/ @@ -343,8 +342,8 @@ static card_type_entry card_type_map_tbl[] = { #ifdef SD9177 {CARD_TYPE_SD9177, 0, CARD_SD9177}, #endif -#ifdef SDIW62X - {CARD_TYPE_SDIW62X, 0, CARD_SDIW62X}, +#ifdef SDIW624 + {CARD_TYPE_SDIW624, 0, CARD_SDIW624}, #endif {CARD_TYPE_SDAW693, 0, CARD_SDAW693}, #ifdef PCIE8897 @@ -360,8 +359,8 @@ static card_type_entry card_type_map_tbl[] = { {CARD_TYPE_PCIE9098, 0, CARD_PCIE9098}, #endif {CARD_TYPE_PCIEAW693, 0, CARD_PCIEAW693}, -#ifdef PCIEIW62X - {CARD_TYPE_PCIEIW62X, 0, CARD_PCIEIW62X}, +#ifdef PCIEIW624 + {CARD_TYPE_PCIEIW624, 0, CARD_PCIEIW624}, #endif #ifdef USB8801 {CARD_TYPE_USB8801, 0, CARD_USB8801}, @@ -382,8 +381,8 @@ static card_type_entry card_type_map_tbl[] = { #ifdef USB9097 {CARD_TYPE_USB9097, 0, CARD_USB9097}, #endif -#ifdef USBIW62X - {CARD_TYPE_USBIW62X, 0, CARD_USBIW62X}, +#ifdef USBIW624 + {CARD_TYPE_USBIW624, 0, CARD_USBIW624}, #endif }; @@ -1078,20 +1077,6 @@ static mlan_status parse_cfg_read_block(t_u8 *data, t_u32 size, PRINTM(MMSG, "dev_cap_mask=%d\n", params->dev_cap_mask); } #ifdef SDIO - else if (strncmp(line, "sdio_rx_aggr", - strlen("sdio_rx_aggr")) == 0) { - if (parse_line_read_int(line, &out_data) != - MLAN_STATUS_SUCCESS) - goto err; - if (out_data) - moal_extflg_set(handle, EXT_SDIO_RX_AGGR); - else - moal_extflg_clear(handle, EXT_SDIO_RX_AGGR); - PRINTM(MMSG, "sdio_rx_aggr %s\n", - moal_extflg_isset(handle, EXT_SDIO_RX_AGGR) ? - "on" : - "off"); - } #endif else if (strncmp(line, "pmic", strlen("pmic")) == 0) { if (parse_line_read_int(line, &out_data) != @@ -1704,8 +1689,6 @@ static void woal_setup_module_param(moal_handle *handle, moal_mod_para *params) if (params) handle->params.dev_cap_mask = params->dev_cap_mask; #ifdef SDIO - if (sdio_rx_aggr) - moal_extflg_set(handle, EXT_SDIO_RX_AGGR); #endif if (pmic) moal_extflg_set(handle, EXT_PMIC); @@ -2484,7 +2467,7 @@ mlan_status woal_init_module_param(moal_handle *handle) } PRINTM(MMSG, "%s: init module param from usr cfg\n", card_type_map_tbl[i].name); - size = handle->param_data->size; + size = (t_u32)handle->param_data->size; data = (t_u8 *)handle->param_data->data; while ((int)parse_cfg_get_line(data, size, line) != -1) { if (line[0] == '#') @@ -2762,9 +2745,6 @@ MODULE_PARM_DESC(amsdu_deaggr, "0: default; 1: Try to avoid buf copy in amsud deaggregation"); #ifdef SDIO -module_param(sdio_rx_aggr, int, 0); -MODULE_PARM_DESC(sdio_rx_aggr, - "1: Enable SDIO rx aggr; 0: Disable SDIO rx aggr"); #endif module_param(pmic, int, 0); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c b/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c index 8a98b31..710ac0f 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c @@ -1211,7 +1211,10 @@ void woal_check_mc_connection(moal_private *priv, t_u8 wait_option, #endif t_u16 enable = 0; - woal_mc_policy_cfg(priv, &enable, wait_option, MLAN_ACT_GET); + if (woal_mc_policy_cfg(priv, &enable, wait_option, MLAN_ACT_GET)) { + PRINTM(MERROR, "Get multi-channel policy failed\n"); + } + if (!enable) return; #ifdef UAP_SUPPORT @@ -3643,7 +3646,9 @@ mlan_status woal_cancel_hs(moal_private *priv, t_u8 wait_option) if (priv->phandle->fw_roam_enable == ROAM_OFFLOAD_WITH_BSSID || priv->phandle->fw_roam_enable == ROAM_OFFLOAD_WITH_SSID || priv->phandle->fw_roam_enable == AUTO_RECONNECT) - woal_config_fw_roaming(priv, ROAM_OFFLOAD_RESUME_CFG, NULL); + if (woal_config_fw_roaming(priv, ROAM_OFFLOAD_RESUME_CFG, NULL)) + PRINTM(MERROR, + "config fw roaming ROAM_OFFLOAD_RESUME_CFG failed\n"); #ifdef STA_CFG80211 if (priv->phandle->fw_roam_enable == AUTO_RECONNECT) woal_set_clear_pmk(priv, MLAN_ACT_CLEAR); @@ -3719,12 +3724,16 @@ static int woal_set_fw_roaming_params(moal_private *priv) #endif /*Enable fw roaming*/ - woal_config_fw_roaming(priv, ROAM_OFFLOAD_ENABLE, NULL); + if (woal_config_fw_roaming(priv, ROAM_OFFLOAD_ENABLE, NULL)) + PRINTM(MERROR, + "config fw roaming ROAM_OFFLOAD_ENABLE failed\n"); /*Download fw roaming parameters*/ - woal_config_fw_roaming(priv, ROAM_OFFLOAD_PARAM_CFG, - &priv->phandle->fw_roam_params); + if (woal_config_fw_roaming(priv, ROAM_OFFLOAD_PARAM_CFG, + &priv->phandle->fw_roam_params)) + PRINTM(MERROR, + "config fw roaming ROAM_OFFLOAD_PARAM_CFG failed\n"); - /*Download userset passphrase key and current connection's PMK*/ + /*Download userset passphrase key and current connection's PMK*/ #ifdef STA_CFG80211 if (!priv->phandle->fw_roam_params.userset_passphrase) { woal_set_clear_pmk(priv, MLAN_ACT_SET); @@ -3761,7 +3770,10 @@ static int woal_set_fw_roaming_params(moal_private *priv) } #endif /*Set userset to mlan adapter*/ - woal_config_fw_roaming(priv, ROAM_OFFLOAD_ENABLE, &roam_offload_cfg); + if (woal_config_fw_roaming(priv, ROAM_OFFLOAD_ENABLE, + &roam_offload_cfg)) + PRINTM(MERROR, + "config fw roaming ROAM_OFFLOAD_ENABLE failed\n"); status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); if (status != MLAN_STATUS_SUCCESS) { @@ -3953,7 +3965,10 @@ int woal_enable_hs(moal_private *priv) if (handle->fw_roam_enable == ROAM_OFFLOAD_WITH_BSSID || handle->fw_roam_enable == ROAM_OFFLOAD_WITH_SSID || handle->fw_roam_enable == AUTO_RECONNECT) { - woal_config_fw_roaming(priv, ROAM_OFFLOAD_SUSPEND_CFG, NULL); + if (woal_config_fw_roaming(priv, ROAM_OFFLOAD_SUSPEND_CFG, + NULL)) + PRINTM(MERROR, + "config fw roaming ROAM_OFFLOAD_SUSPEND_CFG failed\n"); #ifdef STA_CFG80211 if (priv->phandle->fw_roam_enable == AUTO_RECONNECT) woal_set_clear_pmk(priv, MLAN_ACT_SET); @@ -4069,7 +4084,8 @@ int woal_enable_hs(moal_private *priv) #ifdef SDIO_SUSPEND_RESUME else if (IS_SD(handle->card_type)) { handle->suspend_fail = MTRUE; - woal_get_pm_info(priv, &pm_info); + if (woal_get_pm_info(priv, &pm_info)) + PRINTM(MCMND, "get pm info failed\n"); if (pm_info.is_suspend_allowed == MTRUE) { #ifdef MMC_PM_FUNC_SUSPENDED woal_wlan_is_suspended(priv->phandle); @@ -6084,9 +6100,9 @@ mlan_status woal_cancel_scan(moal_private *priv, t_u8 wait_option) } spin_unlock_irqrestore(&handle->scan_req_lock, flags); #endif - /* add 10ms delay, incase firmware delay 0x7f event after scan cancel + /* add 300ms delay, incase firmware delay 0x7f event after scan cancel * command response */ - woal_sched_timeout(10); + woal_sched_timeout(300); handle->scan_priv = NULL; done: if (ret != MLAN_STATUS_PENDING) @@ -7537,8 +7553,6 @@ mlan_status woal_usb_aggr_init(moal_handle *handle) if (cardp->rx_data_list[i].urb) { usb_kill_urb( cardp->rx_data_list[i].urb); - usb_init_urb( - cardp->rx_data_list[i].urb); } } } @@ -7609,48 +7623,6 @@ done: return status; } -#if defined(STA_CFG80211) || defined(UAP_CFG80211) -/** - * @brief Set multi ap flag to mlan layer - * - * @param priv A pointer to moal_private structure - * @param wait_option wait_option of ioctl - * @param flag multi ap flag - * - * @return MLAN_STATUS_SUCCESS -- success, otherwise fail - */ -mlan_status woal_multi_ap_cfg(moal_private *priv, t_u8 wait_option, t_u8 flag) -{ - mlan_status status = MLAN_STATUS_SUCCESS; - mlan_ioctl_req *req = NULL; - mlan_ds_misc_cfg *cfg = NULL; - - ENTER(); - - 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->param.multi_ap_flag = flag; - cfg->sub_command = MLAN_OID_MISC_MULTI_AP_CFG; - req->req_id = MLAN_IOCTL_MISC_CFG; - req->action = MLAN_ACT_SET; - - status = woal_request_ioctl(priv, req, wait_option); - if (status != MLAN_STATUS_SUCCESS) - goto done; - -done: - if (status != MLAN_STATUS_PENDING) - kfree(req); - LEAVE(); - return status; -} -#endif - /** * @brief Set hotspot configuration value to mlan layer * diff --git a/mxm_wifiex/wlan_src/mlinux/moal_main.c b/mxm_wifiex/wlan_src/mlinux/moal_main.c index 0cee5e1..46c0647 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_main.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_main.c @@ -126,6 +126,7 @@ static struct _card_info card_info_SD8801 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 0, + .host_mlme_required = 0, }; #endif #ifdef SD8887 @@ -162,6 +163,7 @@ static struct _card_info card_info_SD8887 = { #endif .sniffer_support = 0, .per_pkt_cfg_support = 0, + .host_mlme_required = 0, }; #endif @@ -198,6 +200,7 @@ static struct _card_info card_info_SD8897 = { #endif .sniffer_support = 0, .per_pkt_cfg_support = 0, + .host_mlme_required = 0, }; #endif @@ -218,6 +221,7 @@ static struct _card_info card_info_PCIE8897 = { .fw_name_wlan = PCIE8897_DEFAULT_WLAN_FW_NAME, .sniffer_support = 0, .per_pkt_cfg_support = 0, + .host_mlme_required = 0, }; #endif @@ -237,6 +241,7 @@ static struct _card_info card_info_USB8897 = { .fw_name_wlan = USB8897_DEFAULT_WLAN_FW_NAME, .sniffer_support = 0, .per_pkt_cfg_support = 0, + .host_mlme_required = 0, }; #endif @@ -276,6 +281,7 @@ static struct _card_info card_info_SD8977 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -315,6 +321,7 @@ static struct _card_info card_info_SD8978 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -354,6 +361,7 @@ static struct _card_info card_info_SD8997 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -394,6 +402,7 @@ static struct _card_info card_info_SD9098 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -434,11 +443,12 @@ static struct _card_info card_info_SD9097 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif -#ifdef SDIW62X -static struct _card_info card_info_SDIW62X = { +#ifdef SDIW624 +static struct _card_info card_info_SDIW624 = { .embedded_supp = 1, .drcs = 1, .go_noa = 1, @@ -453,8 +463,8 @@ static struct _card_info card_info_SDIW62X = { .rev_id_reg = 0xc8, .host_strap_reg = 0xf4, .magic_reg = 0xf0, - .fw_name = SDIW62X_DEFAULT_COMBO_FW_NAME, - .fw_name_wlan = SDIW62X_DEFAULT_WLAN_FW_NAME, + .fw_name = SDIW624_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = SDIW624_DEFAULT_WLAN_FW_NAME, #ifdef SDIO .dump_fw_info = DUMP_FW_SDIO_V3, .dump_fw_ctrl_reg = 0xf9, @@ -474,6 +484,7 @@ static struct _card_info card_info_SDIW62X = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -513,6 +524,7 @@ static struct _card_info card_info_SDAW693 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #ifdef SD9177 @@ -552,6 +564,7 @@ static struct _card_info card_info_SD9177 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -574,6 +587,7 @@ static struct _card_info card_info_PCIE8997 = { .fw_name_wlan = PCIE8997_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -599,6 +613,7 @@ static struct _card_info card_info_PCIE9097 = { .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -624,11 +639,12 @@ static struct _card_info card_info_PCIE9098 = { .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif -#ifdef PCIEIW62X -static struct _card_info card_info_PCIEIW62X = { +#ifdef PCIEIW624 +static struct _card_info card_info_PCIEIW624 = { .embedded_supp = 1, .drcs = 1, .go_noa = 1, @@ -644,12 +660,13 @@ static struct _card_info card_info_PCIEIW62X = { .host_strap_reg = 0x1c70, .magic_reg = 0x1c74, .boot_mode_reg = 0x1c8c, - .fw_name = PCIEIW62X_DEFAULT_COMBO_FW_NAME, - .fw_name_wlan = PCIEIW62X_DEFAULT_WLAN_FW_NAME, + .fw_name = PCIEIW624_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = PCIEIW624_DEFAULT_WLAN_FW_NAME, .fw_reset_reg = 0x1c94, .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -674,6 +691,7 @@ static struct _card_info card_info_PCIEAW693 = { .fw_reset_val = 0x98, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #ifdef USB8801 @@ -694,6 +712,7 @@ static struct _card_info card_info_USB8801 = { .fw_name_wlan = USB8801_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 0, + .host_mlme_required = 0, }; #endif @@ -713,6 +732,7 @@ static struct _card_info card_info_USB8978 = { .fw_name_wlan = USB8978_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -732,6 +752,7 @@ static struct _card_info card_info_USB8997 = { .fw_name_wlan = USB8997_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -752,6 +773,7 @@ static struct _card_info card_info_USB9098 = { .fw_name_wlan = USB9098_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -772,11 +794,12 @@ static struct _card_info card_info_USB9097 = { .fw_name_wlan = USB9097_WLAN_V1_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif -#ifdef USBIW62X -static struct _card_info card_info_USBIW62X = { +#ifdef USBIW624 +static struct _card_info card_info_USBIW624 = { .embedded_supp = 1, .drcs = 1, .go_noa = 1, @@ -788,10 +811,11 @@ static struct _card_info card_info_USBIW62X = { .rx_rate_max = 412, .feature_control = FEATURE_CTRL_DEFAULT, .histogram_table_num = 3, - .fw_name = USBIW62X_DEFAULT_COMBO_FW_NAME, - .fw_name_wlan = USBIW62X_DEFAULT_WLAN_FW_NAME, + .fw_name = USBIW624_DEFAULT_COMBO_FW_NAME, + .fw_name_wlan = USBIW624_DEFAULT_WLAN_FW_NAME, .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -830,6 +854,7 @@ static struct _card_info card_info_SD8987 = { #endif .sniffer_support = 1, .per_pkt_cfg_support = 1, + .host_mlme_required = 1, }; #endif @@ -901,10 +926,6 @@ static mlan_callbacks woal_callbacks = { .moal_hist_data_add = moal_hist_data_add, .moal_updata_peer_signal = moal_updata_peer_signal, .moal_do_div = moal_do_div, -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - .moal_wait_hostcmd_complete = moal_wait_hostcmd_complete, - .moal_notify_hostcmd_complete = moal_notify_hostcmd_complete, -#endif .moal_tp_accounting = moal_tp_accounting, .moal_tp_accounting_rx_param = moal_tp_accounting_rx_param, .moal_amsdu_tp_accounting = moal_amsdu_tp_accounting, @@ -1033,10 +1054,9 @@ void woal_clean_up(moal_handle *handle) #endif #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) if (priv->host_mlme) - woal_host_mlme_disconnect( + woal_deauth_event( priv, - MLAN_REASON_DEAUTH_LEAVING, - NULL); + MLAN_REASON_DEAUTH_LEAVING); else #endif cfg80211_disconnected(priv->netdev, 0, @@ -1052,7 +1072,7 @@ void woal_clean_up(moal_handle *handle) #ifdef STA_CFG80211 #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) if (IS_STA_CFG80211(cfg80211_wext) && - priv->sched_scanning) { + priv->sched_scanning && priv->wdev) { priv->bg_scan_start = MFALSE; priv->bg_scan_reported = MFALSE; cfg80211_sched_scan_stopped(priv->wdev->wiphy @@ -1132,10 +1152,9 @@ static void woal_hang_work_queue(struct work_struct *work) #endif #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) if (priv->host_mlme) - woal_host_mlme_disconnect( + woal_deauth_event( priv, - MLAN_REASON_DEAUTH_LEAVING, - NULL); + MLAN_REASON_DEAUTH_LEAVING); else #endif cfg80211_disconnected(priv->netdev, 0, @@ -1284,6 +1303,10 @@ static void woal_hang_work_queue(struct work_struct *work) void woal_process_hang(moal_handle *handle) { ENTER(); + if (!handle) { + LEAVE(); + return; + } if (reset_handle == NULL) { PRINTM(MMSG, "Start to process hanging\n"); reset_handle = handle; @@ -1291,9 +1314,9 @@ void woal_process_hang(moal_handle *handle) #ifdef ANDROID_KERNEL #define WAKE_LOCK_HANG 5000 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) - __pm_wakeup_event(&reset_handle->ws, WAKE_LOCK_HANG); + __pm_wakeup_event(&handle->ws, WAKE_LOCK_HANG); #else - wake_lock_timeout(&reset_handle->wake_lock, + wake_lock_timeout(&handle->wake_lock, msecs_to_jiffies(WAKE_LOCK_HANG)); #endif #endif @@ -2296,8 +2319,6 @@ mlan_status woal_init_sw(moal_handle *handle) #endif #ifdef SDIO if (IS_SD(handle->card_type)) { - device.sdio_rx_aggr_enable = - moal_extflg_isset(handle, EXT_SDIO_RX_AGGR); device.int_mode = (t_u32)moal_extflg_isset(handle, EXT_INTMODE); device.gpio_pin = (t_u32)handle->params.gpiopin; #ifdef SDIO_MMC @@ -2337,8 +2358,12 @@ mlan_status woal_init_sw(moal_handle *handle) } PRINTM(MMSG, "rx_work=%d cpu_num=%d\n", device.rx_work, num_possible_cpus()); - if (moal_extflg_isset(handle, EXT_NAPI)) + if (moal_extflg_isset(handle, EXT_NAPI)) { device.rx_work = MTRUE; + device.napi = MTRUE; + } else { + device.napi = MFALSE; + } device.dev_cap_mask = handle->params.dev_cap_mask; @@ -2644,7 +2669,7 @@ static t_u32 woal_set_sdio_slew_rate(moal_handle *handle) (handle->params.slew_rate > 3 || handle->params.slew_rate < 0)) return MLAN_STATUS_FAILURE; if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) || - IS_SDIW62X(handle->card_type) || IS_SD9177(handle->card_type)) + IS_SDIW624(handle->card_type) || IS_SD9177(handle->card_type)) reg_type = MLAN_REG_CIU; status = woal_getset_regrdwr(priv, MLAN_ACT_GET, reg_type, @@ -4223,7 +4248,7 @@ static mlan_status woal_init_fw_dpc(moal_handle *handle) if (!IS_USB8997(handle->card_type) && !IS_USB9098(handle->card_type) && !IS_USB9097(handle->card_type) && - !IS_USBIW62X(handle->card_type) && + !IS_USBIW624(handle->card_type) && !IS_USB8978(handle->card_type)) ret = woal_reset_usb_dev(handle); goto done; @@ -5241,9 +5266,6 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index, priv->okc_ie_len = 0; } #endif -#if defined(DRV_EMBEDDED_AUTHENTICATOR) - init_waitqueue_head(&priv->hostcmd_wait_q); -#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 24) SET_MODULE_OWNER(dev); #endif @@ -5348,7 +5370,7 @@ moal_private *woal_add_interface(moal_handle *handle, t_u8 bss_index, } #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0) strncpy(csa_str, "CSA", sizeof(csa_str)); - strncat(csa_str, name, sizeof(csa_str) - 1); + strncat(csa_str, name, sizeof(csa_str) - 4); priv->csa_workqueue = alloc_workqueue( csa_str, WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1); if (!priv->csa_workqueue) { @@ -5498,11 +5520,6 @@ void woal_remove_interface(moal_handle *handle, t_u8 bss_index) #endif int i = 0; -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - int count = 0; -#endif -#endif ENTER(); if (!priv || !priv->netdev) @@ -5604,18 +5621,6 @@ void woal_remove_interface(moal_handle *handle, t_u8 bss_index) if (IS_STA_OR_UAP_CFG80211(handle->params.cfg80211_wext)) priv->phandle->wiphy->extended_capabilities = NULL; #endif -#ifdef UAP_SUPPORT - /* Clear the whole backhaul station list in moal */ - for (count = 0; count < MAX_STA_COUNT; count++) { - if (priv->vlan_sta_list[count]) { - if (priv->vlan_sta_list[count]->is_valid) - unregister_netdevice( - priv->vlan_sta_list[count]->netdev); - kfree(priv->vlan_sta_list[count]); - } - priv->vlan_sta_list[count] = NULL; - } -#endif #endif priv->phandle->priv[priv->bss_index] = NULL; priv->phandle = NULL; @@ -5713,7 +5718,7 @@ mlan_status woal_set_user_antcfg(moal_handle *handle, t_u8 wait_option) if (handle->feature_control & FEATURE_CTRL_STREAM_2X2) { if (IS_CARD9098(handle->card_type) || IS_CARD9097(handle->card_type) || - IS_CARDIW62X(handle->card_type)) { + IS_CARDIW624(handle->card_type)) { radio->param.ant_cfg.tx_antenna = radio->param.ant_cfg.rx_antenna = antcfg; #if defined(STA_CFG80211) || defined(UAP_CFG80211) @@ -5916,6 +5921,34 @@ static void woal_flush_evt_queue(moal_handle *handle) spin_unlock_irqrestore(&handle->evt_lock, flags); } +/** + * @brief This function queue rx task + * + * @param handle A pointer to moal_handle + * + * @return N/A + */ +void woal_queue_rx_task(moal_handle *handle) +{ + ENTER(); +#ifdef PCIE + if (IS_PCIE(handle->card_type)) { + tasklet_schedule(&handle->pcie_rx_task); + LEAVE(); + return; + } +#endif + if (moal_extflg_isset(handle, EXT_NAPI)) { + napi_schedule(&handle->napi_rx); + LEAVE(); + return; + } +#if defined(USB) || defined(SDIO) + queue_work(handle->rx_workqueue, &handle->rx_work); +#endif + LEAVE(); +} + /** * @brief This function flush all works in the queue * @@ -5930,12 +5963,26 @@ void woal_flush_workqueue(moal_handle *handle) /* Terminate main workqueue */ if (handle->workqueue) flush_workqueue(handle->workqueue); - if (handle->rx_workqueue) - flush_workqueue(handle->rx_workqueue); if (handle->evt_workqueue) flush_workqueue(handle->evt_workqueue); if (handle->tx_workqueue) flush_workqueue(handle->tx_workqueue); +#if defined(USB) || defined(SDIO) + if (IS_USB(handle->card_type) || IS_SD(handle->card_type)) { + if (handle->rx_workqueue) + flush_workqueue(handle->rx_workqueue); + } +#endif +#ifdef PCIE + if (IS_PCIE(handle->card_type)) { + if (handle->pcie_rx_event_workqueue) + flush_workqueue(handle->pcie_rx_event_workqueue); + if (handle->pcie_cmd_resp_workqueue) + flush_workqueue(handle->pcie_cmd_resp_workqueue); + tasklet_kill(&handle->pcie_tx_complete_task); + tasklet_kill(&handle->pcie_rx_task); + } +#endif LEAVE(); } @@ -5957,11 +6004,6 @@ void woal_terminate_workqueue(moal_handle *handle) destroy_workqueue(handle->workqueue); handle->workqueue = NULL; } - if (handle->rx_workqueue) { - flush_workqueue(handle->rx_workqueue); - destroy_workqueue(handle->rx_workqueue); - handle->rx_workqueue = NULL; - } if (handle->evt_workqueue) { woal_flush_evt_queue(handle); flush_workqueue(handle->evt_workqueue); @@ -5973,6 +6015,31 @@ void woal_terminate_workqueue(moal_handle *handle) destroy_workqueue(handle->tx_workqueue); handle->tx_workqueue = NULL; } +#if defined(USB) || defined(SDIO) + if (IS_USB(handle->card_type) || IS_SD(handle->card_type)) { + if (handle->rx_workqueue) { + flush_workqueue(handle->rx_workqueue); + destroy_workqueue(handle->rx_workqueue); + handle->rx_workqueue = NULL; + } + } +#endif +#ifdef PCIE + if (IS_PCIE(handle->card_type)) { + if (handle->pcie_rx_event_workqueue) { + flush_workqueue(handle->pcie_rx_event_workqueue); + destroy_workqueue(handle->pcie_rx_event_workqueue); + handle->pcie_rx_event_workqueue = NULL; + } + if (handle->pcie_cmd_resp_workqueue) { + flush_workqueue(handle->pcie_cmd_resp_workqueue); + destroy_workqueue(handle->pcie_cmd_resp_workqueue); + handle->pcie_cmd_resp_workqueue = NULL; + } + tasklet_kill(&handle->pcie_tx_complete_task); + tasklet_kill(&handle->pcie_rx_task); + } +#endif LEAVE(); } @@ -6000,9 +6067,6 @@ int woal_open(struct net_device *dev) #endif /* < 2.6.34 */ #endif /* USB_SUSPEND_RESUME */ t_u8 carrier_on = MFALSE; -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - int cfg80211_wext = priv->phandle->params.cfg80211_wext; -#endif ENTER(); @@ -6070,13 +6134,6 @@ int woal_open(struct net_device *dev) carrier_on = MTRUE; #endif -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - if (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) { - if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP_VLAN) - carrier_on = MTRUE; - } -#endif - if (carrier_on == MTRUE) { if (!netif_carrier_ok(priv->netdev)) netif_carrier_on(priv->netdev); @@ -6114,18 +6171,6 @@ int woal_close(struct net_device *dev) #endif ENTER(); -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - if (IS_STA_OR_UAP_CFG80211(cfg80211_wext)) { - /** For multi-ap virtual interface */ - if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP_VLAN) { - woal_stop_queue(priv->netdev); - MODULE_PUT; - LEAVE(); - return 0; - } - } -#endif - woal_flush_tx_stat_queue(priv); if ((priv->media_connected == MTRUE) @@ -6269,13 +6314,6 @@ int woal_set_mac_address(struct net_device *dev, void *addr) return -EFAULT; } -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - /* No need to set mac address for multi-ap virtual interface */ - if ((dev->ieee80211_ptr) && - (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP_VLAN)) - return 0; -#endif - moal_memcpy_ext(priv->phandle, prev_addr, priv->current_addr, ETH_ALEN, ETH_ALEN); memset(priv->current_addr, 0, ETH_ALEN); @@ -6456,8 +6494,13 @@ void woal_mlan_debug_info(moal_private *priv) PRINTM(MERROR, "tx_pkts_queued=%d\n", info->tx_pkts_queued); PRINTM(MERROR, "fw_hang_report = %d\n", info->fw_hang_report); PRINTM(MERROR, "num_cmd_timeout = %d\n", info->num_cmd_timeout); - PRINTM(MERROR, "Timeout cmd id = 0x%x, act = 0x%x\n", - info->timeout_cmd_id, info->timeout_cmd_act); + PRINTM(MERROR, "num_no_cmd_node = %d\n", info->num_no_cmd_node); + PRINTM(MERROR, "num_assoc_err = %d\n", info->num_assoc_err); + PRINTM(MERROR, "num_scan_err = %d\n", info->num_scan_err); + PRINTM(MERROR, "num_remain_chan_err = %d\n", info->num_remain_chan_err); + if (info->timeout_cmd_id) + PRINTM(MERROR, "Timeout cmd id = 0x%x, act = 0x%x\n", + info->timeout_cmd_id, info->timeout_cmd_act); PRINTM(MERROR, "last_cmd_index = %d\n", info->last_cmd_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) @@ -7467,11 +7510,12 @@ void woal_send_tx_pkt_to_mon_if(moal_private *priv, pmlan_buffer pmbuf) int len, hdr_len; t_u16 fc; t_u8 rfc1042_eth_hdr[ETH_ALEN] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; - moal_handle *handle = priv->phandle; + moal_handle *handle = NULL; if (!priv || !pmbuf) return; + handle = priv->phandle; /* Only STA and uAP mode are supported */ if (!(priv->bss_type == MLAN_BSS_TYPE_STA || priv->bss_type == MLAN_BSS_TYPE_UAP)) @@ -7554,66 +7598,6 @@ done: #endif #endif -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) -/** - * @brief This function check if the packet is easymesh packet - * - * @param priv A pointer to moal_private structure - * @param skb A pointer to sk_buff structure - * - * @return MTRUE/MFALSE - */ -static BOOLEAN woal_check_easymesh_packet(moal_private *priv, - mlan_buffer *pmbuf) -{ - struct sk_buff *skb = pmbuf->pdesc; - ENTER(); - - /** not construct 4 address if SA is same as local address */ - if (!moal_memcmp(NULL, (skb->data + 6), priv->current_addr, ETH_ALEN)) { - PRINTM(MINFO, - "%s: SA is same as local address " FULL_MACSTR "\n", - __func__, FULL_MAC2STR(priv->current_addr)); - LEAVE(); - return MFALSE; - } - - /* RA TA */ - switch (priv->wdev->iftype) { -#ifdef UAP_SUPPORT - case NL80211_IFTYPE_AP_VLAN: - PRINTM(MDAT_D, "%s: Easymesh AP_VLAN\n", priv->netdev->name); - moal_memcpy_ext(priv->phandle, pmbuf->mac, - priv->vlan_sta_ptr->peer_mac, - MLAN_MAC_ADDR_LENGTH, ETH_ALEN); - pmbuf->flags |= MLAN_BUF_FLAG_EASYMESH; - break; -#endif - case NL80211_IFTYPE_STATION: - PRINTM(MDAT_D, "%s Easymesh STATION\n", priv->netdev->name); - moal_memcpy_ext(priv->phandle, pmbuf->mac, priv->cfg_bssid, - ETH_ALEN, ETH_ALEN); - pmbuf->flags |= MLAN_BUF_FLAG_EASYMESH; - break; - default: - PRINTM(MERROR, "Not supported iftype\n"); - LEAVE(); - return MFALSE; - } - PRINTM(MDAT_D, - "Easymesh Tx %s:\nRA: " FULL_MACSTR "\nTA: " FULL_MACSTR - "\nDA: " FULL_MACSTR "\nSA: " FULL_MACSTR "\n", - __func__, FULL_MAC2STR(pmbuf->mac), - FULL_MAC2STR(priv->current_addr), FULL_MAC2STR(skb->data), - FULL_MAC2STR(skb->data + ETH_ALEN)); - - LEAVE(); - return MTRUE; -} -#endif -#endif - /** * @brief This function handles packet transmission * @@ -7632,12 +7616,6 @@ static void woal_start_xmit(moal_private *priv, struct sk_buff *skb) #endif int ret = 0; -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - BOOLEAN multi_ap_packet = MFALSE; -#endif -#endif - ENTER(); priv->num_tx_timeout = 0; @@ -7682,23 +7660,6 @@ static void woal_start_xmit(moal_private *priv, struct sk_buff *skb) pmbuf->bss_index = priv->bss_index; woal_fill_mlan_buffer(priv, pmbuf, skb); -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - if (priv->wdev->use_4addr) { - if ((priv->wdev->iftype == NL80211_IFTYPE_AP_VLAN && - !priv->vlan_sta_ptr) || - (priv->wdev->iftype == NL80211_IFTYPE_STATION && - !priv->media_connected)) { - priv->stats.tx_dropped++; - dev_kfree_skb_any(skb); - LEAVE(); - return; - } - multi_ap_packet = woal_check_easymesh_packet(priv, pmbuf); - } -#endif -#endif - if (priv->enable_tcp_ack_enh == MTRUE) { ret = woal_process_tcp_ack(priv, pmbuf); if (ret) @@ -7735,13 +7696,6 @@ static void woal_start_xmit(moal_private *priv, struct sk_buff *skb) case MLAN_STATUS_PENDING: atomic_inc(&priv->phandle->tx_pending); -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - if (priv->wdev->iftype == NL80211_IFTYPE_AP_VLAN) - priv = priv->parent_priv; -#endif -#endif - #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29) atomic_inc(&priv->wmm_tx_pending[index]); if (atomic_read(&priv->wmm_tx_pending[index]) >= @@ -8045,12 +7999,6 @@ void woal_set_multicast_list(struct net_device *dev) */ void woal_init_priv(moal_private *priv, t_u8 wait_option) { -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - int i; -#endif -#endif - ENTER(); #ifdef STA_SUPPORT if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_STA) { @@ -8112,14 +8060,6 @@ void woal_init_priv(moal_private *priv, t_u8 wait_option) woal_init_wifi_hal(priv); #endif #endif -#endif - -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - priv->vlan_sta_ptr = NULL; - for (i = 0; i < MAX_STA_COUNT; i++) - priv->vlan_sta_list[i] = NULL; -#endif #endif } #endif @@ -8249,11 +8189,6 @@ void woal_init_priv(moal_private *priv, t_u8 wait_option) priv->chan_num_pkts = DEFAULT_RETRY_PKTS; priv->user_cac_period_msec = 0; priv->chan_under_nop = MFALSE; -#endif -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - priv->multi_ap_flag = 0; -#endif #endif LEAVE(); } @@ -8627,9 +8562,9 @@ static int woal_get_card_info(moal_handle *phandle) case CARD_TYPE_SDAW693: phandle->card_info = &card_info_SDAW693; break; -#ifdef SDIW62X - case CARD_TYPE_SDIW62X: - phandle->card_info = &card_info_SDIW62X; +#ifdef SDIW624 + case CARD_TYPE_SDIW624: + phandle->card_info = &card_info_SDIW624; break; #endif #ifdef SD9177 @@ -8651,9 +8586,9 @@ static int woal_get_card_info(moal_handle *phandle) case CARD_TYPE_PCIEAW693: phandle->card_info = &card_info_PCIEAW693; break; -#ifdef PCIEIW62X - case CARD_TYPE_PCIEIW62X: - phandle->card_info = &card_info_PCIEIW62X; +#ifdef PCIEIW624 + case CARD_TYPE_PCIEIW624: + phandle->card_info = &card_info_PCIEIW624; break; #endif #ifdef PCIE9098 @@ -8687,9 +8622,9 @@ static int woal_get_card_info(moal_handle *phandle) phandle->card_info = &card_info_USB9097; break; #endif -#ifdef USBIW62X - case CARD_TYPE_USBIW62X: - phandle->card_info = &card_info_USBIW62X; +#ifdef USBIW624 + case CARD_TYPE_USBIW624: + phandle->card_info = &card_info_USBIW624; break; #endif #ifdef SD8987 @@ -8930,9 +8865,11 @@ int woal_reassociation_thread(void *data) AUTO_ASSOC_TYPE_DRV_ASSOC) { /* disconnect before driver * assoc */ - woal_disconnect(priv, MOAL_IOCTL_WAIT, - NULL, - DEF_DEAUTH_REASON_CODE); + if (woal_disconnect( + priv, MOAL_IOCTL_WAIT, NULL, + DEF_DEAUTH_REASON_CODE)) + PRINTM(MERROR, + "woal_disconnect failed\n"); if (priv->auto_assoc_priv .auto_assoc_type_on & (0x1 << (AUTO_ASSOC_TYPE_DRV_ASSOC - @@ -9515,8 +9452,7 @@ t_void woal_send_disconnect_to_system(moal_private *priv, is not valid */ #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) if (priv->host_mlme) - woal_host_mlme_disconnect(priv, reason_code, - NULL); + woal_deauth_event(priv, reason_code); else #endif cfg80211_disconnected(priv->netdev, reason_code, @@ -9555,9 +9491,83 @@ t_void woal_send_disconnect_to_system(moal_private *priv, } #endif /* STA_SUPPORT */ +#ifndef DUMP_TO_PROC +#if defined(PCIE) +/** + * @brief This function stores the SSU dumps in a file + * + * @param phandle A pointer to moal_handle + * @param pmevent A pointer to mlan_event structure + * + * @return N/A + */ +t_void woal_store_ssu_dump(moal_handle *phandle, mlan_event *pmevent) +{ +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + struct dentry *dentry; + struct path path; +#endif + struct file *pfile_ssudump = NULL; + char dw_string[10]; + loff_t pos = 0; + t_u32 i; + t_u32 *tmpbuf; + + ENTER(); +#if LINUX_VERSION_CODE > KERNEL_VERSION(3, 1, 0) + dentry = kern_path_create(AT_FDCWD, "/data", &path, 1); + if (IS_ERR(dentry)) { + goto save_ssudump; + } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) + vfs_mkdir(path.dentry->d_inode, dentry, 0777); +#else + vfs_mkdir(&init_user_ns, path.dentry->d_inode, dentry, 0777); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0) + mutex_unlock(&path.dentry->d_inode->i_mutex); +#else + done_path_create(&path, dentry); +#endif +save_ssudump: +#endif + pfile_ssudump = filp_open("/data/ssudump.txt", + O_CREAT | O_WRONLY | O_APPEND, 0644); + if (IS_ERR(pfile_ssudump)) { + PRINTM(MERROR, "Cannot create ssu dump file\n"); + LEAVE(); + return; + } + DBG_HEXDUMP(MEVT_D, "SSU addr", pmevent->event_buf, 8); + moal_memcpy_ext(phandle, &tmpbuf, pmevent->event_buf, sizeof(t_ptr), + sizeof(t_ptr)); + PRINTM(MEVENT, "woal_store_ssu_dump: tmpbuf %p\n", tmpbuf); + for (i = 0; i < pmevent->event_len / 4; i++) { + if ((i + 1) % 8 == 0) + snprintf(dw_string, sizeof(dw_string), "%08x\n", + *tmpbuf); + else + snprintf(dw_string, sizeof(dw_string), "%08x ", + *tmpbuf); +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + vfs_write(pfile_ssudump, (const char __user *)dw_string, 9, + &pos); +#else + kernel_write(pfile_ssudump, dw_string, 9, &pos); +#endif + tmpbuf++; + } + filp_close(pfile_ssudump, NULL); + LEAVE(); + return; +} +#endif /* SSU_SUPPORT */ +#endif + #define OFFSET_SEQNUM 4 #define OFFSET_TYPE 8 #define DUMP_TYPE_ENDE 2 +#ifdef DUMP_TO_PROC /** * @brief This function stores the FW dumps received from events * @@ -9650,6 +9660,118 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) return; } +#else +t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) +{ + struct file *pfile_fwdump = NULL; + loff_t pos = 0; + t_u16 seqnum; + t_u16 type = 0; + t_u8 path_name[64]; + moal_handle *ref_handle = NULL; + + ENTER(); + if (phandle->fwdump_fname) + pfile_fwdump = filp_open(phandle->fwdump_fname, + O_CREAT | O_WRONLY | O_APPEND, 0644); + else { + seqnum = woal_le16_to_cpu( + *(t_u16 *)(pmevent->event_buf + OFFSET_SEQNUM)); + type = woal_le16_to_cpu( + *(t_u16 *)(pmevent->event_buf + OFFSET_TYPE)); + + if (seqnum == 1) { +#ifdef DEBUG_LEVEL1 + if (drvdbg & MFW_D) + phandle->fw_dump_status = MTRUE; +#endif + if (phandle->fw_dump == MFALSE) { + PRINTM(MMSG, "=====FW trigger dump====\n"); + phandle->fw_dump = MTRUE; + phandle->is_fw_dump_timer_set = MTRUE; + woal_mod_timer(&phandle->fw_dump_timer, + MOAL_TIMER_5S); + } + phandle->fw_dump_len = 0; + PRINTM(MMSG, + "==== Start Receive FW dump event ====\n"); +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + /** Create dump directort*/ + woal_create_dump_dir(phandle, path_name, + sizeof(path_name)); +#else + memset(path_name, 0, sizeof(path_name)); + strncpy(path_name, "/data", sizeof(path_name)); +#endif + PRINTM(MMSG, "Firmware Dump directory name is %s\n", + path_name); + ref_handle = (moal_handle *)phandle->pref_mac; + if (ref_handle) + woal_dump_drv_info(ref_handle, path_name); + woal_dump_drv_info(phandle, path_name); + if (fwdump_fname) { + memset(fwdump_fname, 0, 64); + } else { + gfp_t flag; + flag = (in_atomic() || irqs_disabled()) ? + GFP_ATOMIC : + GFP_KERNEL; + fwdump_fname = kzalloc(64, flag); + } + snprintf(fwdump_fname, MAX_BUF_LEN, "%s/file_fwdump", + path_name); + pfile_fwdump = + filp_open(fwdump_fname, + O_CREAT | O_WRONLY | O_APPEND, 0644); + if (IS_ERR(pfile_fwdump)) { + memset(fwdump_fname, 0, 64); + snprintf(fwdump_fname, MAX_BUF_LEN, "%s/%s", + "/var", "file_fwdump"); + pfile_fwdump = + filp_open(fwdump_fname, + O_CREAT | O_WRONLY | O_APPEND, + 0644); + } + } else + pfile_fwdump = + filp_open(fwdump_fname, + O_CREAT | O_WRONLY | O_APPEND, 0644); + } + if (IS_ERR(pfile_fwdump)) { + PRINTM(MERROR, "Cannot create firmware dump file\n"); + LEAVE(); + return; + } + phandle->fw_dump_len += pmevent->event_len - OFFSET_SEQNUM; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + vfs_write(pfile_fwdump, + (const char __user *)pmevent->event_buf + OFFSET_SEQNUM, + pmevent->event_len - OFFSET_SEQNUM, &pos); +#else + kernel_write(pfile_fwdump, pmevent->event_buf + OFFSET_SEQNUM, + pmevent->event_len - OFFSET_SEQNUM, &pos); +#endif + filp_close(pfile_fwdump, NULL); + if (type == DUMP_TYPE_ENDE) { + PRINTM(MMSG, "==== FW DUMP END: %ld bytes ====\n", + (long int)phandle->fw_dump_len); + phandle->fw_dump = MFALSE; + if (phandle->is_fw_dump_timer_set) { + woal_cancel_timer(&phandle->fw_dump_timer); + phandle->is_fw_dump_timer_set = MFALSE; + } + if (phandle->priv_num) { + woal_send_fw_dump_complete_event( + woal_get_priv(phandle, MLAN_BSS_ROLE_ANY)); + mlan_pm_wakeup_card(phandle->pmlan_adapter, MFALSE); + woal_process_hang(phandle); + } + } + LEAVE(); + return; +} +#endif /* DUMP_TO_PROC */ + #define DRV_INFO_SIZE 0x60000 #define DRV_INFO_PER_INTF 0x11000 #define ROW_SIZE_16 16 @@ -9907,8 +10029,18 @@ static int woal_dump_mlan_drv_info(moal_private *priv, t_u8 *buf) info->fw_hang_report); ptr += snprintf(ptr, MAX_BUF_LEN, "num_cmd_timeout = %d\n", info->num_cmd_timeout); - ptr += snprintf(ptr, MAX_BUF_LEN, "Timeout cmd id = 0x%x, act = 0x%x\n", - info->timeout_cmd_id, info->timeout_cmd_act); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_no_cmd_node = %d\n", + info->num_no_cmd_node); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_assoc_err = %d\n", + info->num_assoc_err); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_scan_err = %d\n", + info->num_scan_err); + ptr += snprintf(ptr, MAX_BUF_LEN, "num_remain_chan_err = %d\n", + info->num_remain_chan_err); + if (info->timeout_cmd_id) + ptr += snprintf(ptr, MAX_BUF_LEN, + "Timeout cmd id = 0x%x, act = 0x%x\n", + info->timeout_cmd_id, info->timeout_cmd_act); ptr += snprintf(ptr, MAX_BUF_LEN, "last_cmd_index = %d\n", info->last_cmd_index); for (s = str, i = 0; i < DBG_CMD_NUM; i++) @@ -10082,6 +10214,86 @@ static int woal_dump_mlan_drv_info(moal_private *priv, t_u8 *buf) return ptr - (char *)buf; } +#ifndef DUMP_TO_PROC +#define HostCmd_CMD_CFG_DATA 0x008f +#define DEF_FW_PATH "/lib/firmware/" +#define DEF_HOSTCMD_PATH "/lib/firmware/nxp/hostcmd.conf" +/** + * @brief This function save the hostcmd response to file + * + * @param phandle A pointer to moal_handle + * @param pevent A pointer to mlan_cmdresp_event + * + * @return N/A + */ +t_void woal_save_host_cmdresp(moal_handle *phandle, mlan_cmdresp_event *pevent) +{ + HostCmd_DS_GEN *resp; + char file_path[256]; + struct file *pfile = NULL; + char *dpd_data_cfg = phandle->params.dpd_data_cfg; + int ret; + t_u8 *buf; + t_u16 command; + int len = 0; + char *ptr; + loff_t pos = 0; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + mm_segment_t fs; +#endif + + resp = (HostCmd_DS_GEN *)pevent->resp; + command = woal_le16_to_cpu(resp->command); + memset(file_path, 0, sizeof(file_path)); + ret = moal_vmalloc(phandle, pevent->event_len * 5, &buf); + if (ret != MLAN_STATUS_SUCCESS || !buf) { + PRINTM(MERROR, "Fail to allocate memory to save hostcmd\n"); + return; + } + memset(buf, 0, pevent->event_len * 5); + ptr = (char *)buf; + switch (command) { + case HostCmd_CMD_CFG_DATA: + if (dpd_data_cfg) + snprintf(file_path, sizeof(file_path), "%s%s", + DEF_FW_PATH, dpd_data_cfg); + else + snprintf(file_path, sizeof(file_path), "%s", + DEF_HOSTCMD_PATH); + break; + default: + snprintf(file_path, sizeof(file_path), "%s", DEF_HOSTCMD_PATH); + break; + } + pfile = filp_open(file_path, O_CREAT | O_WRONLY | O_APPEND, 0644); + if (IS_ERR(pfile)) { + PRINTM(MERROR, "Cannot create file %s\n", file_path); + moal_vfree(phandle, buf); + return; + } + ptr += snprintf(ptr, MAX_BUF_LEN, "hostcmd_%02x=={\n", command); + ptr += woal_save_hex_dump(ROW_SIZE_16, resp, pevent->event_len, MFALSE, + ptr); + ptr += snprintf(ptr, MAX_BUF_LEN, "}\n"); + len = ptr - (char *)buf; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(pfile, (const char __user *)buf, len, &pos); + set_fs(fs); +#else + kernel_write(pfile, buf, len, &pos); +#endif + PRINTM(MMSG, "Save hostcmd 0x%02x, cmd len=%d file len=%d to file %s\n", + command, pevent->event_len, len, file_path); + if (buf) + moal_vfree(phandle, buf); + filp_close(pfile, NULL); + return; +} +#endif + /** * @brief This function dump moal hex to file * @@ -10195,6 +10407,7 @@ static int woal_dump_mlan_hex(moal_private *priv, t_u8 *buf) return ptr - (char *)buf; } +#ifdef DUMP_TO_PROC /** * @brief This function dump drv info to file * @@ -10239,7 +10452,241 @@ t_u8 *woal_dump_drv_info(moal_handle *phandle, t_u32 *dump_len) done: return drv_buf; } +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) +/** + * @brief This function create dump directory + * + * @param phandle A pointer to moal_handle + * @param dir_buf A pointer to dir_buf buffer + * @param buf_size Size of dir_buf buffer + * + * @return N/A + */ +void woal_create_dump_dir(moal_handle *phandle, char *dir_buf, int buf_size) +{ + struct dentry *dentry; + struct path path; + t_u32 sec, usec; + int ret; + ENTER(); + + if (!phandle || !dir_buf) { + PRINTM(MERROR, "Can't create directory\n"); + ret = MLAN_STATUS_FAILURE; + goto done; + } + + moal_get_system_time(phandle, &sec, &usec); + memset(dir_buf, 0, buf_size); + snprintf(dir_buf, MAX_BUF_LEN, "%s%u", "/data/dump_", sec); + + dentry = kern_path_create(AT_FDCWD, dir_buf, &path, 1); + if (IS_ERR(dentry)) { + PRINTM(MERROR, + "Create directory %s error, try create dir in /var", + dir_buf); + memset(dir_buf, 0, buf_size); + snprintf(dir_buf, MAX_BUF_LEN, "%s%u", "/var/dump_", sec); + dentry = kern_path_create(AT_FDCWD, dir_buf, &path, 1); + } + if (IS_ERR(dentry)) { + PRINTM(MERROR, "Create directory %s error, use default folder", + dir_buf); + goto default_dir; + } +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 12, 0) + ret = vfs_mkdir(path.dentry->d_inode, dentry, 0777); +#else + ret = vfs_mkdir(&init_user_ns, path.dentry->d_inode, dentry, 0777); +#endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 6, 0) + mutex_unlock(&path.dentry->d_inode->i_mutex); +#else + done_path_create(&path, dentry); +#endif + + if (ret < 0) { + PRINTM(MERROR, + "Create directory failure, use default folder\n"); + PRINTM(MERROR, "Create directory failure, ret = %d\n", ret); + goto default_dir; + } else { + PRINTM(MMSG, "Create directory %s successfully\n", dir_buf); + goto done; + } + +default_dir: + memset(dir_buf, 0, buf_size); + snprintf(dir_buf, MAX_BUF_LEN, "%s", "/data"); +done: + LEAVE(); +} +#endif + +/** + * @brief This function save dump buf to file + * + * @param dir_name A pointer to directory name + * @param file_name A pointer to file name + * @param buf A pointer to dump data + * @param buf_len The length of dump buf + * + * @return SUCCESS OR FAILURE + */ +mlan_status woal_save_dump_info_to_file(char *dir_name, char *file_name, + t_u8 *buf, t_u32 buf_len) +{ + mlan_status ret = MLAN_STATUS_SUCCESS; + struct file *pfile = NULL; + t_u8 name[64]; + loff_t pos; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + mm_segment_t fs; +#endif + + ENTER(); + + if (!dir_name || !file_name || !buf) { + PRINTM(MERROR, "Can't save dump info to file\n"); + ret = MLAN_STATUS_FAILURE; + goto done; + } + + memset(name, 0, sizeof(name)); + snprintf(name, sizeof(name), "%s/%s", dir_name, file_name); + pfile = filp_open(name, O_CREAT | O_RDWR, 0644); + if (IS_ERR(pfile)) { + PRINTM(MMSG, + "Create file %s error, try to save dump file in /var\n", + name); + memset(name, 0, sizeof(name)); + snprintf(name, sizeof(name), "%s/%s", "/var", file_name); + pfile = filp_open(name, O_CREAT | O_RDWR, 0644); + } + if (IS_ERR(pfile)) { + PRINTM(MERROR, "Create Dump file for %s error\n", name); + ret = MLAN_STATUS_FAILURE; + goto done; + } + + PRINTM(MMSG, "Dump data %s saved in %s\n", file_name, name); + + pos = 0; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(pfile, (const char __user *)buf, buf_len, &pos); + set_fs(fs); +#else + kernel_write(pfile, buf, buf_len, &pos); +#endif + filp_close(pfile, NULL); + + PRINTM(MMSG, "Dump data %s saved in %s successfully\n", file_name, + name); + +done: + LEAVE(); + return ret; +} + +/** + * @brief This function dump drv info to file + * + * @param phandle A pointer to moal_handle + * @param dir_name A pointer to directory name + * + * @return N/A + */ +void woal_dump_drv_info(moal_handle *phandle, t_u8 *dir_name) +{ + int ret = 0; + struct file *pfile = NULL; + t_u8 *drv_buf = NULL; + t_u8 file_name[64]; + t_u32 len = 0; + t_u32 total_len = 0; + moal_private *woal_handle = NULL; +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + mm_segment_t fs; +#endif + t_u32 drv_info_size = DRV_INFO_SIZE; + + ENTER(); + if (!phandle->priv_num) + return; + + PRINTM(MMSG, "=== START DRIVER INFO DUMP==="); + memset(file_name, 0, sizeof(file_name)); + if (phandle->second_mac) + snprintf(file_name, sizeof(file_name), "%s/%s", dir_name, + "file_drv_info_2"); + else + snprintf(file_name, sizeof(file_name), "%s/%s", dir_name, + "file_drv_info"); + pfile = filp_open(file_name, O_CREAT | O_RDWR, 0644); + if (IS_ERR(pfile)) { + PRINTM(MMSG, + "Create file %s error, try create /var/file_drv_info", + file_name); + pfile = filp_open("/var/file_drv_info", O_CREAT | O_RDWR, 0644); + } else { + PRINTM(MMSG, "DRV dump data in %s\n", file_name); + } + if (IS_ERR(pfile)) { + PRINTM(MMSG, "Create file_drv_info file failed\n"); + goto done; + } + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + fs = get_fs(); + set_fs(KERNEL_DS); +#endif + woal_handle = woal_get_priv(phandle, MLAN_BSS_ROLE_ANY); + + if (woal_handle != NULL) { + if (phandle->priv_num > 3) + drv_info_size += + (phandle->priv_num - 3) * DRV_INFO_PER_INTF; + ret = moal_vmalloc(phandle, drv_info_size, &drv_buf); + if ((ret != MLAN_STATUS_SUCCESS) || !drv_buf) { + PRINTM(MERROR, "Error: vmalloc drv buffer failed!\n"); + goto done; + } + len = woal_dump_moal_drv_info(phandle, drv_buf); + total_len += len; + len = woal_dump_mlan_drv_info(woal_handle, drv_buf + total_len); + total_len += len; + len = woal_dump_moal_hex(phandle, drv_buf + total_len); + total_len += len; + len = woal_dump_mlan_hex(woal_handle, drv_buf + total_len); + total_len += len; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + vfs_write(pfile, (const char __user *)drv_buf, total_len, + &pfile->f_pos); +#else + kernel_write(pfile, drv_buf, total_len, &pfile->f_pos); +#endif + } + PRINTM(MMSG, "Drv info total bytes = %ld (0x%lx)\n", + (long int)total_len, (long unsigned int)total_len); + filp_close(pfile, NULL); + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + set_fs(fs); +#endif + PRINTM(MMSG, "=== DRIVER INFO DUMP END==="); +done: + if (drv_buf) + moal_vfree(phandle, drv_buf); + LEAVE(); +} +#endif + +#ifdef DUMP_TO_PROC /** * @brief This function adds header and copy the src data to buf * @@ -10315,6 +10762,7 @@ void woal_append_end_block(moal_handle *phandle) LEAVE(); return; } +#endif /** * @brief This function displays extra MOAL debug information @@ -10813,6 +11261,7 @@ t_void woal_evt_work_queue(struct work_struct *work) spin_unlock_irqrestore(&handle->evt_lock, flags); LEAVE(); } +#if defined(USB) || defined(SDIO) /** * @brief This workqueue function handles rx_process * @@ -10855,6 +11304,119 @@ t_void woal_rx_work_queue(struct work_struct *work) handle->rx_time); LEAVE(); } +#endif + +#ifdef PCIE +/** + * @brief This tasklet handles rx_data + * + * @param work A pointer to work_struct + * + * @return N/A + */ +void woal_pcie_rx_data_task(unsigned long data) +{ + moal_handle *handle = (moal_handle *)data; + wifi_timeval start_timeval; + wifi_timeval end_timeval; + + ENTER(); + + if (!handle || handle->surprise_removed == MTRUE) { + LEAVE(); + return; + } +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 2, 0) + if (handle->cfg80211_suspend == MTRUE) { + LEAVE(); + return; + } +#endif +#endif + + woal_get_monotonic_time(&start_timeval); + + mlan_process_pcie_interrupt_cb(handle->pmlan_adapter, RX_DATA); + + woal_get_monotonic_time(&end_timeval); + handle->rx_time += (t_u64)(timeval_to_usec(end_timeval) - + timeval_to_usec(start_timeval)); + PRINTM(MINFO, + "%s : start_timeval=%d:%d end_timeval=%d:%d inter=%llu rx_time=%llu\n", + __func__, start_timeval.time_sec, start_timeval.time_usec, + end_timeval.time_sec, end_timeval.time_usec, + (t_u64)(timeval_to_usec(end_timeval) - + timeval_to_usec(start_timeval)), + handle->rx_time); + LEAVE(); +} + +/** + * @brief This tasklet handles tx_complete interrupt + * + * @param work A pointer to work_struct + * + * @return N/A + */ +t_void woal_pcie_tx_complete_task(unsigned long data) +{ + moal_handle *handle = (moal_handle *)data; + ENTER(); + + if (!handle || handle->surprise_removed == MTRUE) { + LEAVE(); + return; + } + + mlan_process_pcie_interrupt_cb(handle->pmlan_adapter, TX_COMPLETE); + LEAVE(); +} + +/** + * @brief This workqueue handles rx_event + * + * @param work A pointer to work_struct + * + * @return N/A + */ +t_void woal_pcie_rx_event_work_queue(struct work_struct *work) +{ + moal_handle *handle = + container_of(work, moal_handle, pcie_rx_event_work); + ENTER(); + + if (!handle || handle->surprise_removed == MTRUE) { + LEAVE(); + return; + } + + mlan_process_pcie_interrupt_cb(handle->pmlan_adapter, RX_EVENT); + LEAVE(); +} + +/** + * @brief This workqueue handles rx_cmdresp + * + * @param work A pointer to work_struct + * + * @return N/A + */ +t_void woal_pcie_cmd_resp_work_queue(struct work_struct *work) +{ + moal_handle *handle = + container_of(work, moal_handle, pcie_cmd_resp_work); + ENTER(); + + if (!handle || handle->surprise_removed == MTRUE) { + LEAVE(); + return; + } + + mlan_process_pcie_interrupt_cb(handle->pmlan_adapter, RX_CMD_RESP); + LEAVE(); +} +#endif // PCIE /** * @brief This function dequeue pkt from list @@ -10875,7 +11437,7 @@ struct sk_buff *woal_skb_dequeue_spinlock(struct sk_buff_head *list) } /** - * @brief This workqueue function handles rx_work_process + * @brief This workqueue function handles tx_work_process * * @param work A pointer to work_struct * @@ -10887,6 +11449,12 @@ t_void woal_tx_work_handler(struct work_struct *work) moal_private *priv = NULL; int i = 0; struct sk_buff *skb = NULL; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 10) && \ + LINUX_VERSION_CODE <= KERNEL_VERSION(5, 8, 18) + struct sched_param sp; +#elif LINUX_VERSION_CODE > KERNEL_VERSION(5, 13, 19) + struct sched_attr attr; +#endif ENTER(); if (handle->surprise_removed == MTRUE) { @@ -10894,6 +11462,31 @@ t_void woal_tx_work_handler(struct work_struct *work) return; } + if ((handle->params.wq_sched_prio != current->rt_priority) || + (handle->params.wq_sched_policy != current->policy)) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 10) && \ + LINUX_VERSION_CODE <= KERNEL_VERSION(5, 8, 18) + PRINTM(MMSG, + "Set tx work queue priority %d and scheduling policy %d\n", + handle->params.wq_sched_prio, + handle->params.wq_sched_policy); + /* Change the priority and scheduling policy of tx work queue + */ + sp.sched_priority = handle->params.wq_sched_prio; + sched_setscheduler(current, handle->params.wq_sched_policy, + &sp); +#elif LINUX_VERSION_CODE > KERNEL_VERSION(5, 13, 19) + PRINTM(MMSG, + "Set tx work queue priority %d and scheduling policy %d\n", + handle->params.wq_sched_prio, + handle->params.wq_sched_policy); + attr.sched_policy = handle->params.wq_sched_policy; + attr.sched_nice = DEF_NICE; + attr.sched_priority = handle->params.wq_sched_prio; + sched_setattr_nocheck(current, &attr); +#endif + } + for (i = 0; i < MIN(handle->priv_num, MLAN_MAX_BSS_NUM); i++) { priv = handle->priv[i]; while ((skb = woal_skb_dequeue_spinlock(&priv->tx_q)) != NULL) { @@ -10917,8 +11510,11 @@ t_void woal_main_work_queue(struct work_struct *work) #ifdef USB struct usb_card_rec *cardp = (struct usb_card_rec *)handle->card; #endif -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) - struct sched_param sp = {.sched_priority = wq_sched_prio}; +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 10) && \ + LINUX_VERSION_CODE <= KERNEL_VERSION(5, 8, 18) + struct sched_param sp; +#elif LINUX_VERSION_CODE > KERNEL_VERSION(5, 13, 19) + struct sched_attr attr; #endif ENTER(); @@ -10939,19 +11535,31 @@ t_void woal_main_work_queue(struct work_struct *work) LEAVE(); return; } -#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 36) + /* Change the priority and scheduling policy of main work queue */ if ((handle->params.wq_sched_prio != current->rt_priority) || (handle->params.wq_sched_policy != current->policy)) { +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 10) && \ + LINUX_VERSION_CODE <= KERNEL_VERSION(5, 8, 18) PRINTM(MMSG, - "Set work queue priority %d and scheduling policy %d\n", + "Set main work queue priority %d and scheduling policy %d\n", handle->params.wq_sched_prio, handle->params.wq_sched_policy); + sp.sched_priority = handle->params.wq_sched_prio; sched_setscheduler(current, handle->params.wq_sched_policy, &sp); - } +#elif LINUX_VERSION_CODE > KERNEL_VERSION(5, 13, 19) + PRINTM(MMSG, + "Set main work queue priority %d and scheduling policy %d\n", + handle->params.wq_sched_prio, + handle->params.wq_sched_policy); + attr.sched_policy = handle->params.wq_sched_policy; + attr.sched_nice = DEF_NICE; + attr.sched_priority = handle->params.wq_sched_prio; + sched_setattr_nocheck(current, &attr); #endif + } handle->main_state = MOAL_ENTER_WORK_QUEUE; #ifdef USB @@ -11184,7 +11792,6 @@ moal_handle *woal_add_card(void *card, struct device *dev, moal_if_ops *if_ops, #ifdef IMX_SUPPORT #ifdef SDIO if (IS_SD(handle->card_type)) { - moal_extflg_set(handle, EXT_TX_WORK); moal_extflg_set(handle, EXT_TX_SKB_CLONE); } #endif @@ -11216,6 +11823,14 @@ moal_handle *woal_add_card(void *card, struct device *dev, moal_if_ops *if_ops, PRINTM(MERROR, "Fail to get card info\n"); goto err_kmalloc; } + +#if defined(STA_CFG80211) || defined(UAP_CFG80211) +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) + if (handle->card_info->host_mlme_required == 1) + moal_extflg_set(handle, EXT_HOST_MLME); +#endif +#endif + /** Get card revision */ handle->ops.get_fw_name(handle); #ifdef STA_SUPPORT @@ -11334,27 +11949,85 @@ moal_handle *woal_add_card(void *card, struct device *dev, moal_if_ops *if_ops, #endif #endif - if (!moal_extflg_isset(handle, EXT_NAPI)) { - /* Create workqueue for rx process */ +#if defined(USB) || defined(SDIO) + if (IS_USB(handle->card_type) || IS_SD(handle->card_type)) { + if (!moal_extflg_isset(handle, EXT_NAPI)) { + /* Create workqueue for rx process */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) + /* For kernel less than 2.6.14 name can not be + * greater than 10 characters */ + handle->rx_workqueue = + create_workqueue("MOAL_RX_WORKQ"); +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) + handle->rx_workqueue = alloc_workqueue( + "MOAL_RX_WORK_QUEUE", + WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1); +#else + handle->rx_workqueue = + create_workqueue("MOAL_RX_WORK_QUEUE"); +#endif +#endif + if (!handle->rx_workqueue) { + woal_terminate_workqueue(handle); + goto err_kmalloc; + } + MLAN_INIT_WORK(&handle->rx_work, woal_rx_work_queue); + } + } +#endif + +#ifdef PCIE + if (IS_PCIE(handle->card_type)) { #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) /* For kernel less than 2.6.14 name can not be * greater than 10 characters */ - handle->rx_workqueue = create_workqueue("MOAL_RX_WORKQ"); + handle->pcie_rx_event_workqueue = + create_workqueue("MOAL_PCIE_RX_EVENT_WORKQ"); #else #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) - handle->rx_workqueue = alloc_workqueue( - "MOAL_RX_WORK_QUEUE", + handle->pcie_rx_event_workqueue = alloc_workqueue( + "MOAL_PCIE_RX_EVENT_WORK_QUEUE", WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1); #else - handle->rx_workqueue = create_workqueue("MOAL_RX_WORK_QUEUE"); + handle->pcie_rx_event_workqueue = + create_workqueue("MOAL_PCIE_RX_EVENT_WORK_QUEUE"); #endif #endif - if (!handle->rx_workqueue) { + if (!handle->pcie_rx_event_workqueue) { woal_terminate_workqueue(handle); goto err_kmalloc; } - MLAN_INIT_WORK(&handle->rx_work, woal_rx_work_queue); + MLAN_INIT_WORK(&handle->pcie_rx_event_work, + woal_pcie_rx_event_work_queue); +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) + /* For kernel less than 2.6.14 name can not be + * greater than 10 characters */ + handle->pcie_cmd_resp_workqueue = + create_workqueue("MOAL_PCIE_CMD_RESP_WORKQ"); +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 36) + handle->pcie_cmd_resp_workqueue = alloc_workqueue( + "MOAL_PCIE_CMD_RESP_WORK_QUEUE", + WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, 1); +#else + handle->pcie_cmd_resp_workqueue = + create_workqueue("MOAL_PCIE_CMD_RESP_WORK_QUEUE"); +#endif +#endif + if (!handle->pcie_cmd_resp_workqueue) { + woal_terminate_workqueue(handle); + goto err_kmalloc; + } + MLAN_INIT_WORK(&handle->pcie_cmd_resp_work, + woal_pcie_cmd_resp_work_queue); + tasklet_init(&handle->pcie_tx_complete_task, + woal_pcie_tx_complete_task, (unsigned long)handle); + tasklet_init(&handle->pcie_rx_task, woal_pcie_rx_data_task, + (unsigned long)handle); } +#endif // PCIE + #define NAPI_BUDGET 64 if (moal_extflg_isset(handle, EXT_NAPI)) { init_dummy_netdev(&handle->napi_dev); @@ -11845,7 +12518,7 @@ static int woal_reset_and_reload_fw(moal_handle *handle, t_u8 mode) goto done; } if (IS_SD9098(handle->card_type) || IS_SD9097(handle->card_type) || - IS_SDIW62X(handle->card_type) || IS_SD9177(handle->card_type) || + IS_SDIW624(handle->card_type) || IS_SD9177(handle->card_type) || IS_SDAW693(handle->card_type)) handle->ops.write_reg(handle, 0x00, 0x10); /* Poll register around 100 ms */ @@ -11895,7 +12568,7 @@ static int woal_pcie_reset_and_reload_fw(moal_handle *handle) ENTER(); if (!IS_PCIE9098(handle->card_type) && - !IS_PCIEIW62X(handle->card_type) && + !IS_PCIEIW624(handle->card_type) && !IS_PCIEAW693(handle->card_type) && !IS_PCIE9097(handle->card_type)) { PRINTM(MERROR, "HW don't support PCIE in-band reset\n"); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_main.h b/mxm_wifiex/wlan_src/mlinux/moal_main.h index 45324e7..14ba1bc 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_main.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_main.h @@ -3,7 +3,7 @@ * @brief This file contains wlan driver specific defines etc. * * - * 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 @@ -44,6 +44,9 @@ Change log: #include #include #include +#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 10, 17) +#include +#endif #include #include #include @@ -160,7 +163,9 @@ Change log: #define IMX_ANDROID_12_BACKPORT 0 #if defined(IMX_SUPPORT) + #if defined(IMX_ANDROID) + #if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 15, 52) #undef IMX_ANDROID_13 #define IMX_ANDROID_13 1 @@ -251,12 +256,13 @@ Change log: /** country rgpower mode */ #define CNTRY_RGPOWER_MODE 2 +#define DEF_NICE 20 /** Define BOOLEAN */ typedef t_u8 BOOLEAN; #define INTF_CARDTYPE "----------%s-MM" -#define KERN_VERSION "5X" +#define KERN_VERSION "6X" #define V14 "14" #define V15 "15" @@ -282,6 +288,12 @@ 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 /* Max buffer size */ #define MAX_BUF_LEN 512 @@ -825,6 +837,8 @@ out: /** Custom event : Deep Sleep awake */ #define CUS_EVT_DEEP_SLEEP_AWAKE "EVENT=DS_AWAKE" +#define CUS_EVT_ADDBA_TIMEOUT "EVENT=ADDBA_TIMEOUT" + #define CUS_EVT_TOD_TOA "EVENT=TOD-TOA" /** Custom event : Host Sleep activated */ @@ -1417,25 +1431,13 @@ typedef struct _auto_zero_dfs_cfg { t_u8 dfs_chan_list[MAX_DFS_CHAN_LIST]; } __ATTRIB_PACK__ auto_zero_dfs_cfg; -#if defined(UAP_CFG80211) || defined(STA_CFG80211) -typedef struct _station_node { - /** station aid */ - t_u16 aid; - /** station mac address */ - t_u8 peer_mac[MLAN_MAC_ADDR_LENGTH]; - /** net_device that station is bind to */ - struct net_device *netdev; - /** is valid flag */ - t_u8 is_valid; -} station_node; - -#define EASY_MESH_MULTI_AP_FH_BSS (t_u8)(0x20) -#define EASY_MESH_MULTI_AP_BH_BSS (t_u8)(0x40) -#define EASY_MESH_MULTI_AP_BH_AND_FH_BSS (t_u8)(0x60) - -#define EASY_MESH_MULTI_AP_BSS_MODE_1 (t_u8)(0x01) -#define EASY_MESH_MULTI_AP_BSS_MODE_2 (t_u8)(0x02) -#define EASY_MESH_MULTI_AP_BSS_MODE_3 (t_u8)(0x03) +#ifdef STA_SUPPORT +enum scan_set_band { + SCAN_SETBAND_AUTO = 0, + SCAN_SETBAND_2G = BIT(0), + SCAN_SETBAND_5G = BIT(1), + SCAN_SETBAND_6G = BIT(2), +}; #endif /** Private structure for MOAL */ @@ -1529,6 +1531,10 @@ struct _moal_private { #ifdef STA_SUPPORT /** scan type */ t_u8 scan_type; + + /** set band for scan */ + t_u8 scan_setband_mask; + /** extended capabilities */ ExtCap_t extended_capabilities; /** bg_scan_start */ @@ -1588,6 +1594,8 @@ struct _moal_private { struct net_device *pa_netdev; /** channel parameter for UAP/GO */ t_u16 channel; + /** bandwidth parameter for UAP/GO */ + t_u8 bandwidth; #ifdef UAP_SUPPORT /** wep key */ wep_key uap_wep_key[4]; @@ -1798,23 +1806,9 @@ struct _moal_private { char csi_dump_path[64]; /** CSI config */ mlan_ds_csi_params csi_config; -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) - /** hostcmd_wait_q */ - wait_queue_head_t hostcmd_wait_q __ATTRIB_ALIGN__; - /** hostcmd_wait_condition */ - t_bool hostcmd_wait_condition; -#endif void *rings[RING_ID_MAX]; t_u8 pkt_fate_monitor_enable; void *packet_filter; -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - t_u8 multi_ap_flag; - station_node *vlan_sta_ptr; - station_node *vlan_sta_list[MAX_STA_COUNT]; - moal_private *parent_priv; -#endif -#endif /** txwatchdog disable */ t_u8 txwatchdog_disable; @@ -1894,6 +1888,7 @@ typedef struct _card_info { #endif t_u8 sniffer_support; t_u8 per_pkt_cfg_support; + t_u8 host_mlme_required; } card_info; /** channel_field.flags */ @@ -2329,7 +2324,6 @@ enum ext_mod_params { EXT_AGGR_CTRL, EXT_LOW_PW_MODE, #ifdef SDIO - EXT_SDIO_RX_AGGR, #endif EXT_PMIC, EXT_DISCONNECT_ON_SUSPEND, @@ -2697,14 +2691,30 @@ struct _moal_handle { /** Host Mlme Work struct**/ struct work_struct host_mlme_work; #endif - /** Driver workqueue */ - struct workqueue_struct *rx_workqueue; - /** main work */ - struct work_struct rx_work; /** Driver event workqueue */ struct workqueue_struct *evt_workqueue; /** event work */ struct work_struct evt_work; +#if defined(SDIO) || defined(USB) + /** Driver workqueue */ + struct workqueue_struct *rx_workqueue; + /** main work */ + struct work_struct rx_work; +#endif +#ifdef PCIE + /** Driver pcie rx event workqueue */ + struct workqueue_struct *pcie_rx_event_workqueue; + /** pcie rx event work */ + struct work_struct pcie_rx_event_work; + /** Driver pcie rx cmd resp workqueue */ + struct workqueue_struct *pcie_cmd_resp_workqueue; + /** pcie rx cmd resp work */ + struct work_struct pcie_cmd_resp_work; + /* pcie rx data tasklet */ + struct tasklet_struct pcie_rx_task; + /* pcie tx complete tasklet */ + struct tasklet_struct pcie_tx_complete_task; +#endif /** event spin lock */ spinlock_t evt_lock; /** event queue */ @@ -2713,6 +2723,7 @@ struct _moal_handle { struct workqueue_struct *tx_workqueue; /** tx work */ struct work_struct tx_work; + /** remain on channel flag */ t_u8 remain_on_channel; /** bss index for remain on channel */ @@ -2847,6 +2858,7 @@ struct _moal_handle { struct delayed_work scan_timeout_work; /** scan timeout time */ t_u32 scan_timeout; + #endif #endif /** main state */ @@ -2857,10 +2869,12 @@ struct _moal_handle { t_u8 driver_state; /** ioctl timeout */ t_u8 ioctl_timeout; +#ifdef DUMP_TO_PROC /** Pointer of fw dump buffer */ t_u8 *drv_dump_buf; /** drv dump len */ t_u32 drv_dump_len; +#endif /** FW dump state */ t_u8 fw_dump; /** event fw dump */ @@ -2873,8 +2887,10 @@ struct _moal_handle { t_u64 fw_dump_len; /** fw dump status for each chip, useful in multichip drive */ BOOLEAN fw_dump_status; +#ifdef DUMP_TO_PROC /** Pointer of fw dump buffer */ t_u8 *fw_dump_buf; +#endif /** FW dump full name */ t_u8 firmware_dump_file[128]; @@ -3580,6 +3596,7 @@ void woal_update_firmware_name(moal_handle *handle); /** cancel all works in the queue */ void woal_terminate_workqueue(moal_handle *handle); void woal_flush_workqueue(moal_handle *handle); +void woal_queue_rx_task(moal_handle *handle); /** initializes firmware */ mlan_status woal_init_fw(moal_handle *handle); /** frees the structure of moal_handle */ @@ -3707,6 +3724,7 @@ int woal_enable_hs(moal_private *priv); mlan_status woal_get_wakeup_reason(moal_private *priv, mlan_ds_hs_wakeup_reason *wakeup_reason); int woal_process_proc_hssetpara(moal_handle *handle, t_u8 *buf); +#ifdef DUMP_TO_PROC #define FW_DUMP_INFO_LEN 0x280000 /** mem dump header */ typedef struct { @@ -3725,6 +3743,14 @@ int woal_save_dump_info_to_buf(moal_handle *phandle, t_u8 *src, t_u32 len, t_u32 type); void woal_append_end_block(moal_handle *phandle); t_u8 *woal_dump_drv_info(moal_handle *phandle, t_u32 *dump_len); +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) +void woal_create_dump_dir(moal_handle *phandle, char *dir_buf, int buf_size); +#endif +mlan_status woal_save_dump_info_to_file(char *dir_name, char *file_name, + t_u8 *buf, t_u32 buf_len); +void woal_dump_drv_info(moal_handle *phandle, t_u8 *dir_name); +#endif #define FW_DUMP_TYPE_ENDED 0x002 #define FW_DUMP_TYPE_MEM_ITCM 0x004 @@ -3744,6 +3770,14 @@ void woal_dump_firmware_info_v3(moal_handle *phandle); void woal_store_firmware_dump(moal_handle *phandle, pmlan_event pmevent); void woal_send_fw_dump_complete_event(moal_private *priv); +#ifndef DUMP_TO_PROC +#if defined(PCIE) +void woal_store_ssu_dump(moal_handle *phandle, pmlan_event pmevent); +#endif /* SSU_SUPPORT */ +/** save hostcmd response to file */ +t_void woal_save_host_cmdresp(moal_handle *phandle, mlan_cmdresp_event *pevent); +#endif + int woal_pre_warmreset(moal_private *priv); int woal_warmreset(moal_private *priv); @@ -3970,10 +4004,18 @@ void woal_reassoc_timer_func(void *context); void woal_fw_dump_timer_func(void *context); -t_void woal_main_work_queue(struct work_struct *work); +#if defined(USB) || defined(SDIO) t_void woal_rx_work_queue(struct work_struct *work); +#endif +t_void woal_main_work_queue(struct work_struct *work); t_void woal_evt_work_queue(struct work_struct *work); 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); +#endif + #ifdef STA_CFG80211 t_void woal_scan_timeout_handler(struct work_struct *work); #endif @@ -4093,10 +4135,6 @@ void woal_hist_data_add(moal_private *priv, t_u16 rx_rate, t_s8 snr, t_s8 nflr, mlan_status woal_set_hotspotcfg(moal_private *priv, t_u8 wait_option, t_u32 hotspotcfg); -#if defined(STA_CFG80211) -mlan_status woal_multi_ap_cfg(moal_private *priv, t_u8 wait_option, t_u8 flag); -#endif - mlan_status woal_set_get_wowlan_config(moal_private *priv, t_u16 action, t_u8 wait_option, mlan_ds_misc_mef_flt_cfg *mefcfg); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_pcie.c b/mxm_wifiex/wlan_src/mlinux/moal_pcie.c index 8813cdd..0d35177 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_pcie.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_pcie.c @@ -132,10 +132,10 @@ static const struct pci_device_id wlan_ids[] = { 0, 0, }, -#ifdef PCIEIW62X +#ifdef PCIEIW624 { PCIE_VENDOR_ID_NXP, - PCIE_DEVICE_ID_88WIW62X, + PCIE_DEVICE_ID_88WIW624, PCI_ANY_ID, PCI_ANY_ID, 0, @@ -240,11 +240,11 @@ static t_u16 woal_update_card_type(t_void *card) strlen(driver_version) - strlen(INTF_CARDTYPE) - strlen(KERN_VERSION)); } -#ifdef PCIEIW62X - if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WIW62X) { - card_type = CARD_TYPE_PCIEIW62X; - moal_memcpy_ext(NULL, driver_version, CARD_PCIEIW62X, - strlen(CARD_PCIEIW62X), strlen(driver_version)); +#ifdef PCIEIW624 + if (cardp_pcie->dev->device == PCIE_DEVICE_ID_88WIW624) { + card_type = CARD_TYPE_PCIEIW624; + moal_memcpy_ext(NULL, driver_version, CARD_PCIEIW624, + strlen(CARD_PCIEIW624), strlen(driver_version)); moal_memcpy_ext(NULL, driver_version + strlen(INTF_CARDTYPE) + strlen(KERN_VERSION), @@ -300,7 +300,7 @@ static mlan_status woal_do_flr(moal_handle *handle, bool prepare, bool flr_flag) if (!IS_PCIE8997(handle->card_type) && !IS_PCIE9097(handle->card_type) && - !IS_PCIEIW62X(handle->card_type) && + !IS_PCIEIW624(handle->card_type) && !IS_PCIEAW693(handle->card_type) && !IS_PCIE9098(handle->card_type)) { LEAVE(); @@ -600,7 +600,7 @@ static void woal_pcie_shutdown(struct pci_dev *dev) handle = card->handle; if (handle->second_mac) goto done; - if (IS_PCIE9098(handle->card_type) || IS_PCIEIW62X(handle->card_type) || + 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)) @@ -1132,8 +1132,6 @@ static irqreturn_t woal_pcie_interrupt(int irq, void *dev_id) PRINTM(MINTR, "Receive interrupt in hs_suspended\n"); goto exit; } - queue_work(handle->workqueue, &handle->main_work); - exit: if (ret == MLAN_STATUS_SUCCESS) return IRQ_HANDLED; @@ -1639,7 +1637,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) #endif if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { reg = PCIE9098_SCRATCH_12_REG; @@ -1682,7 +1680,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) i++; } if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { drv_ptr += sprintf( @@ -1704,7 +1702,7 @@ static int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) drv_ptr += sprintf(drv_ptr, "%s\n", buf); } if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { drv_ptr += sprintf(drv_ptr, @@ -1781,7 +1779,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) #endif if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { reg = PCIE9098_SCRATCH_12_REG; @@ -1819,7 +1817,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) i++; } if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { PRINTM(MMSG, "PCIE registers from offset 0x1c20 to 0x1c9c:\n"); @@ -1839,7 +1837,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) PRINTM(MMSG, "%s\n", buf); } if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { PRINTM(MMSG, "ADMA Tx/Rx/Event/Cmd/CmdResp registers:\n"); @@ -1962,7 +1960,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, #endif if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { if (phandle->event_fw_dump) @@ -1981,7 +1979,7 @@ static rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, return RDWR_STATUS_FAILURE; } if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { if (phandle->event_fw_dump || resetflag) @@ -2052,6 +2050,9 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle) t_u8 read_reg = 0; t_u32 memory_size = 0; t_u32 memdump_finsh = 0; +#ifndef DUMP_TO_PROC + t_u8 path_name[64], file_name[32], firmware_dump_file[128]; +#endif t_u8 *end_ptr = NULL; memory_type_mapping *mem_type_mapping_tbl = mem_type_mapping_tbl_8897; @@ -2059,6 +2060,7 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle) PRINTM(MERROR, "Could not dump firmwware info\n"); return; } +#ifdef DUMP_TO_PROC if (!phandle->fw_dump_buf) { ret = moal_vmalloc(phandle, FW_DUMP_INFO_LEN, &(phandle->fw_dump_buf)); @@ -2070,6 +2072,18 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle) memset(phandle->fw_dump_buf, 0x00, FW_DUMP_INFO_LEN); } phandle->fw_dump_len = 0; +#else + memdump_finsh = DEBUG_MEMDUMP_FINISH_8897; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + /** Create dump directory*/ + woal_create_dump_dir(phandle, path_name, sizeof(path_name)); +#else + memset(path_name, 0, sizeof(path_name)); + strcpy(path_name, "/data"); +#endif + PRINTM(MMSG, "Directory name is %s\n", path_name); + woal_dump_drv_info(phandle, path_name); +#endif /* start dump fw memory */ moal_get_system_time(phandle, &sec, &usec); PRINTM(MMSG, "====PCIE DEBUG MODE OUTPUT START: %u.%06u ====\n", sec, @@ -2159,11 +2173,25 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle) (unsigned int)(dbg_ptr - mem_type_mapping_tbl[idx] .mem_Ptr)); +#ifdef DUMP_TO_PROC woal_save_dump_info_to_buf( phandle, mem_type_mapping_tbl[idx].mem_Ptr, memory_size, mem_type_mapping_tbl[idx].type); +#else + memset(file_name, 0, sizeof(file_name)); + sprintf(file_name, "%s%s", "file_pcie_", + mem_type_mapping_tbl[idx].mem_name); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file( + path_name, file_name, + mem_type_mapping_tbl[idx].mem_Ptr, + memory_size)) + PRINTM(MMSG, + "Can't save dump file %s in %s\n", + file_name, path_name); +#endif moal_vfree(phandle, mem_type_mapping_tbl[idx].mem_Ptr); mem_type_mapping_tbl[idx].mem_Ptr = NULL; @@ -2171,11 +2199,20 @@ static void woal_pcie_dump_fw_info_v1(moal_handle *phandle) } } while (1); } +#ifdef DUMP_TO_PROC woal_append_end_block(phandle); +#endif moal_get_system_time(phandle, &sec, &usec); PRINTM(MMSG, "====PCIE DEBUG MODE OUTPUT END: %u.%06u ====\n", sec, usec); /* end dump fw memory */ +#ifndef DUMP_TO_PROC + memset(firmware_dump_file, 0, sizeof(firmware_dump_file)); + sprintf(firmware_dump_file, "%s/%s", path_name, file_name); + moal_memcpy_ext(phandle, phandle->firmware_dump_file, + firmware_dump_file, sizeof(firmware_dump_file), + sizeof(phandle->firmware_dump_file)); +#endif done: for (idx = 0; idx < dump_num && idx < ARRAY_SIZE(mem_type_mapping_tbl_8897); @@ -2208,6 +2245,10 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) t_u8 doneflag = 0; rdwr_status stat; t_u32 memory_size = 0; +#ifndef DUMP_TO_PROC + t_u8 path_name[64], file_name[32], firmware_dump_file[128]; + moal_handle *ref_handle; +#endif t_u8 *end_ptr = NULL; memory_type_mapping *mem_type_mapping_tbl = &mem_type_mapping_tbl_8997; t_u32 dump_start_reg = 0; @@ -2218,7 +2259,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) return; } if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { if (phandle->event_fw_dump) { @@ -2230,6 +2271,20 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) } } } +#ifndef DUMP_TO_PROC +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + /** Create dump directory*/ + woal_create_dump_dir(phandle, path_name, sizeof(path_name)); +#else + memset(path_name, 0, sizeof(path_name)); + strcpy(path_name, "/data"); +#endif + PRINTM(MMSG, "Create DUMP directory success:dir_name=%s\n", path_name); + ref_handle = (moal_handle *)phandle->pref_mac; + if (ref_handle) + woal_dump_drv_info(ref_handle, path_name); + woal_dump_drv_info(phandle, path_name); +#endif /* start dump fw memory */ moal_get_system_time(phandle, &sec, &usec); @@ -2240,7 +2295,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) woal_pcie_rdwr_firmware(phandle, doneflag, 0)) goto done; if (IS_PCIE9098(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { dump_start_reg = PCIE9098_DUMP_START_REG; @@ -2328,6 +2383,7 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) mem_type_mapping_tbl->mem_name, dbg_ptr - mem_type_mapping_tbl->mem_Ptr); #endif +#ifdef DUMP_TO_PROC if (phandle->fw_dump_buf) { moal_vfree(phandle, phandle->fw_dump_buf); phandle->fw_dump_buf = NULL; @@ -2337,6 +2393,20 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) phandle->fw_dump_len = dbg_ptr - mem_type_mapping_tbl->mem_Ptr; mem_type_mapping_tbl->mem_Ptr = NULL; +#else + memset(file_name, 0, sizeof(file_name)); + sprintf(file_name, "%s%s", "file_pcie_", + mem_type_mapping_tbl->mem_name); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file( + path_name, file_name, + mem_type_mapping_tbl->mem_Ptr, + dbg_ptr - mem_type_mapping_tbl->mem_Ptr)) + PRINTM(MMSG, "Can't save dump file %s in %s\n", + file_name, path_name); + moal_vfree(phandle, mem_type_mapping_tbl->mem_Ptr); + mem_type_mapping_tbl->mem_Ptr = NULL; +#endif break; } } while (1); @@ -2344,6 +2414,13 @@ static void woal_pcie_dump_fw_info_v2(moal_handle *phandle) PRINTM(MMSG, "====PCIE DEBUG MODE OUTPUT END: %u.%06u ====\n", sec, usec); /* end dump fw memory */ +#ifndef DUMP_TO_PROC + memset(firmware_dump_file, 0, sizeof(firmware_dump_file)); + sprintf(firmware_dump_file, "%s/%s", path_name, file_name); + moal_memcpy_ext(phandle, phandle->firmware_dump_file, + firmware_dump_file, sizeof(firmware_dump_file), + sizeof(phandle->firmware_dump_file)); +#endif done: if (mem_type_mapping_tbl->mem_Ptr) { moal_vfree(phandle, mem_type_mapping_tbl->mem_Ptr); @@ -2371,10 +2448,12 @@ static t_u8 woal_pcie_is_second_mac(moal_handle *handle) static void woal_pcie_dump_fw_info(moal_handle *phandle) { +#ifdef DUMP_TO_PROC if (phandle->fw_dump_buf) { PRINTM(MERROR, "FW dump already exist\n"); return; } +#endif mlan_pm_wakeup_card(phandle->pmlan_adapter, MTRUE); phandle->fw_dump = MTRUE; #ifdef PCIE8897 @@ -2383,7 +2462,7 @@ static void woal_pcie_dump_fw_info(moal_handle *phandle) #endif if (IS_PCIE8997(phandle->card_type) || IS_PCIEAW693(phandle->card_type) || - IS_PCIEIW62X(phandle->card_type) || + IS_PCIEIW624(phandle->card_type) || IS_PCIE9098(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { woal_pcie_dump_fw_info_v2(phandle); @@ -2418,7 +2497,7 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle) t_u32 magic_reg = handle->card_info->magic_reg; t_u32 strap = 0; t_u32 magic = 0; -#ifdef PCIEIW62X +#ifdef PCIEIW624 t_u32 boot_mode_reg = handle->card_info->boot_mode_reg; t_u32 boot_mode; #endif @@ -2603,8 +2682,8 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle) } } } -#ifdef PCIEIW62X - if (IS_PCIEIW62X(handle->card_type)) { +#ifdef PCIEIW624 + if (IS_PCIEIW624(handle->card_type)) { woal_pcie_read_reg(handle, rev_id_reg, &revision_id); woal_pcie_read_reg(handle, host_strap_reg, &strap); woal_pcie_read_reg(handle, magic_reg, &magic); @@ -2617,13 +2696,13 @@ static mlan_status woal_pcie_get_fw_name(moal_handle *handle) "magic=0x%x boot_mode=0x%x, strap=0x%x, revision_id=0x%x\n", magic, boot_mode, strap, revision_id); if (boot_mode == 0x03) - PRINTM(MMSG, "wlan: PCIE-IW62X in secure-boot mode\n"); - if (strap == CARD_TYPE_PCIE_UART) + PRINTM(MMSG, "wlan: PCIE-IW624 in secure-boot mode\n"); + if (strap == CARD_TYPE_PCIEIW624_UART) strcpy(handle->card_info->fw_name, - PCIEUARTIW62X_DEFAULT_COMBO_FW_NAME); + PCIEUARTIW624_DEFAULT_COMBO_FW_NAME); else strcpy(handle->card_info->fw_name, - PCIEUSBIW62X_DEFAULT_COMBO_FW_NAME); + PCIEUSBIW624_DEFAULT_COMBO_FW_NAME); } #endif done: diff --git a/mxm_wifiex/wlan_src/mlinux/moal_pcie.h b/mxm_wifiex/wlan_src/mlinux/moal_pcie.h index 006fc5d..3037d71 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_pcie.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_pcie.h @@ -52,9 +52,9 @@ Change log: /** PCIE device ID for 9098 card FN1 */ #define PCIE_DEVICE_ID_88W9098P_FN1 (0x2b44) -#ifdef PCIEIW62X -/** PCIE device ID for IW62X card FN0 */ -#define PCIE_DEVICE_ID_88WIW62X (0x3000) +#ifdef PCIEIW624 +/** PCIE device ID for IW624 card FN0 */ +#define PCIE_DEVICE_ID_88WIW624 (0x3000) #endif /** PCIE device ID for AW693 card FN0 */ @@ -120,12 +120,12 @@ Change log: #define PCIE9097_WLAN_V1_FW_NAME "nxp/pcieiw620_wlan_v1.bin" #endif /* PCIE9097 */ -#ifdef PCIEIW62X -#define PCIEIW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw62x_combo.bin" -#define PCIEUARTIW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieuartiw62x_combo.bin" -#define PCIEUSBIW62X_DEFAULT_COMBO_FW_NAME "nxp/pcieusbiw62x_combo.bin" -#define PCIEIW62X_DEFAULT_WLAN_FW_NAME "nxp/pcieiw62x_wlan.bin" -#endif /* PCIEIW62X */ +#ifdef PCIEIW624 +#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 PCIEIW624_DEFAULT_WLAN_FW_NAME "nxp/pcieiw624_wlan.bin" +#endif /* PCIEIW624 */ #define PCIE_NUM_MSIX_VECTORS 32 diff --git a/mxm_wifiex/wlan_src/mlinux/moal_proc.c b/mxm_wifiex/wlan_src/mlinux/moal_proc.c index 93f9708..73058c4 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_proc.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_proc.c @@ -566,7 +566,7 @@ 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_CARDIW62X(priv->phandle->card_type)) { + IS_CARDIW624(priv->phandle->card_type)) { woal_cfg80211_notify_antcfg(priv, priv->phandle->wiphy, radio); } @@ -1081,6 +1081,7 @@ static const struct file_operations config_proc_fops = { }; #endif +#ifdef DUMP_TO_PROC static int woal_drv_dump_read(struct seq_file *sfp, void *data) { moal_handle *handle = (moal_handle *)sfp->private; @@ -1234,6 +1235,7 @@ static const struct file_operations fw_dump_fops = { .release = single_release, }; #endif +#endif /** * @brief wifi status proc read function @@ -1305,11 +1307,11 @@ int woal_string_to_number(char *s) if (!strncmp(s, "-", 1)) { pn = -1; - s++; + s = (char *)(s + 1); } if (!strncmp(s, "0x", 2) || !strncmp(s, "0X", 2)) { base = 16; - s += 2; + s = (char *)(s + 2); } else base = 10; @@ -1387,8 +1389,10 @@ void woal_proc_init(moal_handle *handle) struct proc_dir_entry *pde = proc_mwlan; #endif char config_proc_dir[20]; +#ifdef DUMP_TO_PROC char drv_dump_dir[20]; char fw_dump_dir[20]; +#endif ENTER(); @@ -1444,6 +1448,7 @@ void woal_proc_init(moal_handle *handle) if (!r) PRINTM(MERROR, "Fail to create proc config\n"); +#ifdef DUMP_TO_PROC strncpy(drv_dump_dir, "drv_dump", sizeof(drv_dump_dir)); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26) r = proc_create_data(drv_dump_dir, 0644, handle->proc_wlan, @@ -1471,6 +1476,7 @@ void woal_proc_init(moal_handle *handle) #endif if (!r) PRINTM(MERROR, "Failed to create proc fw dump\n"); +#endif done: LEAVE(); @@ -1486,8 +1492,10 @@ done: void woal_proc_exit(moal_handle *handle) { char config_proc_dir[20]; +#ifdef DUMP_TO_PROC char drv_dump_dir[20]; char fw_dump_dir[20]; +#endif ENTER(); @@ -1495,10 +1503,12 @@ void woal_proc_exit(moal_handle *handle) if (handle->proc_wlan) { strncpy(config_proc_dir, "config", sizeof(config_proc_dir)); remove_proc_entry(config_proc_dir, handle->proc_wlan); +#ifdef DUMP_TO_PROC strncpy(drv_dump_dir, "drv_dump", sizeof(drv_dump_dir)); remove_proc_entry(drv_dump_dir, handle->proc_wlan); strncpy(fw_dump_dir, "fw_dump", sizeof(fw_dump_dir)); remove_proc_entry(fw_dump_dir, handle->proc_wlan); +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0) /* Remove only if we are the only instance using this */ @@ -1516,6 +1526,7 @@ void woal_proc_exit(moal_handle *handle) } #endif } +#ifdef DUMP_TO_PROC if (handle->fw_dump_buf) { moal_vfree(handle, handle->fw_dump_buf); handle->fw_dump_buf = NULL; @@ -1526,6 +1537,7 @@ void woal_proc_exit(moal_handle *handle) handle->drv_dump_len = 0; handle->drv_dump_buf = NULL; } +#endif LEAVE(); } diff --git a/mxm_wifiex/wlan_src/mlinux/moal_sdio.h b/mxm_wifiex/wlan_src/mlinux/moal_sdio.h index 550d56b..ed83b79 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_sdio.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_sdio.h @@ -139,12 +139,12 @@ Change log: #define SD9097_WLAN_V1_FW_NAME "nxp/sdiw620_wlan_v1.bin" #endif /* SD9097 */ -#ifdef SDIW62X -#define SDIW62X_DEFAULT_COMBO_FW_NAME "nxp/sdsd_iw62x.bin" -#define SDUARTIW62X_COMBO_FW_NAME "nxp/sduart_iw62x.bin" -#define SDSDIW62X_COMBO_FW_NAME "sdsd_iw62x.bin" -#define SDIW62X_DEFAULT_WLAN_FW_NAME "nxp/sd_iw62x.bin" -#endif /* SDIW62X */ +#ifdef SDIW624 +#define SDIW624_DEFAULT_COMBO_FW_NAME "nxp/sdsdiw624_combo.bin" +#define SDUARTIW624_COMBO_FW_NAME "nxp/sduartiw624_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" diff --git a/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c b/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c index 077dcf0..3d95ab7 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c @@ -89,9 +89,9 @@ static moal_if_ops sdiommc_ops; /** Device ID for SD9177 */ #define SD_DEVICE_ID_9177 (0x0205) #endif -#ifdef SDIW62X -/** Device ID for SDIW62X */ -#define SD_DEVICE_ID_IW62X (0x020D) +#ifdef SDIW624 +/** Device ID for SDIW624 */ +#define SD_DEVICE_ID_IW624 (0x020D) #endif /** WLAN IDs */ @@ -129,8 +129,8 @@ static const struct sdio_device_id wlan_ids[] = { #ifdef SD9177 {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_9177)}, #endif -#ifdef SDIW62X - {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_IW62X)}, +#ifdef SDIW624 + {SDIO_DEVICE(NXP_VENDOR_ID, SD_DEVICE_ID_IW624)}, #endif {}, }; @@ -250,6 +250,7 @@ static void woal_sdio_interrupt(struct sdio_func *func) { moal_handle *handle; struct sdio_mmc_card *card; + mlan_status status; ENTER(); @@ -271,7 +272,10 @@ static void woal_sdio_interrupt(struct sdio_func *func) PRINTM(MINTR, "*\n"); /* call mlan_interrupt to read int status */ - mlan_interrupt(0, handle->pmlan_adapter); + status = mlan_interrupt(0, handle->pmlan_adapter); + if (status == MLAN_STATUS_FAILURE) { + PRINTM(MINTR, "mlan interrupt failed\n"); + } #ifdef SDIO_SUSPEND_RESUME if (handle->is_suspended) { PRINTM(MINTR, "Receive interrupt in hs_suspended\n"); @@ -281,7 +285,10 @@ static void woal_sdio_interrupt(struct sdio_func *func) #endif handle->main_state = MOAL_START_MAIN_PROCESS; /* Call MLAN main process */ - mlan_main_process(handle->pmlan_adapter); + status = mlan_main_process(handle->pmlan_adapter); + if (status == MLAN_STATUS_FAILURE) { + PRINTM(MINTR, "mlan main process exited with failure\n"); + } handle->main_state = MOAL_END_MAIN_PROCESS; LEAVE(); } @@ -398,11 +405,11 @@ static t_u16 woal_update_card_type(t_void *card) (strlen(INTF_CARDTYPE) + strlen(KERN_VERSION))); } #endif -#ifdef SDIW62X - if (cardp_sd->func->device == SD_DEVICE_ID_IW62X) { - card_type = CARD_TYPE_SDIW62X; - moal_memcpy_ext(NULL, driver_version, CARD_SDIW62X, - strlen(CARD_SDIW62X), strlen(driver_version)); +#ifdef SDIW624 + if (cardp_sd->func->device == SD_DEVICE_ID_IW624) { + card_type = CARD_TYPE_SDIW624; + moal_memcpy_ext(NULL, driver_version, CARD_SDIW624, + strlen(CARD_SDIW624), strlen(driver_version)); moal_memcpy_ext( NULL, driver_version + strlen(INTF_CARDTYPE) + @@ -665,9 +672,12 @@ void woal_sdio_shutdown(struct device *dev) ) { PRINTM(MIOCTL, "disconnect on suspend\n"); - woal_disconnect(handle->priv[i], - MOAL_NO_WAIT, NULL, - DEF_DEAUTH_REASON_CODE); + if (woal_disconnect( + handle->priv[i], + MOAL_NO_WAIT, NULL, + DEF_DEAUTH_REASON_CODE)) + PRINTM(MERROR, + "failed to disconnect on suspend\n"); } } } @@ -1580,17 +1590,17 @@ static mlan_status woal_sdiommc_get_fw_name(moal_handle *handle) } } -#ifdef SDIW62X - if (IS_SDIW62X(handle->card_type)) { +#ifdef SDIW624 + if (IS_SDIW624(handle->card_type)) { magic &= 0x03; if (magic == 0x03) - PRINTM(MMSG, "wlan: SDIW62X in secure-boot mode\n"); - if (strap == CARD_TYPE_SD_UART) + PRINTM(MMSG, "wlan: SDIW624 in secure-boot mode\n"); + if (strap == CARD_TYPE_SDIW624_UART) strncpy(handle->card_info->fw_name, - SDUARTIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); + SDUARTIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN); else strncpy(handle->card_info->fw_name, - SDSDIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); + SDSDIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN); } #endif @@ -1662,6 +1672,9 @@ done: #define DEBUG_MEMDUMP_FINISH 0xFE #define MAX_POLL_TRIES 100 +#define HOST_TO_CARD_EVENT_REG 0x00 +#define HOST_TO_CARD_EVENT MBIT(3) + typedef enum { DUMP_TYPE_ITCM = 0, DUMP_TYPE_DTCM = 1, @@ -1714,10 +1727,12 @@ static memory_type_mapping mem_type_mapping_tbl_8977_8997 = {"DUMP", NULL, NULL, * * @param phandle A pointer to moal_handle * @param doneflag A flag + * @param trigger trigger FW dump flag * * @return MLAN_STATUS_SUCCESS */ -static rdwr_status woal_cmd52_rdwr_firmware(moal_handle *phandle, t_u8 doneflag) +static rdwr_status woal_cmd52_rdwr_firmware(moal_handle *phandle, t_u8 doneflag, + t_u8 trigger) { int ret = 0; int tries = 0; @@ -1736,6 +1751,16 @@ static rdwr_status woal_cmd52_rdwr_firmware(moal_handle *phandle, t_u8 doneflag) PRINTM(MERROR, "SDIO Write ERR\n"); return RDWR_STATUS_FAILURE; } + if (trigger) { + PRINTM(MMSG, "Trigger FW dump...\n"); + ret = woal_sdio_writeb(phandle, HOST_TO_CARD_EVENT_REG, + HOST_TO_CARD_EVENT); + if (ret) { + PRINTM(MERROR, "Fail to set HOST_TO_CARD_EVENT_REG\n"); + return RDWR_STATUS_FAILURE; + } + } + #ifdef SD9177 if (IS_SD9177(phandle->card_type)) { if (phandle->event_fw_dump) @@ -1799,6 +1824,9 @@ void woal_dump_firmware_info(moal_handle *phandle) { int ret = 0; unsigned int reg, reg_start, reg_end; +#ifndef DUMP_TO_PROC + t_u8 path_name[64], file_name[32]; +#endif t_u8 *ITCM_Ptr = NULL; t_u8 *DTCM_Ptr = NULL; t_u8 *SQRAM_Ptr = NULL; @@ -1814,6 +1842,7 @@ void woal_dump_firmware_info(moal_handle *phandle) PRINTM(MERROR, "Could not dump firmwware info\n"); return; } +#ifdef DUMP_TO_PROC if (!phandle->fw_dump_buf) { ret = moal_vmalloc(phandle, FW_DUMP_INFO_LEN, &(phandle->fw_dump_buf)); @@ -1825,6 +1854,17 @@ void woal_dump_firmware_info(moal_handle *phandle) memset(phandle->fw_dump_buf, 0x00, FW_DUMP_INFO_LEN); } phandle->fw_dump_len = 0; +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + /** Create dump directort*/ + woal_create_dump_dir(phandle, path_name, sizeof(path_name)); +#else + memset(path_name, 0, sizeof(path_name)); + strncpy(path_name, "/data", sizeof(path_name)); +#endif + PRINTM(MMSG, "Directory name is %s\n", path_name); + woal_dump_drv_info(phandle, path_name); +#endif #if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 32) sdio_claim_host(((struct sdio_mmc_card *)phandle->card)->func); @@ -1922,8 +1962,19 @@ void woal_dump_firmware_info(moal_handle *phandle) PRINTM(MMSG, "ITCM done: size=0x%x\n", dbg_ptr - ITCM_Ptr); #endif +#ifdef DUMP_TO_PROC woal_save_dump_info_to_buf(phandle, ITCM_Ptr, ITCM_SIZE, FW_DUMP_TYPE_MEM_ITCM); +#else + memset(file_name, 0, sizeof(file_name)); + snprintf(file_name, sizeof(file_name), "%s", + "file_sdio_ITCM"); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file(path_name, file_name, + ITCM_Ptr, ITCM_SIZE)) + PRINTM(MMSG, "Can't save dump file %s in %s\n", + file_name, path_name); +#endif dbg_ptr = DTCM_Ptr; end_ptr = DTCM_Ptr + dtcm_size; moal_get_system_time(phandle, &sec, &usec); @@ -1939,8 +1990,19 @@ void woal_dump_firmware_info(moal_handle *phandle) PRINTM(MMSG, "DTCM done: size=0x%x\n", dbg_ptr - DTCM_Ptr); #endif +#ifdef DUMP_TO_PROC woal_save_dump_info_to_buf(phandle, ITCM_Ptr, dtcm_size, FW_DUMP_TYPE_MEM_DTCM); +#else + memset(file_name, 0, sizeof(file_name)); + snprintf(file_name, sizeof(file_name), "%s", + "file_sdio_DTCM"); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file(path_name, file_name, + DTCM_Ptr, dtcm_size)) + PRINTM(MMSG, "Can't save dump file %s in %s\n", + file_name, path_name); +#endif dbg_ptr = SQRAM_Ptr; end_ptr = SQRAM_Ptr + sqram_size; moal_get_system_time(phandle, &sec, &usec); @@ -1956,9 +2018,20 @@ void woal_dump_firmware_info(moal_handle *phandle) PRINTM(MMSG, "SQRAM done: size=0x%x\n", dbg_ptr - SQRAM_Ptr); #endif +#ifdef DUMP_TO_PROC woal_save_dump_info_to_buf(phandle, SQRAM_Ptr, sqram_size, FW_DUMP_TYPE_MEM_SQRAM); +#else + memset(file_name, 0, sizeof(file_name)); + snprintf(file_name, sizeof(file_name), "%s", + "file_sdio_SQRAM"); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file(path_name, file_name, + SQRAM_Ptr, sqram_size)) + PRINTM(MMSG, "Can't save dump file %s in %s\n", + file_name, path_name); +#endif PRINTM(MMSG, "End output!\n"); break; default: @@ -1966,7 +2039,9 @@ void woal_dump_firmware_info(moal_handle *phandle) } } while (ctrl_data != DEBUG_SQRAM_DONE); +#ifdef DUMP_TO_PROC woal_append_end_block(phandle); +#endif PRINTM(MMSG, "The output ITCM/DTCM/SQRAM have been saved to files successfully!\n"); moal_get_system_time(phandle, &sec, &usec); @@ -2007,6 +2082,9 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) t_u8 i = 0; t_u8 read_reg = 0; t_u32 memory_size = 0; +#ifndef DUMP_TO_PROC + t_u8 path_name[64], file_name[32], firmware_dump_file[128]; +#endif t_u8 *end_ptr = NULL; t_u8 dbg_dump_start_reg = 0; t_u8 dbg_dump_end_reg = 0; @@ -2021,6 +2099,7 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) dbg_dump_end_reg = phandle->card_info->dump_fw_end_reg; dbg_dump_ctrl_reg = phandle->card_info->dump_fw_ctrl_reg; +#ifdef DUMP_TO_PROC if (!phandle->fw_dump_buf) { ret = moal_vmalloc(phandle, FW_DUMP_INFO_LEN, &(phandle->fw_dump_buf)); @@ -2032,12 +2111,25 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) memset(phandle->fw_dump_buf, 0x00, FW_DUMP_INFO_LEN); } phandle->fw_dump_len = 0; +#else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + /** Create dump directort*/ + woal_create_dump_dir(phandle, path_name, sizeof(path_name)); +#else + memset(path_name, 0, sizeof(path_name)); + strncpy(path_name, "/data", sizeof(path_name)); +#endif + PRINTM(MMSG, "Directory name is %s\n", path_name); + + woal_dump_drv_info(phandle, path_name); +#endif /* start dump fw memory */ moal_get_system_time(phandle, &sec, &usec); 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)) + 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); @@ -2049,7 +2141,7 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) /* read the length of every memory which will dump */ for (idx = 0; idx < dump_num; idx++) { if (RDWR_STATUS_FAILURE == - woal_cmd52_rdwr_firmware(phandle, doneflag)) + woal_cmd52_rdwr_firmware(phandle, doneflag, MFALSE)) goto done; memory_size = 0; reg = dbg_dump_start_reg; @@ -2093,7 +2185,8 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) PRINTM(MMSG, "Start %s output %u.%06u, please wait...\n", mem_type_mapping_tbl[idx].mem_name, sec, usec); do { - stat = woal_cmd52_rdwr_firmware(phandle, doneflag); + stat = woal_cmd52_rdwr_firmware(phandle, doneflag, + MFALSE); if (RDWR_STATUS_FAILURE == stat) goto done; reg_start = dbg_dump_start_reg; @@ -2126,11 +2219,26 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) dbg_ptr - mem_type_mapping_tbl[idx] .mem_Ptr); #endif +#ifdef DUMP_TO_PROC woal_save_dump_info_to_buf( phandle, mem_type_mapping_tbl[idx].mem_Ptr, memory_size, mem_type_mapping_tbl[idx].type); +#else + memset(file_name, 0, sizeof(file_name)); + snprintf(file_name, sizeof(file_name), "%s%s", + "file_sdio_", + mem_type_mapping_tbl[idx].mem_name); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file( + path_name, file_name, + mem_type_mapping_tbl[idx].mem_Ptr, + memory_size)) + PRINTM(MERROR, + "Can't save dump file %s in %s\n", + file_name, path_name); +#endif moal_vfree(phandle, mem_type_mapping_tbl[idx].mem_Ptr); mem_type_mapping_tbl[idx].mem_Ptr = NULL; @@ -2138,10 +2246,20 @@ void woal_dump_firmware_info_v2(moal_handle *phandle) } } while (1); } +#ifdef DUMP_TO_PROC woal_append_end_block(phandle); +#endif moal_get_system_time(phandle, &sec, &usec); PRINTM(MMSG, "==== DEBUG MODE OUTPUT END: %u.%06u ====\n", sec, usec); /* end dump fw memory */ +#ifndef DUMP_TO_PROC + memset(firmware_dump_file, 0, sizeof(firmware_dump_file)); + snprintf(firmware_dump_file, sizeof(firmware_dump_file), "%s/%s", + path_name, file_name); + moal_memcpy_ext(phandle, phandle->firmware_dump_file, + firmware_dump_file, sizeof(firmware_dump_file), + sizeof(phandle->firmware_dump_file)); +#endif done: for (idx = 0; idx < dump_num; idx++) { if (mem_type_mapping_tbl[idx].mem_Ptr) { @@ -2172,6 +2290,10 @@ void woal_dump_firmware_info_v3(moal_handle *phandle) t_u8 doneflag = 0; rdwr_status stat; t_u32 memory_size = 0; +#ifndef DUMP_TO_PROC + t_u8 path_name[64], file_name[32], firmware_dump_file[128]; + moal_handle *ref_handle; +#endif t_u8 *end_ptr = NULL; t_u8 dbg_dump_start_reg = 0; t_u8 dbg_dump_end_reg = 0; @@ -2186,7 +2308,8 @@ void woal_dump_firmware_info_v3(moal_handle *phandle) if (IS_SD9177(phandle->card_type)) { if (phandle->event_fw_dump) { if (RDWR_STATUS_FAILURE != - woal_cmd52_rdwr_firmware(phandle, doneflag)) { + woal_cmd52_rdwr_firmware(phandle, doneflag, + MTRUE)) { PRINTM(MMSG, "====SDIO FW DUMP EVENT MODE START ====\n"); return; @@ -2198,11 +2321,27 @@ void woal_dump_firmware_info_v3(moal_handle *phandle) dbg_dump_start_reg = phandle->card_info->dump_fw_start_reg; dbg_dump_end_reg = phandle->card_info->dump_fw_end_reg; +#ifndef DUMP_TO_PROC +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) + /** Create dump directort*/ + woal_create_dump_dir(phandle, path_name, sizeof(path_name)); +#else + memset(path_name, 0, sizeof(path_name)); + strncpy(path_name, "/data", sizeof(path_name)); +#endif + PRINTM(MMSG, "Directory name is %s\n", path_name); + ref_handle = (moal_handle *)phandle->pref_mac; + if (ref_handle) + woal_dump_drv_info(ref_handle, path_name); + woal_dump_drv_info(phandle, path_name); +#endif + /* start dump fw memory */ moal_get_system_time(phandle, &sec, &usec); 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)) + if (RDWR_STATUS_FAILURE == + woal_cmd52_rdwr_firmware(phandle, doneflag, MTRUE)) goto done; /** check the reg which indicate dump starting */ @@ -2240,7 +2379,7 @@ void woal_dump_firmware_info_v3(moal_handle *phandle) PRINTM(MMSG, "Start %s output %u.%06u, please wait...\n", pmem_type_mapping_tbl->mem_name, sec, usec); do { - stat = woal_cmd52_rdwr_firmware(phandle, doneflag); + stat = woal_cmd52_rdwr_firmware(phandle, doneflag, MFALSE); if (RDWR_STATUS_FAILURE == stat) goto done; reg_start = dbg_dump_start_reg; @@ -2296,6 +2435,7 @@ void woal_dump_firmware_info_v3(moal_handle *phandle) dbg_ptr - pmem_type_mapping_tbl->mem_Ptr); #endif +#ifdef DUMP_TO_PROC if (phandle->fw_dump_buf) { moal_vfree(phandle, phandle->fw_dump_buf); phandle->fw_dump_buf = NULL; @@ -2305,12 +2445,35 @@ void woal_dump_firmware_info_v3(moal_handle *phandle) phandle->fw_dump_len = dbg_ptr - pmem_type_mapping_tbl->mem_Ptr; pmem_type_mapping_tbl->mem_Ptr = NULL; +#else + memset(file_name, 0, sizeof(file_name)); + snprintf(file_name, sizeof(file_name), "%s%s", + "file_sdio_", pmem_type_mapping_tbl->mem_name); + if (MLAN_STATUS_SUCCESS != + woal_save_dump_info_to_file( + path_name, file_name, + pmem_type_mapping_tbl->mem_Ptr, + dbg_ptr - pmem_type_mapping_tbl->mem_Ptr)) + PRINTM(MERROR, + "Can't save dump file %s in %s\n", + file_name, path_name); + moal_vfree(phandle, pmem_type_mapping_tbl->mem_Ptr); + pmem_type_mapping_tbl->mem_Ptr = NULL; +#endif break; } } while (1); moal_get_system_time(phandle, &sec, &usec); PRINTM(MMSG, "==== DEBUG MODE OUTPUT END: %u.%06u ====\n", sec, usec); /* end dump fw memory */ +#ifndef DUMP_TO_PROC + memset(firmware_dump_file, 0, sizeof(firmware_dump_file)); + snprintf(firmware_dump_file, sizeof(firmware_dump_file), "%s/%s", + path_name, file_name); + moal_memcpy_ext(phandle, phandle->firmware_dump_file, + firmware_dump_file, sizeof(firmware_dump_file), + sizeof(phandle->firmware_dump_file)); +#endif done: if (pmem_type_mapping_tbl->mem_Ptr) { moal_vfree(phandle, pmem_type_mapping_tbl->mem_Ptr); @@ -2410,10 +2573,12 @@ static void woal_sdiommc_dump_fw_info(moal_handle *phandle) PRINTM(MERROR, "Could not dump firmwware info\n"); return; } +#ifdef DUMP_TO_PROC if (phandle->fw_dump_buf) { PRINTM(MERROR, "FW dump already exist\n"); return; } +#endif /** cancel all pending commands */ mlan_ioctl(phandle->pmlan_adapter, NULL); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_shim.c b/mxm_wifiex/wlan_src/mlinux/moal_shim.c index 063c7eb..497287c 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_shim.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_shim.c @@ -1886,32 +1886,6 @@ done: #endif #endif -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) -/** - * @brief This function get binded net_device from station list - * - * @param priv Pointer to structure moal_private - * @param aid station aid from mlan - * - * @return binded net_device pointer or NULL if not found - */ -struct net_device *moal_get_netdev_from_stalist(moal_private *priv, t_u16 aid) -{ - station_node *sta_node = NULL; - - ENTER(); - sta_node = priv->vlan_sta_list[(aid - 1) % MAX_STA_COUNT]; - if (sta_node) { - LEAVE(); - return sta_node->netdev; - } - LEAVE(); - return NULL; -} -#endif -#endif - /** * @brief This function uploads amsdu packet to the network stack * @@ -2114,11 +2088,6 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf) int j; struct ethhdr *ethh = NULL; struct net_device *netdev = NULL; -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - t_u16 aid = 0; -#endif -#endif ENTER(); if (pmbuf) { @@ -2235,23 +2204,6 @@ mlan_status moal_recv_packet(t_void *pmoal, pmlan_buffer pmbuf) priv->deauth_evt_cnt = 0; #endif } -#ifdef UAP_SUPPORT -#if defined(UAP_CFG80211) || defined(STA_CFG80211) - if (pmbuf->flags & MLAN_BUF_FLAG_EASYMESH) { - aid = (pmbuf->priority & 0xFF000000) >> 24; - if (!priv->vlan_sta_list[(aid - 1) % - MAX_STA_COUNT] - ->is_valid) { - status = MLAN_STATUS_FAILURE; - priv->stats.rx_dropped++; - goto done; - } - if (aid != 0) - netdev = moal_get_netdev_from_stalist( - priv, aid); - } -#endif -#endif if (!netdev) netdev = priv->netdev; skb->dev = netdev; @@ -2561,6 +2513,88 @@ static void woal_rx_mgmt_pkt_event(moal_private *priv, t_u8 *pkt, t_u16 len) #endif #endif +/** + * @brief This function handles defer event receive + * + * @param handle Pointer to the moal_handle + * @param event_id event id + * + * @return MLAN_STATUS_SUCCESS + */ +static mlan_status wlan_process_defer_event(moal_handle *handle, + mlan_event_id event_id) +{ + mlan_status status = MLAN_STATUS_FAILURE; + ENTER(); + switch (event_id) { +#ifdef PCIE + case MLAN_EVENT_ID_DRV_DEFER_RX_DATA: + status = MLAN_STATUS_SUCCESS; + tasklet_schedule(&handle->pcie_rx_task); + break; + case MLAN_EVENT_ID_DRV_DEFER_RX_EVENT: + status = MLAN_STATUS_SUCCESS; + queue_work(handle->pcie_rx_event_workqueue, + &handle->pcie_rx_event_work); + break; + case MLAN_EVENT_ID_DRV_DEFER_CMDRESP: + status = MLAN_STATUS_SUCCESS; + queue_work(handle->pcie_cmd_resp_workqueue, + &handle->pcie_cmd_resp_work); + break; + case MLAN_EVENT_ID_DRV_DEFER_TX_COMPLTE: + status = MLAN_STATUS_SUCCESS; + tasklet_schedule(&handle->pcie_tx_complete_task); + break; +#endif /* PCIE */ + + case MLAN_EVENT_ID_DRV_FLUSH_RX_WORK: + status = MLAN_STATUS_SUCCESS; + if (moal_extflg_isset(handle, EXT_NAPI)) { + napi_synchronize(&handle->napi_rx); + break; + } +#ifdef PCIE + if (IS_PCIE(handle->card_type)) { + tasklet_kill(&handle->pcie_rx_task); + break; + } +#endif +#if defined(SDIO) || defined(USB) + flush_workqueue(handle->rx_workqueue); +#endif + break; + case MLAN_EVENT_ID_DRV_FLUSH_MAIN_WORK: + status = MLAN_STATUS_SUCCESS; + flush_workqueue(handle->workqueue); + break; + case MLAN_EVENT_ID_DRV_DEFER_HANDLING: + status = MLAN_STATUS_SUCCESS; + queue_work(handle->workqueue, &handle->main_work); + break; + case MLAN_EVENT_ID_DRV_DEFER_RX_WORK: + status = MLAN_STATUS_SUCCESS; + if (moal_extflg_isset(handle, EXT_NAPI)) { + napi_schedule(&handle->napi_rx); + break; + } +#ifdef PCIE + if (IS_PCIE(handle->card_type)) { + tasklet_schedule(&handle->pcie_rx_task); + break; + } +#endif +#if defined(USB) || defined(SDIO) + queue_work(handle->rx_workqueue, &handle->rx_work); +#endif + break; + default: + break; + } + LEAVE(); + return status; +} + /** * @brief This function handles event receive * @@ -2634,6 +2668,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) unsigned long wait_time, wait_time_ms, timeout; #endif #endif + char iwevent_str[256]; + addba_timeout_event *evtbuf = NULL; t_u8 auto_fw_dump = MFALSE; ENTER(); @@ -2651,16 +2687,23 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) ref_handle->driver_status = MTRUE; goto done; } - if ((pmevent->event_id != MLAN_EVENT_ID_DRV_DEFER_RX_WORK) && - (pmevent->event_id != MLAN_EVENT_ID_DRV_DEFER_HANDLING) && - (pmevent->event_id != MLAN_EVENT_ID_DRV_MGMT_FRAME)) + if (MLAN_STATUS_SUCCESS == + wlan_process_defer_event(handle, pmevent->event_id)) + goto done; + if (pmevent->event_id != MLAN_EVENT_ID_DRV_MGMT_FRAME) PRINTM(MEVENT, "event id:0x%x\n", pmevent->event_id); #if defined(PCIE) if (pmevent->event_id == MLAN_EVENT_ID_SSU_DUMP_FILE) { +#ifndef DUMP_TO_PROC + woal_store_ssu_dump(pmoal, pmevent); +#endif goto done; } #endif /* SSU_SUPPORT */ if (pmevent->event_id == MLAN_EVENT_ID_STORE_HOST_CMD_RESP) { +#ifndef DUMP_TO_PROC + woal_save_host_cmdresp(handle, (mlan_cmdresp_event *)pmevent); +#endif goto done; } priv = woal_bss_index_to_priv(pmoal, pmevent->bss_index); @@ -2998,6 +3041,9 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) *(t_s16 *)pmevent->event_buf, #endif GFP_KERNEL); + woal_set_rssi_threshold(priv, + MLAN_EVENT_ID_FW_BCN_RSSI_LOW, + MOAL_NO_WAIT); priv->last_event |= EVENT_BCN_RSSI_LOW; #endif if (!hw_test && priv->roaming_enabled) @@ -3212,28 +3258,6 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) woal_broadcast_event(priv, CUS_EVT_WEP_ICV_ERR, strlen(CUS_EVT_WEP_ICV_ERR)); break; - - case MLAN_EVENT_ID_DRV_DEFER_HANDLING: - queue_work(priv->phandle->workqueue, &priv->phandle->main_work); - break; - case MLAN_EVENT_ID_DRV_FLUSH_RX_WORK: - if (moal_extflg_isset(priv->phandle, EXT_NAPI)) { - napi_synchronize(&priv->phandle->napi_rx); - break; - } - flush_workqueue(priv->phandle->rx_workqueue); - break; - case MLAN_EVENT_ID_DRV_FLUSH_MAIN_WORK: - flush_workqueue(priv->phandle->workqueue); - break; - case MLAN_EVENT_ID_DRV_DEFER_RX_WORK: - if (moal_extflg_isset(priv->phandle, EXT_NAPI)) { - napi_schedule(&priv->phandle->napi_rx); - break; - } - queue_work(priv->phandle->rx_workqueue, - &priv->phandle->rx_work); - break; case MLAN_EVENT_ID_DRV_DBG_DUMP: priv->phandle->driver_status = MTRUE; ref_handle = (moal_handle *)priv->phandle->pref_mac; @@ -3626,14 +3650,21 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) } #endif #endif - if (priv->channel == pchan_info->channel) + /* Block host event only for same channel, same + * bandwidth case */ + if ((priv->channel == pchan_info->channel) && + (priv->bandwidth == pchan_info->bandcfg.chanWidth)) 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; #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) if (MFALSE @@ -3717,7 +3748,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) #endif memset(&pm_info, 0, sizeof(mlan_ds_ps_info)); if (priv->phandle->suspend_fail == MFALSE) { - woal_get_pm_info(priv, &pm_info); + if (woal_get_pm_info(priv, &pm_info)) + PRINTM(MEVENT, "get pm info failed\n"); if (pm_info.is_suspend_allowed == MTRUE) { priv->phandle->hs_activated = MTRUE; #ifdef MMC_PM_FUNC_SUSPENDED @@ -3791,7 +3823,8 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 1, 0) && IMX_ANDROID_13)) - cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, 0); + cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0, + 0); #elif ((CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 19, 2)) || \ IMX_ANDROID_13 || IMX_ANDROID_12_BACKPORT) cfg80211_ch_switch_notify(priv->netdev, &priv->chan, 0); @@ -3807,7 +3840,11 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) case MLAN_EVENT_ID_DRV_UAP_CHAN_INFO: #ifdef UAP_CFG80211 if (IS_UAP_CFG80211(cfg80211_wext)) { + struct cfg80211_chan_def chandef; pchan_info = (chan_band_info *)pmevent->event_buf; + if (woal_chandef_create(priv, &chandef, pchan_info)) + PRINTM(MERROR, + "Failed to create cfg80211_chan_def structure\n"); PRINTM(MEVENT, "UAP: 11n=%d, chan=%d, center_chan=%d, band=%d, width=%d, 2Offset=%d\n", pchan_info->is_11n_enabled, pchan_info->channel, @@ -3816,7 +3853,9 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) pchan_info->bandcfg.chanWidth, pchan_info->bandcfg.chan2Offset); if (priv->uap_host_based && - (priv->channel != pchan_info->channel)) + ((priv->chan.chan->hw_value != + pchan_info->channel) || + (priv->chan.width != chandef.width))) woal_channel_switch_event(priv, pchan_info); } #endif @@ -3958,7 +3997,7 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) memset(&wrqu, 0, sizeof(union iwreq_data)); wrqu.data.pointer = (t_u8 __user *)pmevent->event_buf; if ((pmevent->event_len + - strlen(CUS_EVT_STA_CONNECTED) + 1) > IW_CUSTOM_MAX) + strlen(CUS_EVT_STA_CONNECTED) + 1) > 256) wrqu.data.length = ETH_ALEN + strlen(CUS_EVT_STA_CONNECTED) + 1; @@ -4567,6 +4606,25 @@ mlan_status moal_recv_event(t_void *pmoal, pmlan_event pmevent) woal_cfg80211_event_rtt_result(priv, pmevent->event_buf, pmevent->event_len); #endif +#endif + break; + case MLAN_EVENT_ID_DRV_ADDBA_TIMEOUT: + evtbuf = (addba_timeout_event *)(pmevent->event_buf); + DBG_HEXDUMP(MEVT_D, "ADDBA_TIMEOUT", pmevent->event_buf, + pmevent->event_len); + memset(iwevent_str, 0, sizeof(iwevent_str)); + snprintf(iwevent_str, sizeof(iwevent_str), + "%s, MAC:%02x%02x%02x%02x%02x%02x,TID=%u", + CUS_EVT_ADDBA_TIMEOUT, evtbuf->peer_mac_addr[0], + evtbuf->peer_mac_addr[1], evtbuf->peer_mac_addr[2], + evtbuf->peer_mac_addr[3], evtbuf->peer_mac_addr[4], + evtbuf->peer_mac_addr[5], evtbuf->tid); +#if defined(STA_SUPPORT) || defined(UAP_SUPPORT) +#if defined(STA_WEXT) || defined(UAP_WEXT) + if (IS_STA_OR_UAP_WEXT(cfg80211_wext)) { + woal_send_iwevcustom_event(priv, iwevent_str); + } +#endif #endif break; case MLAN_EVENT_ID_CSI: @@ -4767,63 +4825,3 @@ t_u64 moal_do_div(t_u64 num, t_u32 base) do_div(val, base); return val; } - -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -/** - * @brief Performs wait event - * - * @param pmoal t_void - * @param bss_index index of priv - * @return MLAN_STATUS_SUCCESS - */ -mlan_status moal_wait_hostcmd_complete(t_void *pmoal, t_u32 bss_index) -{ - mlan_status status = MLAN_STATUS_SUCCESS; - moal_handle *handle = (moal_handle *)pmoal; - moal_private *priv = woal_bss_index_to_priv(handle, bss_index); - long time_left = 0; - - ENTER(); - - if (!priv) { - PRINTM(MERROR, "moal_wait_event: priv is null!\n"); - goto done; - } - - priv->hostcmd_wait_condition = MFALSE; - time_left = wait_event_timeout(priv->hostcmd_wait_q, - priv->hostcmd_wait_condition, - MOAL_IOCTL_TIMEOUT); - - if (!time_left) { - PRINTM(MERROR, "moal_wait_event: wait timeout "); - status = MLAN_STATUS_FAILURE; - } - -done: - LEAVE(); - return status; -} - -/** - * @brief wake up esa wait_q - * - * @param pmoal t_void - * @param bss_index index of priv - * @return MLAN_STATUS_SUCCESS - */ -mlan_status moal_notify_hostcmd_complete(t_void *pmoal, t_u32 bss_index) -{ - mlan_status status = MLAN_STATUS_SUCCESS; - moal_handle *handle = (moal_handle *)pmoal; - moal_private *priv = woal_bss_index_to_priv(handle, bss_index); - - ENTER(); - - priv->hostcmd_wait_condition = MTRUE; - wake_up(&priv->hostcmd_wait_q); - - LEAVE(); - return status; -} -#endif diff --git a/mxm_wifiex/wlan_src/mlinux/moal_shim.h b/mxm_wifiex/wlan_src/mlinux/moal_shim.h index c7f947e..70d5dff 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_shim.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_shim.h @@ -95,10 +95,6 @@ mlan_status moal_init_lock(t_void *pmoal, t_void **pplock); mlan_status moal_free_lock(t_void *pmoal, t_void *plock); mlan_status moal_spin_lock(t_void *pmoal, t_void *plock); mlan_status moal_spin_unlock(t_void *pmoal, t_void *plock); -#if defined(DRV_EMBEDDED_AUTHENTICATOR) || defined(DRV_EMBEDDED_SUPPLICANT) -mlan_status moal_wait_hostcmd_complete(t_void *pmoal, t_u32 bss_index); -mlan_status moal_notify_hostcmd_complete(t_void *pmoal, t_u32 bss_index); -#endif t_void moal_print(t_void *pmoal, t_u32 level, char *pformat, IN...); t_void moal_print_netintf(t_void *pmoal, t_u32 bss_index, t_u32 level); t_void moal_assert(t_void *pmoal, t_u32 cond); diff --git a/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c b/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c index bf39f0e..1533a7f 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c @@ -908,9 +908,6 @@ static int woal_cfg80211_assoc_ies_cfg(moal_private *priv, t_u8 *ie, t_u8 wps_oui[] = {0x00, 0x50, 0xf2, 0x04}; t_u8 hs20_oui[] = {0x50, 0x6f, 0x9a, 0x10}; - t_u8 multiap_oui[] = {0x50, 0x6f, 0x9a, 0x1b}; - t_u8 multiap_flag = 0; - while (bytes_left >= 2) { element_id = (IEEEtypes_ElementId_e)(*((t_u8 *)pcurrent_ptr)); element_len = *((t_u8 *)pcurrent_ptr + 1); @@ -948,21 +945,6 @@ static int woal_cfg80211_assoc_ies_cfg(moal_private *priv, t_u8 *ie, } } - if (!memcmp(pvendor_ie->vend_hdr.oui, multiap_oui, - sizeof(pvendor_ie->vend_hdr.oui)) && - (pvendor_ie->vend_hdr.oui_type == multiap_oui[3])) { - multiap_flag = pvendor_ie->data[0]; - if (MLAN_STATUS_SUCCESS != - woal_multi_ap_cfg(priv, wait_option, - multiap_flag)) { - PRINTM(MERROR, - "%s: failed to configure multi ap\n", - __func__); - ret = -EFAULT; - goto done; - } - } - if (!memcmp(pvendor_ie->vend_hdr.oui, hs20_oui, sizeof(pvendor_ie->vend_hdr.oui)) && (pvendor_ie->vend_hdr.oui_type == hs20_oui[3])) { @@ -1293,6 +1275,11 @@ static mlan_status woal_send_domain_info_cmd_fw(moal_private *priv, PRINTM(MCMND, "CFG80211: Country=%c%c, band=%d, no_of_sub_band=%d\n", priv->phandle->country_code[0], priv->phandle->country_code[1], priv->phandle->band, cfg_11d->param.domain_info.no_of_sub_band); + + /* skip download the command to FW when “no_of_sub_band = 0” */ + if (!no_of_sub_band) + goto done; + /* Send domain info command to FW */ status = woal_request_ioctl(priv, req, wait_option); if (status != MLAN_STATUS_SUCCESS) { @@ -2239,7 +2226,7 @@ static int woal_cfg80211_authenticate(struct wiphy *wiphy, woal_cfg80211_auth_scan(priv, req, MOAL_IOCTL_WAIT); if (MLAN_STATUS_SUCCESS != woal_find_bssid(priv, req->bss->bssid)) { - PRINTM(MMSG, "bssid not find in scan list\n"); + PRINTM(MMSG, "bssid not found in scan list\n"); kfree(ssid_bssid); LEAVE(); return -EFAULT; @@ -2762,6 +2749,8 @@ static int woal_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev, ENTER(); + priv->cfg_disconnect = MFALSE; + ssid_bssid = kmalloc(sizeof(mlan_ssid_bssid), GFP_KERNEL); if (!ssid_bssid) { LEAVE(); @@ -3925,6 +3914,16 @@ static int woal_update_custom_regdomain(moal_private *priv, struct wiphy *wiphy) return -EFAULT; } + memset(country_code, 0, sizeof(country_code)); + if (MTRUE == + is_cfg80211_special_region_code(priv->phandle->country_code)) { + country_code[0] = 'W'; + country_code[1] = 'W'; + } else { + country_code[0] = priv->phandle->country_code[0]; + country_code[1] = priv->phandle->country_code[1]; + } + req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_misc_cfg)); if (req == NULL) { ret = -EFAULT; @@ -3936,20 +3935,15 @@ static int woal_update_custom_regdomain(moal_private *priv, struct wiphy *wiphy) req->action = MLAN_ACT_GET; memset(&misc->param.custom_reg_domain, 0, sizeof(misc->param.custom_reg_domain)); + + misc->param.custom_reg_domain.region.country_code[0] = country_code[0]; + misc->param.custom_reg_domain.region.country_code[1] = country_code[1]; + status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); if (status != MLAN_STATUS_SUCCESS) { ret = -EFAULT; goto done; } - memset(country_code, 0, sizeof(country_code)); - if (MTRUE == - is_cfg80211_special_region_code(priv->phandle->country_code)) { - country_code[0] = 'W'; - country_code[1] = 'W'; - } else { - country_code[0] = priv->phandle->country_code[0]; - country_code[1] = priv->phandle->country_code[1]; - } if (misc->param.custom_reg_domain.region.country_code[0] == '\0' || misc->param.custom_reg_domain.region.country_code[1] == '\0') { PRINTM(MCMND, "FW country code not valid\n"); @@ -4186,191 +4180,6 @@ woal_cfg80211_reg_notifier(struct wiphy *wiphy, #endif } -#ifdef UAP_CFG80211 -/** - * @brief Swithces BSS role of interface - * - * @param priv A pointer to moal_private structure - * @param wait_option Wait option (MOAL_WAIT or MOAL_NO_WAIT) - * @param bss_role bss role - * - * @return 0 --success, otherwise fail - */ -static mlan_status woal_role_switch(moal_private *priv, t_u8 wait_option, - t_u8 bss_role) -{ - int ret = 0; - mlan_ds_bss *bss = NULL; - mlan_ioctl_req *req = NULL; - mlan_status status = MLAN_STATUS_SUCCESS; - - ENTER(); - - req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_bss)); - if (req == NULL) { - ret = -ENOMEM; - goto done; - } - bss = (mlan_ds_bss *)req->pbuf; - bss->sub_command = MLAN_OID_BSS_ROLE; - req->req_id = MLAN_IOCTL_BSS; - req->action = MLAN_ACT_SET; - bss->param.bss_role = bss_role; - - status = woal_request_ioctl(priv, req, wait_option); - if (status != MLAN_STATUS_SUCCESS) { - ret = -EFAULT; - goto done; - } -done: - if (status != MLAN_STATUS_PENDING) - kfree(req); - LEAVE(); - return ret; -} - -/** - * @brief set/get bandcfg - * - * @param priv A pointer to moal_private structure - * @param action get or set action - * @param band_cfg A pointer to mlan_ds_band_cfg structure - * - * @return 0 -- success, otherwise fail - */ -static int woal_setget_bandcfg(moal_private *priv, t_u8 action, - mlan_ds_band_cfg *band_cfg) -{ - int ret = 0; - mlan_ioctl_req *req = NULL; - mlan_ds_radio_cfg *radio_cfg = NULL; - mlan_status status = MLAN_STATUS_SUCCESS; - - ENTER(); - - req = woal_alloc_mlan_ioctl_req(sizeof(mlan_ds_radio_cfg)); - if (req == NULL) { - ret = -ENOMEM; - goto error; - } - radio_cfg = (mlan_ds_radio_cfg *)req->pbuf; - radio_cfg->sub_command = MLAN_OID_BAND_CFG; - req->req_id = MLAN_IOCTL_RADIO_CFG; - req->action = action; - - if (req->action == MLAN_ACT_SET) - moal_memcpy_ext(priv->phandle, &radio_cfg->param.band_cfg, - band_cfg, sizeof(mlan_ds_band_cfg), - sizeof(radio_cfg->param.band_cfg)); - - status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); - if (status != MLAN_STATUS_SUCCESS) { - ret = -EFAULT; - goto error; - } - moal_memcpy_ext(priv->phandle, band_cfg, &radio_cfg->param.band_cfg, - sizeof(mlan_ds_band_cfg), sizeof(mlan_ds_band_cfg)); -error: - if (status != MLAN_STATUS_PENDING) - kfree(req); - - LEAVE(); - return ret; -} - -/** - * @brief request scan - * - * @param priv A pointer to moal_private structure - * @param scan_cfg A pointer to wlan_user_scan_cfg structure - * - * @return MLAN_STATUS_SUCCESS -- success, otherwise fail - */ -static mlan_status woal_uap_scan(moal_private *priv, - wlan_user_scan_cfg *scan_cfg) -{ - mlan_status ret = MLAN_STATUS_SUCCESS; - moal_handle *handle = priv->phandle; - moal_private *tmp_priv; - u8 role; - mlan_ds_band_cfg org_bandcfg; - mlan_ds_band_cfg bandcfg; - u8 band_change = MFALSE; - ENTER(); - memset(&org_bandcfg, 0, sizeof(mlan_ds_band_cfg)); - memset(&bandcfg, 0, sizeof(mlan_ds_band_cfg)); - - if (priv->bss_index > 0) - tmp_priv = woal_get_priv(handle, MLAN_BSS_ROLE_ANY); - else - tmp_priv = priv; - if (!tmp_priv) { - LEAVE(); - return MLAN_STATUS_FAILURE; - } - role = GET_BSS_ROLE(tmp_priv); - if (role == MLAN_BSS_ROLE_UAP) { - if (MLAN_STATUS_SUCCESS != - woal_role_switch(tmp_priv, MOAL_IOCTL_WAIT, - MLAN_BSS_ROLE_STA)) { - PRINTM(MERROR, "role switch from uap to sta fail\n"); - LEAVE(); - return MLAN_STATUS_FAILURE; - } - } - if (tmp_priv != priv) { - if (woal_setget_bandcfg(priv, MLAN_ACT_GET, &bandcfg)) { - PRINTM(MERROR, "get bandcfg fail\n"); - ret = MLAN_STATUS_FAILURE; - goto done; - } - if (woal_setget_bandcfg(tmp_priv, MLAN_ACT_GET, &org_bandcfg)) { - PRINTM(MERROR, "get bandcfg fail\n"); - ret = MLAN_STATUS_FAILURE; - goto done; - } - if (bandcfg.config_bands != org_bandcfg.config_bands) { - if (woal_setget_bandcfg(tmp_priv, MLAN_ACT_SET, - &bandcfg)) { - PRINTM(MERROR, "set bandcfg fail\n"); - ret = MLAN_STATUS_FAILURE; - goto done; - } - band_change = MTRUE; - } - } -#ifdef REASSOCIATION - if (MOAL_ACQ_SEMAPHORE_BLOCK(&handle->reassoc_sem)) { - PRINTM(MERROR, "Acquire semaphore error, woal_do_combo_scan\n"); - goto done; - } -#endif /* REASSOCIATION */ - tmp_priv->report_scan_result = MTRUE; - ret = woal_request_userscan(tmp_priv, MOAL_IOCTL_WAIT, scan_cfg); - woal_sched_timeout(5); -#ifdef REASSOCIATION - MOAL_REL_SEMAPHORE(&handle->reassoc_sem); -#endif -done: - if (role == MLAN_BSS_ROLE_UAP) { - if (MLAN_STATUS_SUCCESS != - woal_role_switch(tmp_priv, MOAL_IOCTL_WAIT, - MLAN_BSS_ROLE_UAP)) { - PRINTM(MERROR, "role switch back to uap fail\n"); - ret = MLAN_STATUS_FAILURE; - } - } - if (band_change) { - if (woal_setget_bandcfg(tmp_priv, MLAN_ACT_SET, &org_bandcfg)) { - PRINTM(MERROR, "restore bandcfg fail\n"); - ret = MLAN_STATUS_FAILURE; - } - } - LEAVE(); - return ret; -} -#endif - static int woal_find_wps_ie_in_probereq(const t_u8 *ie, size_t len) { int left_len = len; @@ -4467,6 +4276,48 @@ t_u8 wlan_check_scan_table_ageout(moal_private *priv) LEAVE(); return MTRUE; } +/** + * @brief This function check if scan is allowed on specified band + * + * @param priv A pointer to moal_private structure + * @param chan ieee80211_channel + * + * @return MTRUE/MFALSE + */ +static t_u8 is_scan_band_allowed(moal_private *priv, + struct ieee80211_channel *chan) +{ + t_u8 ret = MTRUE; + t_u8 band_mask = 0; + + ENTER(); + if (!priv->scan_setband_mask) { + LEAVE(); + return ret; + } + + switch (chan->band) { + case IEEE80211_BAND_5GHZ: + band_mask = SCAN_SETBAND_5G; + break; + case IEEE80211_BAND_2GHZ: + band_mask = SCAN_SETBAND_2G; + break; + default: + break; + } + + if (band_mask & priv->scan_setband_mask) { + ret = MTRUE; + } else { + PRINTM(MINFO, "is_scan_band_allowed: Avoid scan on band %d\n", + chan->band); + ret = MFALSE; + } + + LEAVE(); + return ret; +} #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 6, 0) /** @@ -4510,7 +4361,7 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev, #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) t_u8 buf[ETH_ALEN]; #endif - int ret = 0, i; + int ret = 0, i, num_chans; unsigned long flags; ENTER(); @@ -4646,66 +4497,76 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev, } #endif #endif - for (i = 0; i < (int)MIN(WLAN_USER_SCAN_CHAN_MAX, - priv->phandle->scan_request->n_channels); + if (priv->scan_setband_mask) { + PRINTM(MCMD_D, + "cfg80211_scan: scan_setband mask is set to %d\n", + priv->scan_setband_mask); + } + for (i = 0, num_chans = 0; + i < (int)MIN(WLAN_USER_SCAN_CHAN_MAX, + priv->phandle->scan_request->n_channels); i++) { chan = priv->phandle->scan_request->channels[i]; - scan_req->chan_list[i].chan_number = chan->hw_value; - scan_req->chan_list[i].radio_type = + if (MFALSE == is_scan_band_allowed(priv, chan)) + continue; + scan_req->chan_list[num_chans].chan_number = chan->hw_value; + scan_req->chan_list[num_chans].radio_type = woal_ieee_band_to_radio_type(chan->band); if ((chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) || !priv->phandle->scan_request->n_ssids) - scan_req->chan_list[i].scan_type = + scan_req->chan_list[num_chans].scan_type = MLAN_SCAN_TYPE_PASSIVE; else if (chan->flags & IEEE80211_CHAN_RADAR) - scan_req->chan_list[i].scan_type = + scan_req->chan_list[num_chans].scan_type = MLAN_SCAN_TYPE_PASSIVE_TO_ACTIVE; else - scan_req->chan_list[i].scan_type = + scan_req->chan_list[num_chans].scan_type = MLAN_SCAN_TYPE_ACTIVE; PRINTM(MCMD_D, "cfg80211_scan: chan=%d chan->flag=0x%x\n", chan->hw_value, chan->flags); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 8, 0) - scan_req->chan_list[i].scan_time = + scan_req->chan_list[num_chans].scan_time = priv->phandle->scan_request->duration; #else - scan_req->chan_list[i].scan_time = 0; + scan_req->chan_list[num_chans].scan_time = 0; #endif #if defined(WIFI_DIRECT_SUPPORT) #if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION if (priv->bss_type == MLAN_BSS_TYPE_WIFIDIRECT && priv->phandle->scan_request->n_ssids) { if (!memcmp(scan_req->ssid_list[0].ssid, "DIRECT-", 7)) - scan_req->chan_list[i].scan_time = + scan_req->chan_list[num_chans].scan_time = MIN_SPECIFIC_SCAN_CHAN_TIME; } #endif #endif #ifdef WIFI_DIRECT_SUPPORT if (priv->phandle->miracast_mode) - scan_req->chan_list[i].scan_time = + scan_req->chan_list[num_chans].scan_time = priv->phandle->miracast_scan_time; else if (woal_is_any_interface_active(priv->phandle)) { if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) - scan_req->chan_list[i].scan_time = + scan_req->chan_list[num_chans].scan_time = INIT_PASSIVE_SCAN_CHAN_TIME; else - scan_req->chan_list[i].scan_time = MIN( + scan_req->chan_list[num_chans].scan_time = MIN( MIN_SPECIFIC_SCAN_CHAN_TIME, scan_cfg.scan_time.specific_scan_time); } #endif #ifdef UAP_CFG80211 if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) { + scan_req->scan_chan_gap = 0; if (!woal_is_uap_scan_result_expired(priv)) - scan_req->chan_list[i].scan_time = + scan_req->chan_list[num_chans].scan_time = MIN_SPECIFIC_SCAN_CHAN_TIME; else - scan_req->chan_list[i].scan_time = + scan_req->chan_list[num_chans].scan_time = PASSIVE_SCAN_CHAN_TIME; } #endif + num_chans++; } if (priv->phandle->scan_request->ie && priv->phandle->scan_request->ie_len) { @@ -4740,20 +4601,6 @@ static int woal_cfg80211_scan(struct wiphy *wiphy, struct net_device *dev, } } } -#ifdef UAP_CFG80211 - if (GET_BSS_ROLE(priv) == MLAN_BSS_ROLE_UAP) { - /** use sync scan for uap */ - ret = woal_uap_scan(priv, scan_req); - if (!ret) { - kfree(scan_req); - LEAVE(); - return ret; - } else { - PRINTM(MERROR, "Uap SCAN failure\n"); - goto done; - } - } -#endif #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 19, 0) if (request->flags & NL80211_SCAN_FLAG_RANDOM_ADDR) { PRINTM(MIOCTL, "NL80211_SCAN_FLAG_RANDOM_ADDR is set\n"); @@ -5487,6 +5334,7 @@ static int woal_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, t_u16 reason_code) { moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); + mlan_status status = MLAN_STATUS_SUCCESS; ENTER(); PRINTM(MMSG, @@ -5535,6 +5383,15 @@ static int woal_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev, return 0; } + if (priv->phandle->remain_on_channel) { + if (woal_cfg80211_remain_on_channel_cfg(priv, MOAL_IOCTL_WAIT, + MTRUE, (t_u8 *)&status, + NULL, 0, 0)) { + PRINTM(MERROR, "Fail to cancel remain on channel\n"); + } + priv->phandle->remain_on_channel = MFALSE; + } + /** cancel pending scan */ woal_cancel_scan(priv, MOAL_IOCTL_WAIT); priv->cfg_disconnect = MTRUE; @@ -6081,6 +5938,7 @@ static int woal_cfg80211_set_cqm_rssi_config(struct wiphy *wiphy, priv->cqm_rssi_thold = rssi_thold; priv->cqm_rssi_high_thold = rssi_thold; priv->cqm_rssi_hyst = rssi_hyst; + priv->mrvl_rssi_low = 0; PRINTM(MIOCTL, "rssi_thold=%d rssi_hyst=%d\n", (int)rssi_thold, (int)rssi_hyst); @@ -6814,8 +6672,7 @@ int woal_cfg80211_resume(struct wiphy *wiphy) done: handle->cfg80211_suspend = MFALSE; - queue_work(handle->rx_workqueue, &handle->rx_work); - + woal_queue_rx_task(handle); PRINTM(MCMND, "<--- Leave woal_cfg80211_resume --->\n"); return 0; } @@ -6912,7 +6769,9 @@ int woal_cfg80211_suspend(struct wiphy *wiphy, struct cfg80211_wowlan *wow) goto done; } - if (!priv || !priv->media_connected) { + if ((!priv || ((priv->bss_role == MLAN_BSS_ROLE_STA) && + !priv->media_connected)) || + ((priv->bss_role == MLAN_BSS_ROLE_UAP) && !priv->bss_started)) { PRINTM(MERROR, "Can not configure WOWLAN in disconnected state\n"); ret = 0; @@ -8614,41 +8473,8 @@ static int woal_cfg80211_change_station(struct wiphy *wiphy, struct station_parameters *params) { int ret = 0; -#ifdef UAP_SUPPORT - moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); - moal_private *vlan_priv = NULL; - station_node *sta_node = NULL; - int i = 0; -#endif ENTER(); -#ifdef UAP_SUPPORT - /** Bind the station to uap virtual interface and - save the station info in moal_private */ - if (params->vlan) { - if (params->vlan->ieee80211_ptr && - params->vlan->ieee80211_ptr->iftype == - NL80211_IFTYPE_AP_VLAN) { - vlan_priv = (moal_private *)woal_get_netdev_priv( - params->vlan); - for (i = 0; i < MAX_STA_COUNT; i++) { - sta_node = priv->vlan_sta_list[i]; - if (sta_node && - !moal_memcmp(priv->phandle, - sta_node->peer_mac, mac, - MLAN_MAC_ADDR_LENGTH)) { - PRINTM(MCMND, - "wlan: Easymesh change station aid=%d\n", - sta_node->aid); - sta_node->netdev = params->vlan; - sta_node->is_valid = MTRUE; - vlan_priv->vlan_sta_ptr = sta_node; - break; - } - } - } - } -#endif /**do nothing*/ LEAVE(); @@ -8679,29 +8505,12 @@ static int woal_cfg80211_add_station(struct wiphy *wiphy, { moal_private *priv = (moal_private *)woal_get_netdev_priv(dev); int ret = 0; - station_node *sta_node = NULL; ENTER(); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) #ifdef UAP_SUPPORT if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME) && (priv->bss_role == MLAN_BSS_ROLE_UAP)) { - sta_node = kmalloc(sizeof(station_node), GFP_KERNEL); - if (!sta_node) { - PRINTM(MERROR, - "Failed to alloc memory for station node\n"); - LEAVE(); - return -ENOMEM; - } - memset(sta_node, 0, sizeof(*sta_node)); - moal_memcpy_ext(priv->phandle, sta_node->peer_mac, mac, - MLAN_MAC_ADDR_LENGTH, ETH_ALEN); - sta_node->netdev = dev; - sta_node->aid = params->aid; - sta_node->is_valid = MFALSE; - /** AID should start from 1 to MAX_STA_COUNT */ - priv->vlan_sta_list[(params->aid - 1) % MAX_STA_COUNT] = - sta_node; ret = woal_cfg80211_uap_add_station(wiphy, dev, (u8 *)mac, params); LEAVE(); @@ -9021,7 +8830,8 @@ static int woal_update_okc_roaming_ie(moal_private *priv, } if (!priv->okc_roaming_ie) { - int okc_ie_len = sme->ie_len + sizeof(t_u16) + PMKID_LEN; + int okc_ie_len = + MIN(INT_MAX, sme->ie_len + sizeof(t_u16) + PMKID_LEN); /** Alloc new buffer for okc roaming ie */ priv->okc_roaming_ie = kzalloc(okc_ie_len, GFP_KERNEL); @@ -9927,7 +9737,7 @@ 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_CARDIW62X(priv->phandle->card_type)) { + IS_CARDIW624(priv->phandle->card_type)) { woal_cfg80211_notify_antcfg(priv, wiphy, radio); } wiphy->available_antennas_tx = radio->param.ant_cfg.tx_antenna; @@ -10107,9 +9917,8 @@ mlan_status woal_register_cfg80211(moal_private *priv) wiphy->max_scan_ssids = MRVDRV_MAX_SSID_LIST_LENGTH; wiphy->max_scan_ie_len = MAX_IE_SIZE; wiphy->interface_modes = 0; - wiphy->interface_modes = MBIT(NL80211_IFTYPE_STATION) | - MBIT(NL80211_IFTYPE_AP_VLAN) | - MBIT(NL80211_IFTYPE_AP); + wiphy->interface_modes = + MBIT(NL80211_IFTYPE_STATION) | MBIT(NL80211_IFTYPE_AP); wiphy->interface_modes |= MBIT(NL80211_IFTYPE_MONITOR); #ifdef WIFI_DIRECT_SUPPORT @@ -10271,8 +10080,6 @@ mlan_status woal_register_cfg80211(moal_private *priv) if (moal_extflg_isset(priv->phandle, EXT_HOST_MLME)) wiphy->features |= NL80211_FEATURE_SAE; #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 diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap.c b/mxm_wifiex/wlan_src/mlinux/moal_uap.c index 66207aa..3db70df 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap.c @@ -1928,7 +1928,7 @@ 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_CARDIW62X(priv->phandle->card_type)) { + IS_CARDIW624(priv->phandle->card_type)) { if (IS_STA_CFG80211( priv->phandle->params.cfg80211_wext)) woal_cfg80211_notify_antcfg( @@ -4111,61 +4111,6 @@ done: return ret; } -#if defined(UAP_CFG80211) -#if defined(STA_WEXT) || defined(UAP_WEXT) -/** - * @brief Set/Get multi AP mode - * - * @param priv A pointer to moal_private structure - * @param wrq A pointer to structure iwreq - * - * @return 0 --success, otherwise fail - */ -int woal_uap_set_get_multi_ap_mode(moal_private *priv, struct iwreq *wrq) -{ - int ret = 0; - int mode = 0; - - ENTER(); - - if (wrq->u.data.length) { - if (wrq->u.data.length > 1) { - PRINTM(MERROR, "Invalid no of arguments!\n"); - ret = -EINVAL; - goto done; - } - if (copy_from_user(&mode, wrq->u.data.pointer, sizeof(int))) { - PRINTM(MERROR, "copy from user failed\n"); - ret = -EFAULT; - goto done; - } - if (mode == EASY_MESH_MULTI_AP_BSS_MODE_3) - /* Supports backhaul and fronthaul BSS */ - priv->multi_ap_flag = EASY_MESH_MULTI_AP_BH_AND_FH_BSS; - else if (mode == EASY_MESH_MULTI_AP_BSS_MODE_2) - /* Supports backhaul BSS */ - priv->multi_ap_flag = EASY_MESH_MULTI_AP_BH_BSS; - else if (mode == EASY_MESH_MULTI_AP_BSS_MODE_1) - /* Supports fronthaul BSS */ - priv->multi_ap_flag = EASY_MESH_MULTI_AP_FH_BSS; - } else { - if (priv->multi_ap_flag == EASY_MESH_MULTI_AP_BH_AND_FH_BSS) - mode = EASY_MESH_MULTI_AP_BSS_MODE_3; - else if (priv->multi_ap_flag == EASY_MESH_MULTI_AP_BH_BSS) - mode = EASY_MESH_MULTI_AP_BSS_MODE_2; - else if (priv->multi_ap_flag == EASY_MESH_MULTI_AP_FH_BSS) - mode = EASY_MESH_MULTI_AP_BSS_MODE_1; - wrq->u.data.length = 1; - if (copy_to_user(wrq->u.data.pointer, &mode, sizeof(int))) - ret = -EFAULT; - } -done: - LEAVE(); - return ret; -} -#endif -#endif - /** * @brief Set AP configuration * diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap.h b/mxm_wifiex/wlan_src/mlinux/moal_uap.h index 1c4d25c..5719f66 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap.h @@ -588,12 +588,6 @@ mlan_status woal_set_get_ap_wmm_para(moal_private *priv, t_u16 action, wmm_parameter_t *ap_wmm_para); int woal_uap_set_ap_cfg(moal_private *priv, t_u8 *data, int len); -#if defined(UAP_CFG80211) -#if defined(STA_WEXT) || defined(UAP_WEXT) -int woal_uap_set_get_multi_ap_mode(moal_private *priv, struct iwreq *wrq); -#endif -#endif - int woal_uap_set_11ac_status(moal_private *priv, t_u8 action, t_u8 vht20_40, IEEEtypes_VHTCap_t *vhtcap_ie); int woal_11ax_cfg(moal_private *priv, t_u8 action, mlan_ds_11ax_he_cfg *he_cfg, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c b/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c index 13d507b..0f73065 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap_cfg80211.c @@ -31,7 +31,6 @@ /******************************************************** Global Variables ********************************************************/ -extern const struct net_device_ops woal_uap_netdev_ops; /******************************************************** Local Functions ********************************************************/ @@ -889,6 +888,8 @@ static int woal_cfg80211_beacon_config(moal_private *priv, #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 12, 0) mlan_ds_11h_chan_nop_info chan_nop_info; #endif + t_u8 wpa3_sae = 0; + t_u8 *rsnx_ie = NULL; ENTER(); if (!params) { @@ -1012,6 +1013,8 @@ static int woal_cfg80211_beacon_config(moal_private *priv, priv->channel, chan_nop_info.new_chan.channel); priv->chan_under_nop = chan_nop_info.chan_under_nop; priv->channel = chan_nop_info.new_chan.channel; + priv->bandwidth = + chan_nop_info.new_chan.bandcfg.chanWidth; woal_chandef_create(priv, &priv->chan, &chan_nop_info.new_chan); } @@ -1236,8 +1239,43 @@ static int woal_cfg80211_beacon_config(moal_private *priv, case WLAN_AKM_SUITE_PSK: sys_config->key_mgmt |= KEY_MGMT_PSK; break; +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(2, 6, 37) + case WLAN_AKM_SUITE_SAE: + case WLAN_AKM_SUITE_FT_OVER_SAE: + wpa3_sae = MTRUE; + break; +#endif } } + if (wpa3_sae) { +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 4, 0) + rsnx_ie = (t_u8 *)woal_parse_ie_tlv(params->beacon.tail, ie_len, + RSNX_IE); +#else + rsnx_ie = (t_u8 *)woal_parse_ie_tlv(params->tail, ie_len, + RSNX_IE); +#endif + if (rsnx_ie) + sys_config->pwe_derivation = SAE_PWE_BOTH; + else + sys_config->pwe_derivation = SAE_PWE_HUNT_AND_PECK; +#if CFG80211_VERSION_CODE >= KERNEL_VERSION(5, 11, 0) + switch (params->crypto.sae_pwe) { + case NL80211_SAE_PWE_HUNT_AND_PECK: + sys_config->pwe_derivation = SAE_PWE_HUNT_AND_PECK; + break; + case NL80211_SAE_PWE_HASH_TO_ELEMENT: + sys_config->pwe_derivation = SAE_PWE_HASH_TO_ELEMENT; + break; + case NL80211_SAE_PWE_BOTH: + sys_config->pwe_derivation = SAE_PWE_BOTH; + break; + default: + break; + } +#endif + } + sys_config->wpa_cfg.pairwise_cipher_wpa = 0; sys_config->wpa_cfg.pairwise_cipher_wpa2 = 0; for (i = 0; i < params->crypto.n_ciphers_pairwise; i++) { @@ -1444,11 +1482,6 @@ static int woal_cfg80211_beacon_config(moal_private *priv, sys_config->sta_ageout_timer, sys_config->ps_sta_ageout_timer); #endif - if (priv->multi_ap_flag) { - sys_config->multi_ap_flag = priv->multi_ap_flag; - PRINTM(MINFO, "%s: multi_ap_flag is 0x%x\n", __func__, - sys_config->multi_ap_flag); - } if (MLAN_STATUS_SUCCESS != woal_set_get_sys_config(priv, MLAN_ACT_SET, MOAL_IOCTL_WAIT, sys_config)) { @@ -1633,167 +1666,6 @@ fail: return ret; } -/** - * @brief This function setup the multi-ap virtual interface - * - * @param dev A pointer to structure net_device - * - * @return N/A - */ -static void woal_vlan_virt_if_setup(struct net_device *dev) -{ - ENTER(); - ether_setup(dev); - dev->netdev_ops = &woal_uap_netdev_ops; -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 11, 9) - dev->needs_free_netdev = true; -#else - dev->destructor = free_netdev; -#endif - LEAVE(); -} - -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) -/** - * @brief Request the driver to add a multi-ap virtual interface - * - * @param wiphy A pointer to wiphy structure - * @param name Virtual interface name - * @param name_assign_type Interface name assignment type - * @param flags Flags for the virtual interface - * @param params A pointer to vif_params structure - * @param new_dev new net_device to return - * - * @return 0 -- success, otherwise fail - */ -static int woal_cfg80211_add_vlan_vir_if(struct wiphy *wiphy, const char *name, - unsigned char name_assign_type, -#if CFG80211_VERSION_CODE < KERNEL_VERSION(4, 12, 0) - u32 *flags, -#endif - struct vif_params *params, - struct net_device **new_dev) -#else -/** - * @brief Request the driver to add a multi-ap virtual interface - * - * @param wiphy A pointer to wiphy structure - * @param name Virtual interface name - * @param flags Flags for the virtual interface - * @param params A pointer to vif_params structure - * @param new_dev new net_device to return - * - * @return 0 -- success, otherwise fail - */ -static int woal_cfg80211_add_vlan_vir_if(struct wiphy *wiphy, -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 7, 0) - const -#endif - char *name, - u32 *flags, struct vif_params *params, - struct net_device **new_dev) -#endif -{ - int ret = 0; - moal_handle *handle = (moal_handle *)woal_get_wiphy_priv(wiphy); - moal_private *priv = - (moal_private *)woal_get_priv(handle, MLAN_BSS_ROLE_UAP); - moal_private *new_priv = NULL; - struct net_device *ndev = NULL; - - ENTER(); - ASSERT_RTNL(); -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29) -#ifndef MAX_WMM_QUEUE -#define MAX_WMM_QUEUE 4 -#endif -#endif -#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 29) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) -#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) - ndev = alloc_netdev_mq(sizeof(moal_private), name, name_assign_type, - woal_vlan_virt_if_setup, 1); -#else - ndev = alloc_netdev_mq(sizeof(moal_private), name, NET_NAME_UNKNOWN, - woal_vlan_virt_if_setup, 1); -#endif -#else - ndev = alloc_netdev_mq(sizeof(moal_private), name, - woal_vlan_virt_if_setup, 1); -#endif -#else - ndev = alloc_netdev_mq(sizeof(moal_private), name, - woal_vlan_virt_if_setup); -#endif - if (!ndev) { - PRINTM(MFATAL, "Init virtual ethernet device failed\n"); - ret = -EFAULT; - goto fail; - } - - ret = dev_alloc_name(ndev, ndev->name); - if (ret < 0) { - PRINTM(MFATAL, "Net device alloc name fail.\n"); - ret = -EFAULT; - goto fail; - } - - dev_net_set(ndev, wiphy_net(wiphy)); - - moal_memcpy_ext(handle, ndev->perm_addr, wiphy->perm_addr, ETH_ALEN, - sizeof(ndev->perm_addr)); - moal_memcpy_ext(handle, ndev->perm_addr, priv->current_addr, ETH_ALEN, - sizeof(ndev->perm_addr)); - moal_memcpy_ext(handle, (t_void *)ndev->dev_addr, ndev->perm_addr, - ETH_ALEN, MAX_ADDR_LEN); - - SET_NETDEV_DEV(ndev, wiphy_dev(wiphy)); - ndev->watchdog_timeo = MRVDRV_DEFAULT_UAP_WATCHDOG_TIMEOUT; -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0) - ndev->needed_headroom += MLAN_MIN_DATA_HEADER_LEN + - sizeof(mlan_buffer) + priv->extra_tx_head_len; -#else - ndev->hard_header_len += MLAN_MIN_DATA_HEADER_LEN + - sizeof(mlan_buffer) + priv->extra_tx_head_len; -#endif - - ndev->flags |= IFF_BROADCAST | IFF_MULTICAST; - - new_priv = netdev_priv(ndev); - - ndev->ieee80211_ptr = &new_priv->w_dev; - - new_priv->wdev = &new_priv->w_dev; - new_priv->netdev = ndev; - new_priv->extra_tx_head_len = priv->extra_tx_head_len; - - moal_memcpy_ext(priv->phandle, new_priv->current_addr, - priv->current_addr, ETH_ALEN, ETH_ALEN); - - new_priv->phandle = handle; - new_priv->wdev->wiphy = handle->wiphy; - new_priv->bss_type = MLAN_BSS_TYPE_UAP; - new_priv->bss_role = MLAN_BSS_ROLE_UAP; - new_priv->bss_index = priv->bss_index; - new_priv->parent_priv = priv; - new_priv->wdev->iftype = NL80211_IFTYPE_AP_VLAN; - - ndev->ieee80211_ptr->use_4addr = params->use_4addr; - - ret = register_netdevice(ndev); - if (ret) { - PRINTM(MFATAL, "register net_device failed, ret=%d\n", ret); - free_netdev(ndev); - goto fail; - } - - if (new_dev) - *new_dev = ndev; -fail: - LEAVE(); - return ret; -} - #ifdef WIFI_DIRECT_SUPPORT #if CFG80211_VERSION_CODE >= WIFI_DIRECT_KERNEL_VERSION /** @@ -2476,20 +2348,6 @@ woal_cfg80211_add_virtual_intf(struct wiphy *wiphy, const char *name, ret = -EFAULT; } break; - case NL80211_IFTYPE_AP_VLAN: -#if CFG80211_VERSION_CODE >= KERNEL_VERSION(4, 1, 0) -#if CFG80211_VERSION_CODE < KERNEL_VERSION(4, 12, 0) - ret = woal_cfg80211_add_vlan_vir_if( - wiphy, name, name_assign_type, flags, params, &ndev); -#else - ret = woal_cfg80211_add_vlan_vir_if( - wiphy, name, name_assign_type, params, &ndev); -#endif -#else - ret = woal_cfg80211_add_vlan_vir_if(wiphy, name, flags, params, - &ndev); -#endif - break; default: PRINTM(MWARN, "Not supported if type: %d\n", type); ret = -EFAULT; @@ -2546,9 +2404,6 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy, struct net_device *dev = wdev->netdev; #endif - moal_private *vlan_priv = NULL; - t_u16 aid = 0; - ENTER(); PRINTM(MIOCTL, "del virtual intf %s\n", dev->name); @@ -2573,26 +2428,6 @@ int woal_cfg80211_del_virtual_intf(struct wiphy *wiphy, return ret; } -#ifdef UAP_SUPPORT - /** - * For multi-ap virtual interface, unregister netdevice - * directly for now. Will add more in the future. - */ - if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP_VLAN) { - /* stop network before doing cleanup */ - if (netif_carrier_ok(dev)) - netif_carrier_off(dev); - vlan_priv = (moal_private *)netdev_priv(dev); - aid = vlan_priv->vlan_sta_ptr->aid; - PRINTM(MCMND, "wlan: Easymesh del Vlan aid=%d\n", aid); - vlan_priv->parent_priv->vlan_sta_list[(aid - 1) % MAX_STA_COUNT] - ->is_valid = MFALSE; - unregister_netdevice(dev); - LEAVE(); - return ret; - } -#endif - if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_AP) { for (i = 0; i < handle->priv_num; i++) { vir_priv = handle->priv[i]; @@ -2737,6 +2572,7 @@ int woal_cfg80211_add_beacon(struct wiphy *wiphy, struct net_device *dev, #if CFG80211_VERSION_CODE >= KERNEL_VERSION(3, 8, 0) priv->channel = ieee80211_frequency_to_channel( params->chandef.chan->center_freq); + priv->bandwidth = params->chandef.width; #else priv->channel = ieee80211_frequency_to_channel(params->channel->center_freq); @@ -2925,7 +2761,6 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev) #ifdef STA_SUPPORT moal_private *pmpriv = NULL; #endif - int i; ENTER(); @@ -3006,19 +2841,7 @@ int woal_cfg80211_del_beacon(struct wiphy *wiphy, struct net_device *dev) priv->cipher = 0; memset(priv->uap_wep_key, 0, sizeof(priv->uap_wep_key)); priv->channel = 0; -#ifdef UAP_SUPPORT - priv->multi_ap_flag = 0; - /* Clear the whole backhaul station list in moal */ - for (i = 0; i < MAX_STA_COUNT; i++) { - if (priv->vlan_sta_list[i]) { - if (priv->vlan_sta_list[i]->is_valid) - unregister_netdevice( - priv->vlan_sta_list[i]->netdev); - kfree(priv->vlan_sta_list[i]); - } - priv->vlan_sta_list[i] = NULL; - } -#endif + priv->bandwidth = 0; PRINTM(MMSG, "wlan: AP stopped\n"); done: LEAVE(); @@ -3723,7 +3546,10 @@ static void woal_switch_uap_channel(moal_private *priv, t_u8 wait_option) } PRINTM(MMSG, "CSA: old chan %d => new chan %d \n", priv->channel, uap_channel.channel); + PRINTM(MMSG, "CSA: old BW %d => new BW %d \n", priv->bandwidth, + uap_channel.bandcfg.chanWidth); priv->channel = uap_channel.channel; + priv->bandwidth = uap_channel.bandcfg.chanWidth; moal_memcpy_ext(priv->phandle, &priv->chan, &priv->csa_chan, sizeof(struct cfg80211_chan_def), sizeof(priv->chan)); #if CFG80211_VERSION_CODE >= KERNEL_VERSION(6, 3, 0) diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.c b/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.c index ab503b2..b28e0db 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.c @@ -119,16 +119,6 @@ int woal_uap_do_priv_ioctl(struct net_device *dev, struct ifreq *req, int cmd) ret = woal_set_get_bss_role(priv, wrq); break; #endif -#endif -#if defined(UAP_CFG80211) -#if defined(STA_WEXT) || defined(UAP_WEXT) - case WOAL_UAP_SET_MODE: - PRINTM(MINFO, - "%s: setting multi_ap flag through user command\n", - __func__); - ret = woal_uap_set_get_multi_ap_mode(priv, wrq); - break; -#endif #endif default: ret = -EINVAL; diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.h b/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.h index c49d36a..4eab2f5 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap_priv.h @@ -65,11 +65,6 @@ Change log: #endif #endif -#if defined(UAP_CFG80211) -/** Private command ID for set multi-AP BSS mode */ -#define WOAL_UAP_SET_MODE 27 -#endif - /** Private command ID for hostcmd */ #define WOAL_UAP_HOST_CMD (WOAL_UAP_IOCTL + 17) diff --git a/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c b/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c index 5fe4926..aa4dc78 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_uap_wext.c @@ -84,10 +84,6 @@ static const struct iw_priv_args woal_uap_priv_args[] = { #endif #endif -#if defined(UAP_CFG80211) - {WOAL_UAP_SET_MODE, IW_PRIV_TYPE_INT | 1, IW_PRIV_TYPE_INT | 1, - "setmode"}, -#endif {WOAL_UAP_SET_GET_256_CHAR, IW_PRIV_TYPE_CHAR | 256, IW_PRIV_TYPE_CHAR | 256, ""}, {WOAL_WL_FW_RELOAD, IW_PRIV_TYPE_CHAR | 256, IW_PRIV_TYPE_CHAR | 256, diff --git a/mxm_wifiex/wlan_src/mlinux/moal_usb.c b/mxm_wifiex/wlan_src/mlinux/moal_usb.c index 16ccf1a..3babcbd 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_usb.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_usb.c @@ -35,7 +35,7 @@ extern struct semaphore AddRemoveCardSem; ********************************************************/ #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBIW62X) + defined(USB8978) || defined(USBIW624) /** Card-type detection frame response */ typedef struct { /** 32-bit ACK+WINNER field */ @@ -95,10 +95,10 @@ static struct usb_device_id woal_usb_table[] = { {NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_1, "NXP WLAN USB Adapter")}, {NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_2, "NXP WLAN USB Adapter")}, #endif -#ifdef USBIW62X - {NXP_USB_DEVICE(USBIW62X_VID_1, USBIW62X_PID_1, +#ifdef USBIW624 + {NXP_USB_DEVICE(USBIW624_VID_1, USBIW624_PID_1, "NXP WLAN USB Adapter")}, - {NXP_USB_DEVICE(USBIW62X_VID_1, USBIW62X_PID_2, + {NXP_USB_DEVICE(USBIW624_VID_1, USBIW624_PID_2, "NXP WLAN USB Adapter")}, #endif /* Terminating entry */ @@ -128,8 +128,8 @@ static struct usb_device_id woal_usb_table_skip_fwdnld[] = { #ifdef USB9097 {NXP_USB_DEVICE(USB9097_VID_1, USB9097_PID_2, "NXP WLAN USB Adapter")}, #endif -#ifdef USBIW62X - {NXP_USB_DEVICE(USBIW62X_VID_1, USBIW62X_PID_2, +#ifdef USBIW624 + {NXP_USB_DEVICE(USBIW624_VID_1, USBIW624_PID_2, "NXP WLAN USB Adapter")}, #endif /* Terminating entry */ @@ -497,7 +497,7 @@ rx_ret: ********************************************************/ #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBIW62X) + defined(USB8978) || defined(USBIW624) /** * @brief Check chip revision * @@ -810,14 +810,14 @@ static t_u16 woal_update_card_type(t_void *card) strlen(KERN_VERSION)); } #endif -#ifdef USBIW62X +#ifdef USBIW624 if (woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) == - (__force __le16)USBIW62X_PID_1 || + (__force __le16)USBIW624_PID_1 || woal_cpu_to_le16(cardp_usb->udev->descriptor.idProduct) == - (__force __le16)USBIW62X_PID_2) { - card_type = CARD_TYPE_USBIW62X; - moal_memcpy_ext(NULL, driver_version, CARD_USBIW62X, - strlen(CARD_USBIW62X), strlen(driver_version)); + (__force __le16)USBIW624_PID_2) { + card_type = CARD_TYPE_USBIW624; + moal_memcpy_ext(NULL, driver_version, CARD_USBIW624, + strlen(CARD_USBIW624), strlen(driver_version)); moal_memcpy_ext(NULL, driver_version + strlen(INTF_CARDTYPE) + strlen(KERN_VERSION), @@ -893,9 +893,9 @@ static int woal_usb_probe(struct usb_interface *intf, #ifdef USB9097 case (__force __le16)USB9097_PID_1: #endif /* USB9097 */ -#ifdef USBIW62X - case (__force __le16)USBIW62X_PID_1: -#endif /* USBIW62X */ +#ifdef USBIW624 + case (__force __le16)USBIW624_PID_1: +#endif /* USBIW624 */ /* If skip FW is set, we must return error so * the next driver can download the FW */ @@ -923,9 +923,9 @@ static int woal_usb_probe(struct usb_interface *intf, #ifdef USB9097 case (__force __le16)USB9097_PID_2: #endif /* USB9097 */ -#ifdef USBIW62X - case (__force __le16)USBIW62X_PID_2: -#endif /* USBIW62X */ +#ifdef USBIW624 + case (__force __le16)USBIW624_PID_2: +#endif /* USBIW624 */ usb_cardp->boot_state = USB_FW_READY; break; @@ -1283,7 +1283,6 @@ static int woal_usb_suspend(struct usb_interface *intf, pm_message_t message) for (i = 0; i < MVUSB_RX_DATA_URB; i++) { if (cardp->rx_data_list[i].urb) { usb_kill_urb(cardp->rx_data_list[i].urb); - usb_init_urb(cardp->rx_data_list[i].urb); } } } @@ -2043,7 +2042,7 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) { mlan_status ret = MLAN_STATUS_SUCCESS; #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBIW62X) + defined(USB8978) || defined(USBIW624) t_u32 revision_id = 0; t_u32 strap = 0; t_u32 boot_mode = 0; @@ -2064,7 +2063,7 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) #endif #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USBIW62X) + defined(USB8978) || defined(USBIW624) ret = woal_check_chip_revision(handle, &revision_id, &strap, &boot_mode); if (ret != MLAN_STATUS_SUCCESS) { @@ -2170,16 +2169,16 @@ static mlan_status woal_usb_get_fw_name(moal_handle *handle) } } #endif -#ifdef USBIW62X - if (IS_USBIW62X(handle->card_type)) { +#ifdef USBIW624 + if (IS_USBIW624(handle->card_type)) { if (boot_mode == 0x03) - PRINTM(MMSG, "wlan: USB-IW62X in secure-boot mode\n"); + PRINTM(MMSG, "wlan: USB-IW624 in secure-boot mode\n"); if (strap == CARD_TYPE_USB_UART) strncpy(handle->card_info->fw_name, - USBUARTIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); + USBUARTIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN); else strncpy(handle->card_info->fw_name, - USBUSBIW62X_COMBO_FW_NAME, FW_NAMW_MAX_LEN); + USBUSBIW624_COMBO_FW_NAME, FW_NAMW_MAX_LEN); } #endif diff --git a/mxm_wifiex/wlan_src/mlinux/moal_usb.h b/mxm_wifiex/wlan_src/mlinux/moal_usb.h index 7a03364..4543701 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_usb.h +++ b/mxm_wifiex/wlan_src/mlinux/moal_usb.h @@ -89,14 +89,14 @@ Change Log: #define USB9097_PID_2 0x2061 #endif /* USB9097 */ -#ifdef USBIW62X +#ifdef USBIW624 /** USB VID 1 */ -#define USBIW62X_VID_1 0x0471 +#define USBIW624_VID_1 0x0471 /** USB PID 1 */ -#define USBIW62X_PID_1 0x020E +#define USBIW624_PID_1 0x020E /** USB PID 2 */ -#define USBIW62X_PID_2 0x020F -#endif /* USBIW62X */ +#define USBIW624_PID_2 0x020F +#endif /* USBIW624 */ /** Boot state: FW download */ #define USB_FW_DNLD 1 @@ -110,7 +110,7 @@ Change Log: #define MVUSB_RX_DATA_URB 6 #if defined(USB8997) || defined(USB9098) || defined(USB9097) || \ - defined(USB8978) || defined(USB8801) || defined(USBIW62X) + defined(USB8978) || defined(USB8801) || defined(USBIW624) /* Transmit buffer size for chip revision check */ #define CHIP_REV_TX_BUF_SIZE 16 /* Receive buffer size for chip revision check */ @@ -172,12 +172,12 @@ Change Log: #define USBUSB9097_COMBO_V1_FW_NAME "nxp/usbusbiw620_combo_v1.bin" #endif /* USB9097 */ -#ifdef USBIW62X -#define USBIW62X_DEFAULT_COMBO_FW_NAME "nxp/usbusbiw62x_combo.bin" -#define USBUARTIW62X_COMBO_FW_NAME "nxp/usbuartiw62x_combo.bin" -#define USBUSBIW62X_COMBO_FW_NAME "nxp/usbusbiw62x_combo.bin" -#define USBIW62X_DEFAULT_WLAN_FW_NAME "nxp/usbiw62x_wlan.bin" -#endif /* USBIW62X */ +#ifdef USBIW624 +#define USBIW624_DEFAULT_COMBO_FW_NAME "nxp/usbusbiw624_combo.bin" +#define USBUARTIW624_COMBO_FW_NAME "nxp/usbusbiw624_combo.bin" +#define USBUSBIW624_COMBO_FW_NAME "nxp/usbusbiw624_combo.bin" +#define USBIW624_DEFAULT_WLAN_FW_NAME "nxp/usbiw624_wlan.bin" +#endif /* USBIW624 */ /** urb context */ typedef struct _urb_context { diff --git a/mxm_wifiex/wlan_src/mlinux/moal_wext.c b/mxm_wifiex/wlan_src/mlinux/moal_wext.c index f37f485..90020c5 100644 --- a/mxm_wifiex/wlan_src/mlinux/moal_wext.c +++ b/mxm_wifiex/wlan_src/mlinux/moal_wext.c @@ -3408,7 +3408,7 @@ static const iw_handler woal_private_handler[] = { void woal_send_iwevcustom_event(moal_private *priv, char *str) { union iwreq_data iwrq; - char buf[IW_CUSTOM_MAX]; + char buf[256]; ENTER(); /* Check register_netdevice is completed before sending*/