diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_11ax.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_11ax.c index e4d731a06d07..628e430dfe4e 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_11ax.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_11ax.c @@ -831,6 +831,8 @@ mlan_status wlan_cmd_twt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, ds_twtcfg->param.twt_setup.twt_exponent; twt_setup_params->twt_mantissa = wlan_cpu_to_le16( ds_twtcfg->param.twt_setup.twt_mantissa); + twt_setup_params->twt_request = + ds_twtcfg->param.twt_setup.twt_request; cmd->size += sizeof(hostcmd_twtcfg->param.twt_setup); break; case MLAN_11AX_TWT_TEARDOWN_SUBID: diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c index f127bbd6c4ec..ec27a4c3be22 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_cmdevt.c @@ -517,6 +517,7 @@ static t_u32 wlan_process_hostcmd_cfg(pmlan_private pmpriv, t_u16 cfg_type, HostCmd_DS_802_11_CFG_DATA *pcfg_cmd = MNULL; mlan_adapter *pmadapter = MNULL; mlan_callbacks *pcb = MNULL; + t_u8 hostcmd_flag = MFALSE; ENTER(); if (!pmpriv) { @@ -574,7 +575,7 @@ static t_u32 wlan_process_hostcmd_cfg(pmlan_private pmpriv, t_u16 cfg_type, } ret = wlan_prepare_cmd(pmpriv, 0, 0, 0, MNULL, (t_void *)hostcmd); - memset(pmadapter, buf, 0, MLAN_SIZE_OF_CMD_BUFFER); + memset(pmadapter, buf, 0, MRVDRV_SIZE_OF_CMD_BUFFER); ptr = buf; start_raw = MFALSE; pos++; @@ -583,16 +584,19 @@ static t_u32 wlan_process_hostcmd_cfg(pmlan_private pmpriv, t_u16 cfg_type, if (start_raw == MFALSE) { intf_s = wlan_strchr(pos, '='); - if (intf_s) + if (intf_s) { + if (*(intf_s + 1) == '=') + hostcmd_flag = MTRUE; intf_e = wlan_strchr(intf_s, '{'); - else + } else intf_e = MNULL; if (intf_s && intf_e) { start_raw = MTRUE; pos = intf_e + 1; /* Reserve command head for DPD RAW data conf */ - if (cfg_type == CFG_TYPE_DPDFILE) { + if (cfg_type == CFG_TYPE_DPDFILE && + !hostcmd_flag) { pcmd = (HostCmd_DS_GEN *)ptr; ptr += S_DS_GEN + sizeof(HostCmd_DS_802_11_CFG_DATA); @@ -888,7 +892,7 @@ static mlan_status wlan_ret_host_cmd(pmlan_private pmpriv, misc = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; misc->param.hostcmd.len = size; memcpy_ext(pmpriv->adapter, misc->param.hostcmd.cmd, - (void *)resp, size, MLAN_SIZE_OF_CMD_BUFFER); + (void *)resp, size, MRVDRV_SIZE_OF_CMD_BUFFER); } LEAVE(); @@ -1512,7 +1516,8 @@ mlan_status wlan_process_event(pmlan_adapter pmadapter) sizeof(eventcause)); } - if (eventcause != EVENT_PS_SLEEP && eventcause != EVENT_PS_AWAKE) { + if (eventcause != EVENT_PS_SLEEP && eventcause != EVENT_PS_AWAKE && + 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, @@ -4051,6 +4056,16 @@ mlan_status wlan_adapter_get_hw_spec(pmlan_adapter pmadapter) pmadapter->ptxpwr_data = MNULL; pmadapter->txpwr_data_len = 0; } + if (!pmadapter->pdpd_data && + (pmadapter->dpd_data_len == UNKNOW_DPD_LENGTH)) { + ret = wlan_prepare_cmd(priv, HostCmd_CMD_CFG_DATA, + HostCmd_ACT_GEN_GET, OID_TYPE_DPD, MNULL, + MNULL); + if (ret) { + ret = MLAN_STATUS_FAILURE; + goto done; + } + } /** Cal data dnld cmd prepare */ if ((pmadapter->pcal_data) && (pmadapter->cal_data_len > 0)) { ret = wlan_prepare_cmd(priv, HostCmd_CMD_CFG_DATA, @@ -4577,7 +4592,7 @@ mlan_status wlan_cmd_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd, mlan_status ret = MLAN_STATUS_SUCCESS; HostCmd_DS_802_11_CFG_DATA *pcfg_data = &(pcmd->params.cfg_data); pmlan_adapter pmadapter = pmpriv->adapter; - t_u32 len; + t_u32 len = 0; t_u32 data_offset; t_u8 *temp_pcmd = (t_u8 *)pcmd; @@ -4590,9 +4605,6 @@ mlan_status wlan_cmd_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd, len = wlan_parse_cal_cfg((t_u8 *)pmadapter->pcal_data, pmadapter->cal_data_len, (t_u8 *)(temp_pcmd + data_offset)); - } else { - ret = MLAN_STATUS_FAILURE; - goto done; } pcfg_data->action = cmd_action; @@ -4609,7 +4621,6 @@ mlan_status wlan_cmd_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *pcmd, pcfg_data->type = wlan_cpu_to_le16(pcfg_data->type); pcfg_data->data_len = wlan_cpu_to_le16(pcfg_data->data_len); -done: LEAVE(); return ret; } @@ -4623,10 +4634,17 @@ done: * * @return MLAN_STATUS_SUCCESS or MLAN_STATUS_FAILURE */ -mlan_status wlan_ret_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, - t_void *pioctl_buf) +mlan_status wlan_ret_cfg_data(IN pmlan_private pmpriv, + IN HostCmd_DS_COMMAND *resp, + IN t_void *pioctl_buf) { mlan_status ret = MLAN_STATUS_SUCCESS; + t_u8 event_buf[100]; + mlan_cmdresp_event *pevent = (mlan_cmdresp_event *)event_buf; + mlan_adapter *pmadapter = pmpriv->adapter; + HostCmd_DS_802_11_CFG_DATA *pcfg_data = &resp->params.cfg_data; + t_u16 action; + t_u16 type; ENTER(); @@ -4634,6 +4652,25 @@ mlan_status wlan_ret_cfg_data(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, PRINTM(MERROR, "CFG data cmd resp failed\n"); ret = MLAN_STATUS_FAILURE; } + + if (!pmadapter->pdpd_data && + (pmadapter->dpd_data_len == UNKNOW_DPD_LENGTH) && + pmadapter->hw_status == WlanHardwareStatusGetHwSpec) { + action = wlan_le16_to_cpu(pcfg_data->action); + type = wlan_le16_to_cpu(pcfg_data->type); + if (action == HostCmd_ACT_GEN_GET && (type == OID_TYPE_DPD)) { + pcfg_data->action = + wlan_cpu_to_le16(HostCmd_ACT_GEN_SET); + pevent->bss_index = pmpriv->bss_index; + pevent->event_id = MLAN_EVENT_ID_STORE_HOST_CMD_RESP; + pevent->resp = (t_u8 *)resp; + pevent->event_len = wlan_le16_to_cpu(resp->size); + wlan_recv_event(pmpriv, + MLAN_EVENT_ID_STORE_HOST_CMD_RESP, + (mlan_event *)pevent); + } + } + LEAVE(); return ret; } @@ -7842,6 +7879,70 @@ mlan_status wlan_ret_rxabortcfg_ext(pmlan_private pmpriv, return MLAN_STATUS_SUCCESS; } +/** + * @brief This function prepares command of Dot11mc unassoc ftm cfg + * + * @param pmpriv A pointer to mlan_private structure + * @param cmd A pointer to HostCmd_DS_COMMAND structure + * @param cmd_action the action: GET or SET + * @param pdata_buf A pointer to data buffer + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_cmd_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, + t_void *pdata_buf) +{ + HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG *cfg_cmd = + (HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG *)&cmd->params + .dot11mc_unassoc_ftm_cfg; + mlan_ds_misc_dot11mc_unassoc_ftm_cfg *cfg = + (mlan_ds_misc_dot11mc_unassoc_ftm_cfg *)pdata_buf; + + ENTER(); + + cmd->command = wlan_cpu_to_le16(HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG); + cmd->size = wlan_cpu_to_le16( + sizeof(HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG) + S_DS_GEN); + cfg_cmd->action = wlan_cpu_to_le16(cmd_action); + + if (cmd_action == HostCmd_ACT_GEN_SET) { + cfg_cmd->state = wlan_cpu_to_le16(cfg->state); + } + + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + +/** + * @brief This function handles the command response of Dot11mc unassoc ftm cfg + * + * @param pmpriv A pointer to mlan_private structure + * @param resp A pointer to HostCmd_DS_COMMAND + * @param pioctl_buf A pointer to mlan_ioctl_req structure + * + * @return MLAN_STATUS_SUCCESS + */ +mlan_status wlan_ret_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf) +{ + HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG *cfg_cmd = + (HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG *)&resp->params + .dot11mc_unassoc_ftm_cfg; + mlan_ds_misc_cfg *misc_cfg = MNULL; + + ENTER(); + + if (pioctl_buf) { + misc_cfg = (mlan_ds_misc_cfg *)pioctl_buf->pbuf; + misc_cfg->param.dot11mc_unassoc_ftm_cfg.state = + wlan_le16_to_cpu(cfg_cmd->state); + } + LEAVE(); + return MLAN_STATUS_SUCCESS; +} + /** * @brief This function prepares command of Tx ampdu prot mode * diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_decl.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_decl.h index 11e6cd351c6a..9037910c11a9 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_decl.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_decl.h @@ -24,7 +24,7 @@ #define _MLAN_DECL_H_ /** MLAN release version */ -#define MLAN_RELEASE_VERSION "207" +#define MLAN_RELEASE_VERSION "210" /** Re-define generic data types for MLAN/MOAL */ /** Signed char (1-byte) */ @@ -238,7 +238,7 @@ typedef t_s32 t_sval; /** Size of command buffer */ /** because cal_data_size 2.4 k */ -#define MRVDRV_SIZE_OF_CMD_BUFFER (3 * 1024) +#define MRVDRV_SIZE_OF_CMD_BUFFER (4 * 1024) /** Size of rx command buffer */ #define MLAN_RX_CMD_BUF_SIZE MRVDRV_SIZE_OF_CMD_BUFFER /** Upload size */ @@ -754,6 +754,7 @@ typedef enum _mlan_event_id { MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027, 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; /** Data Structures */ @@ -803,6 +804,7 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t { #define OID_TYPE_CAL 0x2 #define OID_TYPE_DPD 0xa +#define UNKNOW_DPD_LENGTH 0xffffffff /** Custom data structure */ typedef struct _mlan_init_param { @@ -958,6 +960,18 @@ typedef struct _mlan_event { t_u8 event_buf[]; } mlan_event, *pmlan_event; +/** mlan_cmdresp_event data structure */ +typedef struct _mlan_cmdresp_event { + /** BSS index number for multiple BSS support */ + t_u32 bss_index; + /** Event ID */ + mlan_event_id event_id; + /** Event length */ + t_u32 event_len; + /** resp buffer pointer */ + t_u8 *resp; +} mlan_cmdresp_event, *pmlan_cmdresp_event; + /** csi event data structure */ /** mlan_ioctl_req data structure */ diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_fw.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_fw.h index 4f4d3128cb8c..cddbce4154de 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_fw.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_fw.h @@ -1598,6 +1598,7 @@ typedef MLAN_PACK_START struct _power_table_attr { #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 /** Enhanced PS modes */ typedef enum _ENH_PS_MODES { @@ -4649,10 +4650,12 @@ typedef struct MLAN_PACK_START _hostcmd_twt_setup { t_u8 twt_exponent; /** TWT Mantissa Range: [0-sizeof(UINT16)] */ t_u16 twt_mantissa; + /** TWT Request Type, 0: REQUEST_TWT, 1: SUGGEST_TWT*/ + t_u8 twt_request; /** TWT Setup State. Set to 0 by driver, filled by FW in response*/ t_u8 twt_setup_state; /** Reserved, set to 0. */ - t_u8 reserved[3]; + t_u8 reserved[2]; } MLAN_PACK_END hostcmd_twt_setup, *phostcmd_twt_setup; /** Type definition of hostcmd_twt_teardown */ @@ -7031,6 +7034,14 @@ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_TX_AMPDU_PROT_MODE { t_u16 mode; } MLAN_PACK_END HostCmd_DS_CMD_TX_AMPDU_PROT_MODE; +/** HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG */ +typedef MLAN_PACK_START struct _HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG { + /** Action */ + t_u16 action; + /** Cfg state */ + t_u16 state; +} MLAN_PACK_END HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG; + /** HostCmd_CMD_RATE_ADAPT_CFG */ typedef MLAN_PACK_START struct _HostCmd_DS_CMD_RATE_ADAPT_CFG { /** Action */ @@ -7325,6 +7336,7 @@ typedef struct MLAN_PACK_START _HostCmd_DS_COMMAND { struct mfg_cmd_tx_cont mfg_tx_cont; struct mfg_cmd_tx_frame2 mfg_tx_frame2; HostCmd_DS_CMD_ARB_CONFIG arb_cfg; + HostCmd_DS_CMD_DOT11MC_UNASSOC_FTM_CFG dot11mc_unassoc_ftm_cfg; } params; } MLAN_PACK_END HostCmd_DS_COMMAND, *pHostCmd_DS_COMMAND; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h index c3a0a495b62c..caaadb03ca53 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_ioctl.h @@ -330,6 +330,7 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_BEACON_STUCK = 0x00200079, MLAN_OID_MISC_CFP_TABLE = 0x0020007A, MLAN_OID_MISC_RANGE_EXT = 0x0020007B, + MLAN_OID_MISC_DOT11MC_UNASSOC_FTM_CFG = 0x0020007C, }; /** Sub command size */ @@ -2870,9 +2871,7 @@ typedef struct _mlan_ds_beacon_stuck_param_cfg { #define HOST_SLEEP_COND_IPV6_PACKET MBIT(31) /** Host sleep config conditions: Default */ -#define HOST_SLEEP_DEF_COND \ - (HOST_SLEEP_COND_BROADCAST_DATA | HOST_SLEEP_COND_UNICAST_DATA | \ - HOST_SLEEP_COND_MAC_EVENT) +#define HOST_SLEEP_DEF_COND 0 /** Host sleep config GPIO : Default */ #define HOST_SLEEP_DEF_GPIO 0xff @@ -3908,6 +3907,8 @@ typedef struct MLAN_PACK_START _mlan_ds_twt_setup { t_u8 twt_exponent; /** TWT Mantissa Range: [0-sizeof(UINT16)] */ t_u16 twt_mantissa; + /** TWT Request Type, 0: REQUEST_TWT, 1: SUGGEST_TWT*/ + t_u8 twt_request; } MLAN_PACK_END mlan_ds_twt_setup, *pmlan_ds_twt_setup; /** Type definition of mlan_ds_twt_teardown for MLAN_OID_11AX_TWT_CFG */ @@ -4175,7 +4176,7 @@ typedef struct _mlan_ds_misc_cmd { /** Command length */ t_u32 len; /** Command buffer */ - t_u8 cmd[MLAN_SIZE_OF_CMD_BUFFER]; + t_u8 cmd[MRVDRV_SIZE_OF_CMD_BUFFER]; } mlan_ds_misc_cmd; /** Maximum number of system clocks */ @@ -4244,6 +4245,14 @@ typedef struct _mlan_ds_misc_tx_ampdu_prot_mode { t_u16 mode; } mlan_ds_misc_tx_ampdu_prot_mode; +/** Type definition of mlan_ds_misc_dot11mc_unassoc_ftm_cfg + * for MLAN_OID_MISC_DOT11MC_UNASSOC_FTM_CFG + */ +typedef struct _mlan_ds_misc_dot11mc_unassoc_ftm_cfg { + /** set the state */ + t_u16 state; +} mlan_ds_misc_dot11mc_unassoc_ftm_cfg; + #define RATEADAPT_ALGO_LEGACY 0 #define RATEADAPT_ALGO_SR 1 @@ -5089,6 +5098,7 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_arb_cfg arb_cfg; mlan_ds_misc_cfp_tbl cfp; t_u8 range_ext_mode; + mlan_ds_misc_dot11mc_unassoc_ftm_cfg dot11mc_unassoc_ftm_cfg; } param; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_main.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_main.h index 2f145a696313..5c4ff7136f11 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_main.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_main.h @@ -2671,6 +2671,7 @@ typedef struct _mlan_adapter { /** Ethernet packet type for EAPOL */ #define MLAN_ETHER_PKT_TYPE_EAPOL (0x888E) +#define MLAN_ETHER_PKT_TYPE_ARP (0x0806) /** Ethernet packet type for WAPI */ #define MLAN_ETHER_PKT_TYPE_WAPI (0x88B4) /** Ethernet packet type offset */ @@ -3312,6 +3313,13 @@ mlan_status wlan_cmd_tx_ampdu_prot_mode(pmlan_private pmpriv, mlan_status wlan_ret_tx_ampdu_prot_mode(pmlan_private pmpriv, HostCmd_DS_COMMAND *resp, mlan_ioctl_req *pioctl_buf); +mlan_status wlan_cmd_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *cmd, + t_u16 cmd_action, + t_void *pdata_buf); +mlan_status wlan_ret_dot11mc_unassoc_ftm_cfg(pmlan_private pmpriv, + HostCmd_DS_COMMAND *resp, + mlan_ioctl_req *pioctl_buf); mlan_status wlan_cmd_rate_adapt_cfg(pmlan_private pmpriv, HostCmd_DS_COMMAND *cmd, t_u16 cmd_action, @@ -3338,6 +3346,8 @@ mlan_status wlan_misc_ioctl_rxabortcfg_ext(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, + pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_rate_adapt_cfg(pmlan_adapter pmadapter, pmlan_ioctl_req pioctl_req); mlan_status wlan_misc_ioctl_cck_desense_cfg(pmlan_adapter pmadapter, diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_misc.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_misc.c index b2013e978e9d..a6208fa5e5e9 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_misc.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_misc.c @@ -5563,6 +5563,38 @@ mlan_status wlan_misc_ioctl_rxabortcfg_ext(pmlan_adapter pmadapter, return ret; } +/** + * @brief Dot11mc unassociated FTM CFG + * + * @param pmadapter A pointer to mlan_adapter structure + * @param pioctl_req A pointer to ioctl request buffer + * + * @return MLAN_STATUS_PENDING --success, otherwise fail + */ +mlan_status wlan_misc_ioctl_dot11mc_unassoc_ftm_cfg(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_DOT11MC_UNASSOC_FTM_CFG, + cmd_action, 0, (t_void *)pioctl_req, + &(pmisc->param.dot11mc_unassoc_ftm_cfg)); + if (ret == MLAN_STATUS_SUCCESS) + ret = MLAN_STATUS_PENDING; + + LEAVE(); + return ret; +} + /** * @brief Tx ampdu protection mode * diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_pcie.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_pcie.c index 04cd3f403422..7d4977e52c5b 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_pcie.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_pcie.c @@ -1365,7 +1365,7 @@ static mlan_status wlan_pcie_delete_cmdrsp_buf(mlan_adapter *pmadapter) pmbuf = pmadapter->pcard_pcie->cmd_buf; pcb->moal_unmap_memory(pmadapter->pmoal_handle, pmbuf->pbuf + pmbuf->data_offset, - pmbuf->buf_pa, MLAN_SIZE_OF_CMD_BUFFER, + pmbuf->buf_pa, MRVDRV_SIZE_OF_CMD_BUFFER, PCI_DMA_TODEVICE); } @@ -2362,7 +2362,7 @@ static mlan_status wlan_pcie_process_cmd_resp(mlan_adapter *pmadapter) memcpy_ext(pmadapter, pmadapter->upld_buf, pmbuf->pbuf + pmbuf->data_offset + PCIE_INTF_HEADER_LEN, - pmadapter->upld_len, MLAN_SIZE_OF_CMD_BUFFER); + pmadapter->upld_len, MRVDRV_SIZE_OF_CMD_BUFFER); } else { pmadapter->cmd_resp_received = MTRUE; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_shim.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_shim.c index 903b4e263849..2859aa9e77e9 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_shim.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_shim.c @@ -670,7 +670,7 @@ mlan_status mlan_set_init_param(t_void *pmlan_adapter, pmlan_init_param pparam) MASSERT(pmlan_adapter); /** Save DPD data in MLAN */ - if ((pparam->pdpd_data_buf) && (pparam->dpd_data_len > 0)) { + if ((pparam->pdpd_data_buf) || (pparam->dpd_data_len > 0)) { pmadapter->pdpd_data = pparam->pdpd_data_buf; pmadapter->dpd_data_len = pparam->dpd_data_len; } @@ -1308,6 +1308,7 @@ mlan_status mlan_send_packet(t_void *pmlan_adapter, pmlan_buffer pmbuf) MLAN_ETHER_PKT_TYPE_OFFSET]); if (((pmadapter->priv[pmbuf->bss_index]->port_ctrl_mode == MTRUE) && ((eth_type == MLAN_ETHER_PKT_TYPE_EAPOL) || + (eth_type == MLAN_ETHER_PKT_TYPE_ARP) || (eth_type == MLAN_ETHER_PKT_TYPE_WAPI))) || (pmbuf->buf_type == MLAN_BUF_TYPE_RAW_DATA) diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c index 0adca3a971e5..314e8fb7f3e4 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmd.c @@ -2833,6 +2833,10 @@ mlan_status wlan_ops_sta_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_tx_ampdu_prot_mode(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG: + ret = wlan_cmd_dot11mc_unassoc_ftm_cfg(pmpriv, cmd_ptr, + cmd_action, pdata_buf); + break; case HostCmd_CMD_RATE_ADAPT_CFG: ret = wlan_cmd_rate_adapt_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c index 16956af389c8..4cd48b815767 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_cmdresp.c @@ -2692,6 +2692,10 @@ mlan_status wlan_ops_sta_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_TX_AMPDU_PROT_MODE: ret = wlan_ret_tx_ampdu_prot_mode(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG: + ret = wlan_ret_dot11mc_unassoc_ftm_cfg(pmpriv, resp, + pioctl_buf); + break; case HostCmd_CMD_RATE_ADAPT_CFG: ret = wlan_ret_rate_adapt_cfg(pmpriv, resp, pioctl_buf); break; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c index 304efa99eceb..852f5d395a5a 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_event.c @@ -930,7 +930,7 @@ mlan_status wlan_ops_sta_process_event(t_void *priv) } break; case EVENT_FW_DUMP_INFO: - PRINTM(MEVENT, "EVENT: Dump FW info\n"); + PRINTM(MINFO, "EVENT: Dump FW info\n"); pevent->bss_index = pmpriv->bss_index; pevent->event_id = MLAN_EVENT_ID_FW_DUMP_INFO; pevent->event_len = pmbuf->data_len; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c index 4e4c7cfee59f..6724a17f2742 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_sta_ioctl.c @@ -4493,7 +4493,7 @@ mlan_status wlan_misc_ioctl_mef_cfg(pmlan_adapter pmadapter, buf_len += sizeof(HostCmd_DS_MEF_CFG); filter = buf + buf_len; memcpy_ext(pmpriv->adapter, filter, fltr_buf, sizeof(fltr_buf), - MLAN_SIZE_OF_CMD_BUFFER - buf_len); + MRVDRV_SIZE_OF_CMD_BUFFER - buf_len); buf_len += sizeof(fltr_buf); break; case MEF_CFG_AUTO_ARP_RESP: @@ -4505,7 +4505,7 @@ mlan_status wlan_misc_ioctl_mef_cfg(pmlan_adapter pmadapter, filter = buf + buf_len; memcpy_ext(pmpriv->adapter, filter, mef_cfg->param.cmd_buf.cmd, mef_cfg->param.cmd_buf.len, - MLAN_SIZE_OF_CMD_BUFFER - buf_len); + MRVDRV_SIZE_OF_CMD_BUFFER - buf_len); buf_len += mef_cfg->param.cmd_buf.len; break; default: @@ -5147,6 +5147,10 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, status = wlan_misc_ioctl_tx_ampdu_prot_mode(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_DOT11MC_UNASSOC_FTM_CFG: + status = wlan_misc_ioctl_dot11mc_unassoc_ftm_cfg(pmadapter, + pioctl_req); + break; case MLAN_OID_MISC_RATE_ADAPT_CFG: status = wlan_misc_ioctl_rate_adapt_cfg(pmadapter, pioctl_req); break; @@ -5167,6 +5171,7 @@ static mlan_status wlan_misc_cfg_ioctl(pmlan_adapter pmadapter, case MLAN_OID_MISC_ARB_CONFIG: status = wlan_misc_ioctl_arb_cfg(pmadapter, pioctl_req); break; + case MLAN_OID_MISC_RANGE_EXT: status = wlan_misc_ioctl_range_ext(pmadapter, pioctl_req); break; default: diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c index 53edcc2ac7bb..86a6e72d1cff 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_cmdevent.c @@ -4571,6 +4571,10 @@ mlan_status wlan_ops_uap_prepare_cmd(t_void *priv, t_u16 cmd_no, ret = wlan_cmd_tx_ampdu_prot_mode(pmpriv, cmd_ptr, cmd_action, pdata_buf); break; + case HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG: + ret = wlan_cmd_dot11mc_unassoc_ftm_cfg(pmpriv, cmd_ptr, + cmd_action, pdata_buf); + break; case HostCmd_CMD_RATE_ADAPT_CFG: ret = wlan_cmd_rate_adapt_cfg(pmpriv, cmd_ptr, cmd_action, pdata_buf); @@ -4941,6 +4945,10 @@ mlan_status wlan_ops_uap_process_cmdresp(t_void *priv, t_u16 cmdresp_no, case HostCmd_CMD_TX_AMPDU_PROT_MODE: ret = wlan_ret_tx_ampdu_prot_mode(pmpriv, resp, pioctl_buf); break; + case HostCmd_CMD_DOT11MC_UNASSOC_FTM_CFG: + ret = wlan_ret_dot11mc_unassoc_ftm_cfg(pmpriv, resp, + pioctl_buf); + break; case HostCmd_CMD_RATE_ADAPT_CFG: ret = wlan_ret_rate_adapt_cfg(pmpriv, resp, pioctl_buf); break; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c index 032fb2328395..8de4bd3d08ae 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlan/mlan_uap_ioctl.c @@ -2069,6 +2069,9 @@ mlan_status wlan_ops_uap_ioctl(t_void *adapter, pmlan_ioctl_req pioctl_req) if (misc->sub_command == MLAN_OID_MISC_TX_AMPDU_PROT_MODE) status = wlan_misc_ioctl_tx_ampdu_prot_mode(pmadapter, pioctl_req); + if (misc->sub_command == MLAN_OID_MISC_DOT11MC_UNASSOC_FTM_CFG) + status = wlan_misc_ioctl_dot11mc_unassoc_ftm_cfg( + pmadapter, pioctl_req); if (misc->sub_command == MLAN_OID_MISC_RATE_ADAPT_CFG) status = wlan_misc_ioctl_rate_adapt_cfg(pmadapter, pioctl_req); diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_decl.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_decl.h index 11e6cd351c6a..9037910c11a9 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_decl.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_decl.h @@ -24,7 +24,7 @@ #define _MLAN_DECL_H_ /** MLAN release version */ -#define MLAN_RELEASE_VERSION "207" +#define MLAN_RELEASE_VERSION "210" /** Re-define generic data types for MLAN/MOAL */ /** Signed char (1-byte) */ @@ -238,7 +238,7 @@ typedef t_s32 t_sval; /** Size of command buffer */ /** because cal_data_size 2.4 k */ -#define MRVDRV_SIZE_OF_CMD_BUFFER (3 * 1024) +#define MRVDRV_SIZE_OF_CMD_BUFFER (4 * 1024) /** Size of rx command buffer */ #define MLAN_RX_CMD_BUF_SIZE MRVDRV_SIZE_OF_CMD_BUFFER /** Upload size */ @@ -754,6 +754,7 @@ typedef enum _mlan_event_id { MLAN_EVENT_ID_DRV_ASSOC_SUCC_LOGGER = 0x80000027, 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; /** Data Structures */ @@ -803,6 +804,7 @@ typedef MLAN_PACK_START struct _MrvlIEtypes_Data_t { #define OID_TYPE_CAL 0x2 #define OID_TYPE_DPD 0xa +#define UNKNOW_DPD_LENGTH 0xffffffff /** Custom data structure */ typedef struct _mlan_init_param { @@ -958,6 +960,18 @@ typedef struct _mlan_event { t_u8 event_buf[]; } mlan_event, *pmlan_event; +/** mlan_cmdresp_event data structure */ +typedef struct _mlan_cmdresp_event { + /** BSS index number for multiple BSS support */ + t_u32 bss_index; + /** Event ID */ + mlan_event_id event_id; + /** Event length */ + t_u32 event_len; + /** resp buffer pointer */ + t_u8 *resp; +} mlan_cmdresp_event, *pmlan_cmdresp_event; + /** csi event data structure */ /** mlan_ioctl_req data structure */ diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h index c3a0a495b62c..caaadb03ca53 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/mlan_ioctl.h @@ -330,6 +330,7 @@ enum _mlan_ioctl_req_id { MLAN_OID_MISC_BEACON_STUCK = 0x00200079, MLAN_OID_MISC_CFP_TABLE = 0x0020007A, MLAN_OID_MISC_RANGE_EXT = 0x0020007B, + MLAN_OID_MISC_DOT11MC_UNASSOC_FTM_CFG = 0x0020007C, }; /** Sub command size */ @@ -2870,9 +2871,7 @@ typedef struct _mlan_ds_beacon_stuck_param_cfg { #define HOST_SLEEP_COND_IPV6_PACKET MBIT(31) /** Host sleep config conditions: Default */ -#define HOST_SLEEP_DEF_COND \ - (HOST_SLEEP_COND_BROADCAST_DATA | HOST_SLEEP_COND_UNICAST_DATA | \ - HOST_SLEEP_COND_MAC_EVENT) +#define HOST_SLEEP_DEF_COND 0 /** Host sleep config GPIO : Default */ #define HOST_SLEEP_DEF_GPIO 0xff @@ -3908,6 +3907,8 @@ typedef struct MLAN_PACK_START _mlan_ds_twt_setup { t_u8 twt_exponent; /** TWT Mantissa Range: [0-sizeof(UINT16)] */ t_u16 twt_mantissa; + /** TWT Request Type, 0: REQUEST_TWT, 1: SUGGEST_TWT*/ + t_u8 twt_request; } MLAN_PACK_END mlan_ds_twt_setup, *pmlan_ds_twt_setup; /** Type definition of mlan_ds_twt_teardown for MLAN_OID_11AX_TWT_CFG */ @@ -4175,7 +4176,7 @@ typedef struct _mlan_ds_misc_cmd { /** Command length */ t_u32 len; /** Command buffer */ - t_u8 cmd[MLAN_SIZE_OF_CMD_BUFFER]; + t_u8 cmd[MRVDRV_SIZE_OF_CMD_BUFFER]; } mlan_ds_misc_cmd; /** Maximum number of system clocks */ @@ -4244,6 +4245,14 @@ typedef struct _mlan_ds_misc_tx_ampdu_prot_mode { t_u16 mode; } mlan_ds_misc_tx_ampdu_prot_mode; +/** Type definition of mlan_ds_misc_dot11mc_unassoc_ftm_cfg + * for MLAN_OID_MISC_DOT11MC_UNASSOC_FTM_CFG + */ +typedef struct _mlan_ds_misc_dot11mc_unassoc_ftm_cfg { + /** set the state */ + t_u16 state; +} mlan_ds_misc_dot11mc_unassoc_ftm_cfg; + #define RATEADAPT_ALGO_LEGACY 0 #define RATEADAPT_ALGO_SR 1 @@ -5089,6 +5098,7 @@ typedef struct _mlan_ds_misc_cfg { mlan_ds_misc_arb_cfg arb_cfg; mlan_ds_misc_cfp_tbl cfp; t_u8 range_ext_mode; + mlan_ds_misc_dot11mc_unassoc_ftm_cfg dot11mc_unassoc_ftm_cfg; } param; } mlan_ds_misc_cfg, *pmlan_ds_misc_cfg; diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c index 8c01f52a3358..d262fcd0a4b0 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.c @@ -401,7 +401,7 @@ int woal_priv_hostcmd(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen, PRINTM(MINFO, "Host command len = %d\n", woal_le16_to_cpu(cmd_header.size)); - if (woal_le16_to_cpu(cmd_header.size) > MLAN_SIZE_OF_CMD_BUFFER) { + if (woal_le16_to_cpu(cmd_header.size) > MRVDRV_SIZE_OF_CMD_BUFFER) { LEAVE(); return -EINVAL; } @@ -419,7 +419,7 @@ int woal_priv_hostcmd(moal_private *priv, t_u8 *respbuf, t_u32 respbuflen, /* get the whole command */ moal_memcpy_ext(priv->phandle, misc_cfg->param.hostcmd.cmd, data_ptr + sizeof(buf_len), misc_cfg->param.hostcmd.len, - MLAN_SIZE_OF_CMD_BUFFER); + MRVDRV_SIZE_OF_CMD_BUFFER); status = woal_request_ioctl(priv, req, wait_option); if (status != MLAN_STATUS_SUCCESS) { @@ -10370,7 +10370,7 @@ static int woal_priv_dfs_testing(moal_private *priv, t_u8 *respbuf, goto done; } ds_11hcfg->param.dfs_testing.usr_cac_period_msec = - (t_u32)data[0]; + (t_u32)data[0] * 1000; ds_11hcfg->param.dfs_testing.usr_nop_period_sec = (t_u16)data[1]; ds_11hcfg->param.dfs_testing.usr_no_chan_change = @@ -10393,7 +10393,8 @@ static int woal_priv_dfs_testing(moal_private *priv, t_u8 *respbuf, } if (!user_data_len) { - data[0] = ds_11hcfg->param.dfs_testing.usr_cac_period_msec; + data[0] = + ds_11hcfg->param.dfs_testing.usr_cac_period_msec / 1000; data[1] = ds_11hcfg->param.dfs_testing.usr_nop_period_sec; data[2] = ds_11hcfg->param.dfs_testing.usr_no_chan_change; data[3] = ds_11hcfg->param.dfs_testing.usr_fixed_new_chan; @@ -14267,6 +14268,86 @@ done: return ret; } +/** + * @brief Enable/Disable Un-associated Dot11mc FTM Frame exchanges + * + * @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. + */ +int woal_priv_dot11mc_unassoc_ftm_cfg(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[1] = {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_DOT11MC_UNASSOC_FTM_CFG); + 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_DOT11MC_UNASSOC_FTM_CFG; + req->req_id = MLAN_IOCTL_MISC_CFG; + if (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 > 1) { + PRINTM(MERROR, "Invalid number of args!\n"); + ret = -EINVAL; + goto done; + } + if ((data[0] != MTRUE) && (data[0] != MFALSE)) { + PRINTM(MERROR, "Invalid state for unassoc ftm\n"); + ret = -EINVAL; + goto done; + } + misc->param.dot11mc_unassoc_ftm_cfg.state = (t_u16)data[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; + } + + data[0] = misc->param.dot11mc_unassoc_ftm_cfg.state; + 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 Tx AMPDU protection mode * @@ -15225,6 +15306,15 @@ int woal_android_priv_cmd(struct net_device *dev, struct ifreq *req) len = woal_priv_tx_ampdu_prot_mode(priv, buf, priv_cmd.total_len); goto handled; + } else if (strnicmp(buf + strlen(CMD_NXP), + PRIV_CMD_DOT11MC_UNASSOC_FTM_CFG, + strlen(PRIV_CMD_DOT11MC_UNASSOC_FTM_CFG)) == + 0) { + /* setting for dot11mc un-associated case FTM frame + * exchange */ + len = woal_priv_dot11mc_unassoc_ftm_cfg( + priv, buf, priv_cmd.total_len); + goto handled; } else if (strnicmp(buf + strlen(CMD_NXP), PRIV_CMD_RATE_ADAPT_CFG, strlen(PRIV_CMD_RATE_ADAPT_CFG)) == 0) { diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h index df5172694e39..f27d269d1f17 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_eth_ioctl.h @@ -293,6 +293,7 @@ typedef struct _chan_stats { #define CCK_DESENSE_MODE_DYN_ENH 2 /**Private command to configure cck desense config */ #define PRIV_CMD_CCK_DESENSE_CFG "cck_desense_cfg" +#define PRIV_CMD_DOT11MC_UNASSOC_FTM_CFG "dot11mc_unassoc_ftm_cfg" /** Private command ID for Android default commands */ #define WOAL_ANDROID_DEF_CMD (SIOCDEVPRIVATE + 1) diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c index 796eb36e4041..a6df8c052d6d 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_ioctl.c @@ -2067,7 +2067,7 @@ int woal_host_command(moal_private *priv, struct iwreq *wrq) PRINTM(MINFO, "Host command len = %u\n", misc->param.hostcmd.len); if (!misc->param.hostcmd.len || - misc->param.hostcmd.len > MLAN_SIZE_OF_CMD_BUFFER) { + misc->param.hostcmd.len > MRVDRV_SIZE_OF_CMD_BUFFER) { PRINTM(MERROR, "Invalid data buffer length\n"); ret = -EINVAL; goto done; @@ -2156,7 +2156,7 @@ int woal_hostcmd_ioctl(struct net_device *dev, struct ifreq *req) PRINTM(MINFO, "Host command len = %d\n", woal_le16_to_cpu(cmd_header.size)); - if (woal_le16_to_cpu(cmd_header.size) > MLAN_SIZE_OF_CMD_BUFFER) { + if (woal_le16_to_cpu(cmd_header.size) > MRVDRV_SIZE_OF_CMD_BUFFER) { ret = -EINVAL; goto done; } diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.c index f020313b1088..a4d5f0b8b919 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.c @@ -2784,6 +2784,7 @@ static mlan_status woal_req_dpd_data(moal_handle *handle, int ret = MLAN_STATUS_SUCCESS; t_u8 req_fw_nowait = moal_extflg_isset(handle, EXT_REQ_FW_NOWAIT); char *dpd_data_cfg = handle->params.dpd_data_cfg; + mlan_status status = MLAN_STATUS_SUCCESS; ENTER(); @@ -2819,8 +2820,10 @@ static mlan_status woal_req_dpd_data(moal_handle *handle, handle->init_user_conf_wait_q, handle->init_user_conf_wait_flag); } else { - if ((request_firmware(&handle->dpd_data, dpd_data_cfg, - handle->hotplug_device)) < 0) { + status = request_firmware(&handle->dpd_data, + dpd_data_cfg, + handle->hotplug_device); + if (status < 0 && status != -ENOENT) { PRINTM(MERROR, "DPD data request_firmware() failed\n"); ret = MLAN_STATUS_FAILURE; @@ -2830,6 +2833,8 @@ static mlan_status woal_req_dpd_data(moal_handle *handle, if (handle->dpd_data) { param->pdpd_data_buf = (t_u8 *)handle->dpd_data->data; param->dpd_data_len = handle->dpd_data->size; + } else { + param->dpd_data_len = UNKNOW_DPD_LENGTH; } } @@ -6195,6 +6200,7 @@ static int woal_get_card_info(moal_handle *phandle) #ifdef PCIE9098 case CARD_TYPE_PCIE9098: phandle->card_info = &card_info_PCIE9098; + phandle->event_fw_dump = MTRUE; break; #endif #ifdef USB8997 @@ -6987,11 +6993,14 @@ save_ssudump: #endif /* SSU_SUPPORT */ #define OFFSET_SEQNUM 4 +#define OFFSET_TYPE 8 +#define DUMP_TYPE_ENDE 2 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; @@ -7002,7 +7011,15 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) 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) { + if (drvdbg & MFW_D) + drvdbg &= ~MFW_D; + 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, @@ -7049,13 +7066,18 @@ t_void woal_store_firmware_dump(moal_handle *phandle, mlan_event *pmevent) LEAVE(); return; } + phandle->fw_dump_len += pmevent->event_len - OFFSET_SEQNUM; #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) - vfs_write(pfile_fwdump, pmevent->event_buf, pmevent->event_len, &pos); + vfs_write(pfile_fwdump, pmevent->event_buf + OFFSET_SEQNUM, + pmevent->event_len - OFFSET_SEQNUM, &pos); #else - kernel_write(pfile_fwdump, pmevent->event_buf, pmevent->event_len, - &pos); + 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); LEAVE(); return; } @@ -7094,7 +7116,7 @@ static int woal_save_hex_dump(int rowsize, const void *buf, size_t len, hex_dump_to_buffer(ptr + i, linelen, rowsize, 1, linebuf, sizeof(linebuf), false); - pos += sprintf(pos, "%p: %s\n", ptr + i, linebuf); + pos += sprintf(pos, "%s\n", linebuf); } return pos - (char *)save_buf; @@ -7438,6 +7460,81 @@ static int woal_dump_mlan_drv_info(moal_private *priv, t_u8 *buf) LEAVE(); return ptr - (char *)buf; } +#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) + sprintf(file_path, "%s%s", DEF_FW_PATH, dpd_data_cfg); + else + sprintf(file_path, "%s", DEF_HOSTCMD_PATH); + break; + default: + sprintf(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 += sprintf(ptr, "hostcmd_%02x=={\n", command); + ptr += woal_save_hex_dump(ROW_SIZE_16, resp, pevent->event_len, MFALSE, + ptr); + ptr += sprintf(ptr, "}\n"); + len = ptr - (char *)buf; + +#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 14, 0) + fs = get_fs(); + set_fs(KERNEL_DS); + vfs_write(pfile, 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; +} /** * @brief This function dump moal hex to file diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.h b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.h index 60e667162341..8421ae6ec39f 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.h +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_main.h @@ -1906,6 +1906,10 @@ struct _moal_handle { t_u8 ioctl_timeout; /** FW dump state */ t_u8 fw_dump; + /** event fw dump */ + t_u8 event_fw_dump; + /** fw dump buffer total len */ + t_u64 fw_dump_len; /** FW dump full name */ t_u8 firmware_dump_file[128]; #ifdef SDIO @@ -2733,6 +2737,8 @@ void woal_store_firmware_dump(moal_handle *phandle, pmlan_event pmevent); 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); int woal_pre_warmreset(moal_private *priv); int woal_warmreset(moal_private *priv); diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_pcie.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_pcie.c index 19a0e4a4e968..150a4d634df2 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_pcie.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_pcie.c @@ -34,7 +34,9 @@ Change log: #include #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 70) #include +#endif /******************************************************** Local Variables ********************************************************/ @@ -119,6 +121,8 @@ static const struct pci_device_id wlan_ids[] = { /* moal interface ops */ static moal_if_ops pcie_ops; +MODULE_DEVICE_TABLE(pci, wlan_ids); + /******************************************************** Global Variables ********************************************************/ @@ -1352,7 +1356,9 @@ mlan_status woal_pcie_bus_register(void) #endif #endif +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 70) request_bus_freq(BUS_FREQ_HIGH); +#endif /* API registers the NXP PCIE driver */ if (pci_register_driver(&wlan_pcie)) { PRINTM(MFATAL, "PCIE Driver Registration Failed \n"); @@ -1377,7 +1383,9 @@ void woal_pcie_bus_unregister(void) { ENTER(); +#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 70) release_bus_freq(BUS_FREQ_HIGH); +#endif /* PCIE Driver Unregistration */ pci_unregister_driver(&wlan_pcie); #if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 6, 0) @@ -1488,7 +1496,7 @@ int woal_pcie_dump_reg_info(moal_handle *phandle, t_u8 *buffer) drv_ptr += sprintf(drv_ptr, "reg:0x%x value=0x%x\n", reg, value); - msleep(100); + mdelay(100); } drv_ptr += sprintf(drv_ptr, @@ -1627,7 +1635,7 @@ static void woal_pcie_reg_dbg(moal_handle *phandle) woal_pcie_read_reg(phandle, reg, &value); PRINTM(MERROR, "reg:0x%x value=0x%x\n", reg, value); - msleep(100); + mdelay(100); } PRINTM(MMSG, "Interface registers dump from offset 0x%x to 0x%x\n", dump_start_reg, dump_end_reg); @@ -1740,6 +1748,7 @@ memory_type_mapping mem_type_mapping_tbl_8897[] = { #if defined(PCIE8997) || defined(PCIE9098) || defined(PCIE9097) #define DEBUG_HOST_READY_8997 0xCC +#define DEBUG_HOST_EVENT_READY 0xAA #define DEBUG_MEMDUMP_FINISH_8997 0xDD memory_type_mapping mem_type_mapping_tbl_8997 = {"DUMP", NULL, NULL, 0xDD, 0x00}; @@ -1797,7 +1806,10 @@ rdwr_status woal_pcie_rdwr_firmware(moal_handle *phandle, t_u8 doneflag) #if defined(PCIE9098) || defined(PCIE9097) if (IS_PCIE9098(phandle->card_type) || IS_PCIE9097(phandle->card_type)) { - debug_host_ready = DEBUG_HOST_READY_8997; + if (phandle->event_fw_dump) + debug_host_ready = DEBUG_HOST_EVENT_READY; + else + debug_host_ready = DEBUG_HOST_READY_8997; dump_ctrl_reg = PCIE9098_DUMP_CTRL_REG; } #endif @@ -2044,7 +2056,19 @@ void woal_pcie_dump_fw_info_v2(moal_handle *phandle) PRINTM(MERROR, "Could not dump firmwware info\n"); return; } - +#if defined(PCIE9098) || defined(PCIE9097) + if (IS_PCIE9098(phandle->card_type) || + IS_PCIE9097(phandle->card_type)) { + if (phandle->event_fw_dump) { + if (RDWR_STATUS_FAILURE != + woal_pcie_rdwr_firmware(phandle, doneflag)) + PRINTM(MMSG, + "====PCIE FW DUMP EVENT MODE START ====\n"); + phandle->event_fw_dump = MFALSE; + return; + } + } +#endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0) /** Create dump directory*/ woal_create_dump_dir(phandle, path_name, sizeof(path_name)); diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c index 4312b452f689..84fea5611671 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sdio_mmc.c @@ -111,6 +111,8 @@ static const struct sdio_device_id wlan_ids[] = { {}, }; +MODULE_DEVICE_TABLE(sdio, wlan_ids); + int woal_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id); void woal_sdio_remove(struct sdio_func *func); #ifdef SDIO diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_shim.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_shim.c index 72f0e994ef5e..2effd85a4238 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_shim.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_shim.c @@ -1415,21 +1415,25 @@ mlan_status moal_recv_event(t_void *pmoal_handle, pmlan_event pmevent) t_u8 radar_detected; ENTER(); - - 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)) - PRINTM(MEVENT, "event id:0x%x\n", pmevent->event_id); if (pmevent->event_id == MLAN_EVENT_ID_FW_DUMP_INFO) { woal_store_firmware_dump(pmoal_handle, pmevent); 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)) + PRINTM(MEVENT, "event id:0x%x\n", pmevent->event_id); #if defined(PCIE) if (pmevent->event_id == MLAN_EVENT_ID_SSU_DUMP_FILE) { woal_store_ssu_dump(pmoal_handle, pmevent); goto done; } #endif /* SSU_SUPPORT */ + if (pmevent->event_id == MLAN_EVENT_ID_STORE_HOST_CMD_RESP) { + woal_save_host_cmdresp((moal_handle *)pmoal_handle, + (mlan_cmdresp_event *)pmevent); + goto done; + } priv = woal_bss_index_to_priv(pmoal_handle, pmevent->bss_index); if (priv == NULL) { PRINTM(MERROR, "%s: priv is null\n", __func__); diff --git a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c index 547c1eb6f918..72f70404d85c 100644 --- a/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c +++ b/drivers/net/wireless/nxp/mxm_wifiex/wlan_src/mlinux/moal_sta_cfg80211.c @@ -895,7 +895,7 @@ enum moal_tm_attr { static const struct nla_policy moal_tm_policy[MOAL_TM_ATTR_MAX + 1] = { [MOAL_TM_ATTR_CMD] = {.type = NLA_U32}, [MOAL_TM_ATTR_DATA] = {.type = NLA_BINARY, - .len = MLAN_SIZE_OF_CMD_BUFFER}, + .len = MRVDRV_SIZE_OF_CMD_BUFFER}, }; enum moal_tm_command { @@ -948,7 +948,7 @@ static int woal_testmode_cmd(struct wiphy *wiphy, void *data, int len) moal_memcpy_ext(priv->phandle, misc_cfg->param.hostcmd.cmd, nla_data(tb[MOAL_TM_ATTR_DATA]), misc_cfg->param.hostcmd.len, - MLAN_SIZE_OF_CMD_BUFFER); + MRVDRV_SIZE_OF_CMD_BUFFER); status = woal_request_ioctl(priv, req, MOAL_IOCTL_WAIT); if (status != MLAN_STATUS_SUCCESS) { err = -EFAULT;