MLK-25013 net: wireless: nxp: mxm_wifiex: upgrade to mxm5x16210 release

Upgrade to mxm5x16210 verison:
- Fixed WPA3 SAE pre-cert requirement where there is no assoc
  request from DUT, if EX-AP sends the Auth confirm frame
  immediately after Auth commit frame

Reviewed-by: yang.tian <yang.tian@nxp.com>
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
(cherry picked from commit: 0a14a53a273aecb7dfb837cf90f15744e893e6bf)
This commit is contained in:
Fugang Duan 2020-11-17 14:20:12 +08:00
parent c2863ce025
commit 04b2fa2cd5
26 changed files with 509 additions and 55 deletions

View File

@ -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:

View File

@ -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
*

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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
*

View File

@ -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;

View File

@ -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)

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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:

View File

@ -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;

View File

@ -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);

View File

@ -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 */

View File

@ -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;

View File

@ -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) {

View File

@ -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)

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -34,7 +34,9 @@ Change log:
#include <linux/pm_qos.h>
#endif
#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 4, 70)
#include <linux/busfreq-imx.h>
#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));

View File

@ -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

View File

@ -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__);

View File

@ -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;