*** Add support for wifi QMI client handshakes ***
Subsystems (3)
v4 cover *** Add support for wifi QMI client handshakes ***
Add QMI client handshakes for Q6 integrated WLAN connectivity subsystem. This module is responsible for communicating WLAN control messages to FW over QMI interface. This patch series enables the qmi handshakes required for WCN3990 chipset.
QUALCOMM MSM Interface(QMI) provides the control interface between components running b/w remote processors with underlying transport layer based on integrated chipset(shared memory) or discrete chipset(PCI/USB/SDIO/UART).
QMI client driver implementation is based on qmi framework https://lwn.net/Articles/729924/.
Below is the sequence of qmi handshake.
QMI CLIENT(APPS) QMI SERVER(FW in Q6)
<------wlan service discoverd----
-----connect to wlam qmi service----->
------------wlan info request----->
<------------wlan info resp------------
------------msa info req-------->
<------------msa info resp------------
------------msa ready req-------->
<------------msa ready resp------------
<------------msa ready indication-------
------------capability req------->
<------------capability resp------------
------------qmi bdf req--------->
<------------qmi bdf resp------------
------------qmi cal trigger------->
<------------ QMI FW ready indication-------WLAN fw is running in modem Q6 dsp as user PD(protection domain). Sequence of user PD loading is as following.
1) Remote proc PIL driver loads the modem fw/ROOT PD.
2) As part of ROOT pd boot-up it queries to a daemon(pd_mapper) running in apps processor to determine how many usre pd's to be loaded by the remote processor(Q6).
3) Once user pd info is known to remote processor it loads the user pd via tftp protocol.
https://github.com/andersson/pd-mapper
https://github.com/andersson/tqftpserv
Changes since V3:
Removed msa memory child node and used only memory-region property. Fixed sparse warning reported in v3 change.
Changed qmi board id data type to u32 to align with fw defined value.
Changes since V2:
Addressed review comments from v2 version.
Removed msa-size from dt binding and added reference to reserved-memory/reserved-memory.txt.
Changes since V1:
Removed qmi client driver and integrated qmi client handshakes in snoc platform driver. Addressed comments on v1 version.
Switched to ath10k bdf download infra(board-2.bin)
Added MSA fixed region support to support unload use-case.
Unified logging.
Testing:
Tested all qmi handshakes, driver load/unload and STA/SAP sanity testing. Tested HW: SDM845(WCN3990) Tested FW: WLAN.HL.2.0-01192-QCAHLSWMTPLZ-1
Govind Singh (5):
ath10k: Add qmi service helpers for wcn3990 qmi client
dt: bindings: add bindings for msa memory region
firmware: qcom: scm: Add WLAN VMID for Qualcomm SCM interface
ath10k: Add debug mask for QMI layer
ath10k: Add QMI message handshake for wcn3990 client
Rakesh Pillai (1):
ath10k: Add support to create boardname for non-bmi target
.../bindings/net/wireless/qcom,ath10k.txt | 6 + drivers/net/wireless/ath/ath10k/Kconfig | 1 + drivers/net/wireless/ath/ath10k/Makefile | 4 +- drivers/net/wireless/ath/ath10k/core.c | 14 +- drivers/net/wireless/ath/ath10k/core.h | 4 + drivers/net/wireless/ath/ath10k/debug.h | 1 + drivers/net/wireless/ath/ath10k/qmi.c | 1019 ++++++++ drivers/net/wireless/ath/ath10k/qmi.h | 129 + .../net/wireless/ath/ath10k/qmi_wlfw_v01.c | 2072 +++++++++++++++++ .../net/wireless/ath/ath10k/qmi_wlfw_v01.h | 677 ++++++ drivers/net/wireless/ath/ath10k/snoc.c | 262 ++- drivers/net/wireless/ath/ath10k/snoc.h | 4 + include/linux/qcom_scm.h | 4 +- 13 files changed, 4186 insertions(+), 11 deletions(-) create mode 100644 drivers/net/wireless/ath/ath10k/qmi.c create mode 100644 drivers/net/wireless/ath/ath10k/qmi.h create mode 100644 drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c create mode 100644 drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h
Signature · 1 line
2.17.0
PATCH v4 1/6 ath10k: Add qmi service helpers for wcn3990 qmi client
WLAN qmi server running in Q6 exposes host to target cold boot qmi handshakes. Add WLAN QMI service helpers for ath10k wcn3990 qmi client.
--- .../net/wireless/ath/ath10k/qmi_wlfw_v01.c | 2072 +++++++++++++++++ .../net/wireless/ath/ath10k/qmi_wlfw_v01.h | 677 ++++++ 2 files changed, 2749 insertions(+) create mode 100644 drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c create mode 100644 drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.c new file +2072 -0
@@ -0,0 +1,2072 @@ +/* +* Copyright (c) 2018 The Linux Foundation. All rights reserved. +* +* Permission to use, copy, modify, and/or distribute this software for any +* purpose with or without fee is hereby granted, provided that the above +* copyright notice and this permission notice appear in all copies. +* +* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include <linux/soc/qcom/qmi.h> +#include <linux/types.h> +#include "qmi_wlfw_v01.h" + +static struct qmi_elem_info wlfw_ce_tgt_pipe_cfg_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_tgt_pipe_cfg_s_v01 , + pipe_num), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_pipedir_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_tgt_pipe_cfg_s_v01 , + pipe_dir), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_tgt_pipe_cfg_s_v01 , + nentries), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_tgt_pipe_cfg_s_v01 , + nbytes_max), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_tgt_pipe_cfg_s_v01 , + flags), + }, + {} +}; + +static struct qmi_elem_info wlfw_ce_svc_pipe_cfg_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_svc_pipe_cfg_s_v01 , + service_id), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_pipedir_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_svc_pipe_cfg_s_v01 , + pipe_dir), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_ce_svc_pipe_cfg_s_v01 , + pipe_num), + }, + {} +}; + +static struct qmi_elem_info wlfw_shadow_reg_cfg_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_2_BYTE , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_shadow_reg_cfg_s_v01 , + id), + }, + { + .data_type =QMI_UNSIGNED_2_BYTE , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_shadow_reg_cfg_s_v01 , + offset), + }, + {} +}; + +static struct qmi_elem_info wlfw_shadow_reg_v2_cfg_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_shadow_reg_v2_cfg_s_v01 , + addr), + }, + {} +}; + +static struct qmi_elem_info wlfw_memory_region_info_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_memory_region_info_s_v01 , + region_addr), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_memory_region_info_s_v01 , + size), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_memory_region_info_s_v01 , + secure_flag), + }, + {} +}; + +static struct qmi_elem_info wlfw_mem_cfg_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_cfg_s_v01 , + offset), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_cfg_s_v01 , + size), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_cfg_s_v01 , + secure_flag), + }, + {} +}; + +static struct qmi_elem_info wlfw_mem_seg_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_s_v01 , + size), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_mem_type_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_s_v01 , + type), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_s_v01 , + mem_cfg_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_NUM_MEM_CFG_V01 , + .elem_size =sizeof (struct wlfw_mem_cfg_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_s_v01 , + mem_cfg), + .ei_array = wlfw_mem_cfg_s_v01_ei, + }, + {} +}; + +static struct qmi_elem_info wlfw_mem_seg_resp_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_resp_s_v01 , + addr), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_resp_s_v01 , + size), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_mem_type_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_mem_seg_resp_s_v01 , + type), + }, + {} +}; + +static struct qmi_elem_info wlfw_rf_chip_info_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_rf_chip_info_s_v01 , + chip_id), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_rf_chip_info_s_v01 , + chip_family), + }, + {} +}; + +static struct qmi_elem_info wlfw_rf_board_info_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_rf_board_info_s_v01 , + board_id), + }, + {} +}; + +static struct qmi_elem_info wlfw_soc_info_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_soc_info_s_v01 , + soc_id), + }, + {} +}; + +static struct qmi_elem_info wlfw_fw_version_info_s_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_fw_version_info_s_v01 , + fw_version), + }, + { + .data_type =QMI_STRING , + .elem_len =QMI_WLFW_MAX_TIMESTAMP_LEN_V01 +1 , + .elem_size =sizeof (char ), + .array_type =NO_ARRAY , + .tlv_type =0 , + .offset = offsetof(struct wlfw_fw_version_info_s_v01 , + fw_build_timestamp), + }, + {} +}; + +struct qmi_elem_info wlfw_ind_register_req_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + fw_ready_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + fw_ready_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + initiate_cal_download_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + initiate_cal_download_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + initiate_cal_update_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + initiate_cal_update_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + msa_ready_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + msa_ready_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + pin_connect_result_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + pin_connect_result_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x15 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + client_id_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x15 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + client_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x16 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + request_mem_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x16 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + request_mem_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x17 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + mem_ready_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x17 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + mem_ready_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x18 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + fw_init_done_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x18 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + fw_init_done_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x19 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + rejuvenate_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x19 , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + rejuvenate_enable), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x1A , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + xo_cal_enable_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x1A , + .offset = offsetof(struct wlfw_ind_register_req_msg_v01 , + xo_cal_enable), + }, + {} +}; + +struct qmi_elem_info wlfw_ind_register_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_ind_register_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_ind_register_resp_msg_v01 , + fw_status_valid), + }, + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_ind_register_resp_msg_v01 , + fw_status), + }, + {} +}; + +struct qmi_elem_info wlfw_fw_ready_ind_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_msa_ready_ind_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_pin_connect_result_ind_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_pin_connect_result_ind_msg_v01 , + pwr_pin_result_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_pin_connect_result_ind_msg_v01 , + pwr_pin_result), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_pin_connect_result_ind_msg_v01 , + phy_io_pin_result_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_pin_connect_result_ind_msg_v01 , + phy_io_pin_result), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_pin_connect_result_ind_msg_v01 , + rf_pin_result_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_pin_connect_result_ind_msg_v01 , + rf_pin_result), + }, + {} +}; + +struct qmi_elem_info wlfw_wlan_mode_req_msg_v01_ei[] = { + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_driver_mode_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_wlan_mode_req_msg_v01 , + mode), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_wlan_mode_req_msg_v01 , + hw_debug_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_wlan_mode_req_msg_v01 , + hw_debug), + }, + {} +}; + +struct qmi_elem_info wlfw_wlan_mode_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_wlan_mode_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_wlan_cfg_req_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + host_version_valid), + }, + { + .data_type =QMI_STRING , + .elem_len =QMI_WLFW_MAX_STR_LEN_V01 +1 , + .elem_size =sizeof (char ), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + host_version), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + tgt_cfg_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + tgt_cfg_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_NUM_CE_V01 , + .elem_size =sizeof (struct wlfw_ce_tgt_pipe_cfg_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + tgt_cfg), + .ei_array = wlfw_ce_tgt_pipe_cfg_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + svc_cfg_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + svc_cfg_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_NUM_SVC_V01 , + .elem_size =sizeof (struct wlfw_ce_svc_pipe_cfg_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + svc_cfg), + .ei_array = wlfw_ce_svc_pipe_cfg_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + shadow_reg_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + shadow_reg_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_NUM_SHADOW_REG_V01 , + .elem_size =sizeof (struct wlfw_shadow_reg_cfg_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + shadow_reg), + .ei_array = wlfw_shadow_reg_cfg_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + shadow_reg_v2_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + shadow_reg_v2_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_SHADOW_REG_V2 , + .elem_size =sizeof (struct wlfw_shadow_reg_v2_cfg_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_wlan_cfg_req_msg_v01 , + shadow_reg_v2), + .ei_array = wlfw_shadow_reg_v2_cfg_s_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_wlan_cfg_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_wlan_cfg_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_cap_req_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_cap_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + chip_info_valid), + }, + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct wlfw_rf_chip_info_s_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + chip_info), + .ei_array = wlfw_rf_chip_info_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + board_info_valid), + }, + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct wlfw_rf_board_info_s_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + board_info), + .ei_array = wlfw_rf_board_info_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + soc_info_valid), + }, + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct wlfw_soc_info_s_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + soc_info), + .ei_array = wlfw_soc_info_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + fw_version_info_valid), + }, + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct wlfw_fw_version_info_s_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + fw_version_info), + .ei_array = wlfw_fw_version_info_s_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + fw_build_id_valid), + }, + { + .data_type =QMI_STRING , + .elem_len =QMI_WLFW_MAX_BUILD_ID_LEN_V01 +1 , + .elem_size =sizeof (char ), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + fw_build_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x15 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + num_macs_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x15 , + .offset = offsetof(struct wlfw_cap_resp_msg_v01 , + num_macs), + }, + {} +}; + +struct qmi_elem_info wlfw_bdf_download_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + valid), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + file_id_valid), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + file_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + total_size_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + total_size), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + seg_id_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + seg_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + data_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + data_len), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =QMI_WLFW_MAX_DATA_SIZE_V01 , + .elem_size =sizeof (u8), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + data), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + end_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + end), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x15 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + bdf_type_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x15 , + .offset = offsetof(struct wlfw_bdf_download_req_msg_v01 , + bdf_type), + }, + {} +}; + +struct qmi_elem_info wlfw_bdf_download_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_bdf_download_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_cal_report_req_msg_v01_ei[] = { + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_cal_report_req_msg_v01 , + meta_data_len), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =QMI_WLFW_MAX_NUM_CAL_V01 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_cal_report_req_msg_v01 , + meta_data), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cal_report_req_msg_v01 , + xo_cal_data_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cal_report_req_msg_v01 , + xo_cal_data), + }, + {} +}; + +struct qmi_elem_info wlfw_cal_report_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_cal_report_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_initiate_cal_download_ind_msg_v01_ei[] = { + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_initiate_cal_download_ind_msg_v01 , + cal_id), + }, + {} +}; + +struct qmi_elem_info wlfw_cal_download_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + valid), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + file_id_valid), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + file_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + total_size_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + total_size), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + seg_id_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + seg_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + data_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + data_len), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =QMI_WLFW_MAX_DATA_SIZE_V01 , + .elem_size =sizeof (u8), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + data), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + end_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_cal_download_req_msg_v01 , + end), + }, + {} +}; + +struct qmi_elem_info wlfw_cal_download_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_cal_download_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_initiate_cal_update_ind_msg_v01_ei[] = { + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_initiate_cal_update_ind_msg_v01 , + cal_id), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_initiate_cal_update_ind_msg_v01 , + total_size), + }, + {} +}; + +struct qmi_elem_info wlfw_cal_update_req_msg_v01_ei[] = { + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_cal_update_req_msg_v01 , + cal_id), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_cal_update_req_msg_v01 , + seg_id), + }, + {} +}; + +struct qmi_elem_info wlfw_cal_update_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + file_id_valid), + }, + { + .data_type =QMI_SIGNED_4_BYTE_ENUM , + .elem_len =1 , + .elem_size =sizeof (enum wlfw_cal_temp_id_enum_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + file_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + total_size_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + total_size), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + seg_id_valid), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + seg_id), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + data_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + data_len), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =QMI_WLFW_MAX_DATA_SIZE_V01 , + .elem_size =sizeof (u8), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + data), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + end_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x14 , + .offset = offsetof(struct wlfw_cal_update_resp_msg_v01 , + end), + }, + {} +}; + +struct qmi_elem_info wlfw_msa_info_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_msa_info_req_msg_v01 , + msa_addr), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_msa_info_req_msg_v01 , + size), + }, + {} +}; + +struct qmi_elem_info wlfw_msa_info_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_msa_info_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x03 , + .offset = offsetof(struct wlfw_msa_info_resp_msg_v01 , + mem_region_info_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_MEM_REG_V01 , + .elem_size =sizeof (struct wlfw_memory_region_info_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x03 , + .offset = offsetof(struct wlfw_msa_info_resp_msg_v01 , + mem_region_info), + .ei_array = wlfw_memory_region_info_s_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_msa_ready_req_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_msa_ready_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_msa_ready_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_ini_req_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_ini_req_msg_v01 , + enablefwlog_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_ini_req_msg_v01 , + enablefwlog), + }, + {} +}; + +struct qmi_elem_info wlfw_ini_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_ini_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_athdiag_read_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_athdiag_read_req_msg_v01 , + offset), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_athdiag_read_req_msg_v01 , + mem_type), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x03 , + .offset = offsetof(struct wlfw_athdiag_read_req_msg_v01 , + data_len), + }, + {} +}; + +struct qmi_elem_info wlfw_athdiag_read_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_athdiag_read_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_athdiag_read_resp_msg_v01 , + data_valid), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_athdiag_read_resp_msg_v01 , + data_len), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =QMI_WLFW_MAX_ATHDIAG_DATA_SIZE_V01 , + .elem_size =sizeof (u8), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_athdiag_read_resp_msg_v01 , + data), + }, + {} +}; + +struct qmi_elem_info wlfw_athdiag_write_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_athdiag_write_req_msg_v01 , + offset), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_athdiag_write_req_msg_v01 , + mem_type), + }, + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0x03 , + .offset = offsetof(struct wlfw_athdiag_write_req_msg_v01 , + data_len), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =QMI_WLFW_MAX_ATHDIAG_DATA_SIZE_V01 , + .elem_size =sizeof (u8), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x03 , + .offset = offsetof(struct wlfw_athdiag_write_req_msg_v01 , + data), + }, + {} +}; + +struct qmi_elem_info wlfw_athdiag_write_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_athdiag_write_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_vbatt_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_vbatt_req_msg_v01 , + voltage_uv), + }, + {} +}; + +struct qmi_elem_info wlfw_vbatt_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_vbatt_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_mac_addr_req_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_mac_addr_req_msg_v01 , + mac_addr_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =QMI_WLFW_MAC_ADDR_SIZE_V01 , + .elem_size =sizeof (u8), + .array_type =STATIC_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_mac_addr_req_msg_v01 , + mac_addr), + }, + {} +}; + +struct qmi_elem_info wlfw_mac_addr_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_mac_addr_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_host_cap_req_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_host_cap_req_msg_v01 , + daemon_support_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_host_cap_req_msg_v01 , + daemon_support), + }, + {} +}; + +struct qmi_elem_info wlfw_host_cap_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_host_cap_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_request_mem_ind_msg_v01_ei[] = { + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_request_mem_ind_msg_v01 , + mem_seg_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_NUM_MEM_SEG_V01 , + .elem_size =sizeof (struct wlfw_mem_seg_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_request_mem_ind_msg_v01 , + mem_seg), + .ei_array = wlfw_mem_seg_s_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_respond_mem_req_msg_v01_ei[] = { + { + .data_type =QMI_DATA_LEN , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_respond_mem_req_msg_v01 , + mem_seg_len), + }, + { + .data_type =QMI_STRUCT , + .elem_len =QMI_WLFW_MAX_NUM_MEM_SEG_V01 , + .elem_size =sizeof (struct wlfw_mem_seg_resp_s_v01 ), + .array_type =VAR_LEN_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_respond_mem_req_msg_v01 , + mem_seg), + .ei_array = wlfw_mem_seg_resp_s_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_respond_mem_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_respond_mem_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_mem_ready_ind_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_fw_init_done_ind_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_rejuvenate_ind_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + cause_for_rejuvenation_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + cause_for_rejuvenation), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + requesting_sub_system_valid), + }, + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + requesting_sub_system), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + line_number_valid), + }, + { + .data_type =QMI_UNSIGNED_2_BYTE , + .elem_len =1 , + .elem_size =sizeof (u16), + .array_type =NO_ARRAY , + .tlv_type =0x12 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + line_number), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + function_name_valid), + }, + { + .data_type =QMI_STRING , + .elem_len =QMI_WLFW_FUNCTION_NAME_LEN_V01 +1 , + .elem_size =sizeof (char ), + .array_type =NO_ARRAY , + .tlv_type =0x13 , + .offset = offsetof(struct wlfw_rejuvenate_ind_msg_v01 , + function_name), + }, + {} +}; + +struct qmi_elem_info wlfw_rejuvenate_ack_req_msg_v01_ei[] = { + {} +}; + +struct qmi_elem_info wlfw_rejuvenate_ack_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_rejuvenate_ack_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_dynamic_feature_mask_req_msg_v01_ei[] = { + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_req_msg_v01 , + mask_valid), + }, + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_req_msg_v01 , + mask), + }, + {} +}; + +struct qmi_elem_info wlfw_dynamic_feature_mask_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_resp_msg_v01 , + prev_mask_valid), + }, + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x10 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_resp_msg_v01 , + prev_mask), + }, + { + .data_type =QMI_OPT_FLAG , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_resp_msg_v01 , + curr_mask_valid), + }, + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x11 , + .offset = offsetof(struct wlfw_dynamic_feature_mask_resp_msg_v01 , + curr_mask), + }, + {} +}; + +struct qmi_elem_info wlfw_m3_info_req_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_8_BYTE , + .elem_len =1 , + .elem_size =sizeof (u64), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_m3_info_req_msg_v01 , + addr), + }, + { + .data_type =QMI_UNSIGNED_4_BYTE , + .elem_len =1 , + .elem_size =sizeof (u32), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_m3_info_req_msg_v01 , + size), + }, + {} +}; + +struct qmi_elem_info wlfw_m3_info_resp_msg_v01_ei[] = { + { + .data_type =QMI_STRUCT , + .elem_len =1 , + .elem_size =sizeof (struct qmi_response_type_v01 ), + .array_type =NO_ARRAY , + .tlv_type =0x02 , + .offset = offsetof(struct wlfw_m3_info_resp_msg_v01 , + resp), + .ei_array = qmi_response_type_v01_ei, + }, + {} +}; + +struct qmi_elem_info wlfw_xo_cal_ind_msg_v01_ei[] = { + { + .data_type =QMI_UNSIGNED_1_BYTE , + .elem_len =1 , + .elem_size =sizeof (u8), + .array_type =NO_ARRAY , + .tlv_type =0x01 , + .offset = offsetof(struct wlfw_xo_cal_ind_msg_v01 , + xo_cal_data), + }, + {} +};
drivers/net/wireless/ath/ath10k/qmi_wlfw_v01.h new file +677 -0
677 lines not on this page · raw message
Signature · 1 line
2.17.0
PATCH v4 2/6 ath10k: Add support to create boardname for non-bmi target
In reply to Govind SinghFrom: Rakesh Pillai <[email protected]>
Add support to create the boardname for non-bmi targets like WCN3990, which uses qmi for bdf download. This boardname is used to parse the board data from board-2.bin.
--- drivers/net/wireless/ath/ath10k/core.c | 8 ++++++++ drivers/net/wireless/ath/ath10k/core.h | 2 ++ 2 files changed, 10 insertions(+)
drivers/net/wireless/ath/ath10k/core.c +8 -0
@@ -1440,6 +1440,14 @@ static int ath10k_core_create_board_name(struct ath10k *ar, char *name, goto out; } +if (ar->id.qmi_ids_valid) { +scnprintf (name, name_len, +"bus=%s,qmi-board-id=%x" , +ath10k_bus_str (ar->hif.bus), + ar->id.qmi_board_id); + goto out; + } + scnprintf(name, name_len, "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x%s", ath10k_bus_str(ar->hif.bus),
drivers/net/wireless/ath/ath10k/core.h +2 -0
@@ -941,6 +941,8 @@ struct ath10k {u32 subsystem_device;bool bmi_ids_valid; +bool qmi_ids_valid; +u32 qmi_board_id;u8 bmi_board_id;u8 bmi_chip_id;
Signature · 1 line
2.17.0
PATCH v4 3/6 dt: bindings: add bindings for msa memory region
In reply to Govind SinghAdd device tree binding documentation details of msa memory region for ath10k qmi client for SDM845/APQ8098 SoC into "qcom,ath10k.txt".
--- .../devicetree/bindings/net/wireless/qcom,ath10k.txt | 6 ++++++ 1 file changed, 6 insertions(+)
Documentation/devicetree/bindings/net/wireless/qcom,ath10k.txt +6 -0
@@ -56,6 +56,11 @@ Optional properties: the length can vary between hw versions. - <supply-name>-supply: handle to the regulator device tree node optional "supply-name" is "vdd-0.8-cx-mx". +- memory-region: + Usage: optional + Value type: <phandle> + Definition: reference to the reserved-memory for the msa region + used by the wifi firmware running in Q6. Example (to supply the calibration data alone):
@@ -149,4 +154,5 @@ wifi@18000000 { <0 140 0 /* CE10 */ >, <0 141 0 /* CE11 */ >; vdd-0.8-cx-mx-supply = <&pm8998_l5>; + memory-region = <&wifi_msa_mem>; };
Signature · 1 line
2.17.0
Re: [PATCH v4 3/6] dt: bindings: add bindings for msa memory region
Quoted 8 lines · Govind Singh
Add device tree binding documentation details of msa memory region for ath10k qmi client for SDM845/APQ8098 SoC into "qcom,ath10k.txt".
Signed-off-by Govind Singh <[email protected]>--- .../devicetree/bindings/net/wireless/qcom,ath10k.txt | 6 ++++++ 1 file changed, 6 insertions(+)
PATCH v4 4/6 firmware: qcom: scm: Add WLAN VMID for Qualcomm SCM interface
In reply to Govind SinghAdd WLAN related VMID's to support wlan driver to set up the remote's permissions call via TrustZone.
--- include/linux/qcom_scm.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
include/linux/qcom_scm.h +3 -1
@@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2015, 2018, The Linux Foundation. All rights reserved. * Copyright (C) 2015 Linaro Ltd. * * This program is free software; you can redistribute it and/or modify
@@ -33,6 +33,8 @@ struct qcom_scm_vmperm {#define QCOM_SCM_VMID_HLOS 0x3#define QCOM_SCM_VMID_MSS_MSA 0xF +#define QCOM_SCM_VMID_WLAN 0x18 +#define QCOM_SCM_VMID_WLAN_CE 0x19#define QCOM_SCM_PERM_READ 0x4#define QCOM_SCM_PERM_WRITE 0x2#define QCOM_SCM_PERM_EXEC 0x1
Signature · 1 line
2.17.0
PATCH v4 5/6 ath10k: Add debug mask for QMI layer
In reply to Govind SinghAdd debug mask to control debug info of ath10k qmi messaging layer.
--- drivers/net/wireless/ath/ath10k/debug.h | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/ath/ath10k/debug.h +1 -0
@@ -44,6 +44,7 @@ enum ath10k_debug_mask {ATH10K_DBG_USB =0x00040000 ,ATH10K_DBG_USB_BULK =0x00080000 ,ATH10K_DBG_SNOC =0x00100000 , +ATH10K_DBG_QMI =0x00200000 , ATH10K_DBG_ANY = 0xffffffff, };
Signature · 1 line
2.17.0
PATCH v4 6/6 ath10k: Add QMI message handshake for wcn3990 client
In reply to Govind SinghAdd WCN3990 QMI client handshakes for Q6 integrated WLAN connectivity subsystem. This layer is responsible for communicating qmi control messages to wifi fw QMI service using QMI messaging protocol.
Qualcomm MSM Interface(QMI) is a messaging format used to communicate between components running between remote processors with underlying transport layer based on integrated chipset(shared memory) or discrete chipset(PCI/USB/SDIO/UART).
--- drivers/net/wireless/ath/ath10k/Kconfig | 1 + drivers/net/wireless/ath/ath10k/Makefile | 4 +- drivers/net/wireless/ath/ath10k/core.c | 6 +- drivers/net/wireless/ath/ath10k/core.h | 2 + drivers/net/wireless/ath/ath10k/qmi.c | 1019 ++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/qmi.h | 129 +++ drivers/net/wireless/ath/ath10k/snoc.c | 262 +++++- drivers/net/wireless/ath/ath10k/snoc.h | 4 + 8 files changed, 1417 insertions(+), 10 deletions(-) create mode 100644 drivers/net/wireless/ath/ath10k/qmi.c create mode 100644 drivers/net/wireless/ath/ath10k/qmi.h
drivers/net/wireless/ath/ath10k/Kconfig +1 -0
@@ -43,6 +43,7 @@ config ATH10K_USB config ATH10K_SNOC tristate "Qualcomm ath10k SNOC support (EXPERIMENTAL)" depends on ATH10K && ARCH_QCOM + select QCOM_QMI_HELPERS ---help--- This module adds support for integrated WCN3990 chip connected to system NOC(SNOC). Currently work in progress and will not
drivers/net/wireless/ath/ath10k/Makefile +3 -1
@@ -36,7 +36,9 @@ obj-$(CONFIG_ATH10K_USB) += ath10k_usb.o ath10k_usb-y += usb.o obj-$(CONFIG_ATH10K_SNOC) += ath10k_snoc.o -ath10k_snoc-y += snoc.o +ath10k_snoc-y += qmi.o \ + qmi_wlfw_v01.o \ + snoc.o # for tracing framework to find trace.h CFLAGS_trace.o := -I$(src)
drivers/net/wireless/ath/ath10k/core.c +4 -2
@@ -1145,7 +1145,7 @@ static int ath10k_download_fw(struct ath10k *ar)return ret; } -static void ath10k_core_free_board_files (struct ath10k *ar) +void ath10k_core_free_board_files (struct ath10k *ar) {if (!IS_ERR (ar->normal_mode_fw.board))release_firmware (ar->normal_mode_fw.board);
@@ -1154,6 +1154,7 @@ static void ath10k_core_free_board_files(struct ath10k *ar) ar->normal_mode_fw.board_data =NULL ; ar->normal_mode_fw.board_len =0 ; } +EXPORT_SYMBOL (ath10k_core_free_board_files);static void ath10k_core_free_firmware_files (struct ath10k *ar) {
@@ -1459,7 +1460,7 @@ static int ath10k_core_create_board_name(struct ath10k *ar, char *name,return 0 ; } -static int ath10k_core_fetch_board_file (struct ath10k *ar) +int ath10k_core_fetch_board_file (struct ath10k *ar) {char boardname[100 ], fallback_boardname[100 ];int ret;
@@ -1497,6 +1498,7 @@ static int ath10k_core_fetch_board_file(struct ath10k *ar)ath10k_dbg (ar,ATH10K_DBG_BOOT ,"using board api %d\n" , ar->bd_api);return 0 ; } +EXPORT_SYMBOL (ath10k_core_fetch_board_file);int ath10k_core_fetch_firmware_api_n (struct ath10k *ar,const char *name,struct ath10k_fw_file *fw_file)
drivers/net/wireless/ath/ath10k/core.h +2 -0
@@ -1166,5 +1166,7 @@ int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);void ath10k_core_stop (struct ath10k *ar);int ath10k_core_register (struct ath10k *ar,u32 chip_id);void ath10k_core_unregister (struct ath10k *ar); +int ath10k_core_fetch_board_file (struct ath10k *ar); +void ath10k_core_free_board_files (struct ath10k *ar);#endif /* _CORE_H_ */
drivers/net/wireless/ath/ath10k/qmi.c new file +1019 -0
1,019 lines not on this page · raw message
drivers/net/wireless/ath/ath10k/qmi.h new file +129 -0
129 lines not on this page · raw message
drivers/net/wireless/ath/ath10k/snoc.c +255 -7
321 lines not on this page · raw message
drivers/net/wireless/ath/ath10k/snoc.h +4 -0
@@ -19,10 +19,12 @@#include "hw.h" #include "ce.h" +#include "qmi.h" struct ath10k_snoc_drv_priv {enum ath10k_hw_rev hw_rev;u64 dma_mask; +u32 msa_size; };struct snoc_state {
@@ -81,6 +83,7 @@ struct ath10k_snoc {struct timer_list rx_post_retry;struct ath10k_wcn3990_vreg_info *vreg;struct ath10k_wcn3990_clk_info *clk; +struct ath10k_qmi *qmi; };static inline struct ath10k_snoc *ath10k_snoc_priv (struct ath10k *ar)
@@ -90,5 +93,6 @@ static inline struct ath10k_snoc *ath10k_snoc_priv(struct ath10k *ar)void ath10k_snoc_write32 (struct ath10k *ar,u32 offset,u32 value);u32 ath10k_snoc_read32 (struct ath10k *ar,u32 offset); +int ath10k_snoc_fw_indication (struct ath10k *ar,u64 type);#endif /* _SNOC_H_ */
Signature · 1 line
2.17.0
Re: [PATCH v4 6/6] ath10k: Add QMI message handshake for wcn3990 client
Hi Govind,
Quoted 30 lines · Govind Singh
Add WCN3990 QMI client handshakes for Q6 integrated WLAN connectivity subsystem. This layer is responsible for communicating qmi control messages to wifi fw QMI service using QMI messaging protocol.
Qualcomm MSM Interface(QMI) is a messaging format used to communicate between components running between remote processors with underlying transport layer based on integrated chipset(shared memory) or discrete chipset(PCI/USB/SDIO/UART).
Signed-off-by Govind Singh <[email protected]>--- drivers/net/wireless/ath/ath10k/Kconfig | 1 + drivers/net/wireless/ath/ath10k/Makefile | 4 +- drivers/net/wireless/ath/ath10k/core.c | 6 +- drivers/net/wireless/ath/ath10k/core.h | 2 + drivers/net/wireless/ath/ath10k/qmi.c | 1019 ++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/qmi.h | 129 +++ drivers/net/wireless/ath/ath10k/snoc.c | 262 +++++- drivers/net/wireless/ath/ath10k/snoc.h | 4 + 8 files changed, 1417 insertions(+), 10 deletions(-) create mode 100644 drivers/net/wireless/ath/ath10k/qmi.c create mode 100644 drivers/net/wireless/ath/ath10k/qmi.hdrivers/net/wireless/ath/ath10k/qmi.c new file +0
-0@@ -0,0 +1,1019 @@
...
drivers/net/wireless/ath/ath10k/qmi.c line 1014
Quoted 7 lines
drivers/net/wireless/ath/ath10k/qmi.c new file +7
-0+int ath10k_qmi_deinit (struct ath10k *ar) +{ +struct ath10k_snoc *ar_snoc =ath10k_snoc_priv (ar); +struct ath10k_qmi *qmi = ar_snoc->qmi; + +cancel_work_sync (&qmi->event_work); +destroy_workqueue (qmi->event_wq);
I believe this is incorrect ordering. You should not be destroying the work queue that handles QMI event responses before you release the QMI handle. As it stands, this means you segfault during 'rmmod'.
drivers/net/wireless/ath/ath10k/qmi.c
Quoted 1 line
drivers/net/wireless/ath/ath10k/qmi.c new file +1
-0+qmi_handle_release (&qmi->qmi_hdl);
I think this should be:
qmi_handle_release(&qmi->qmi_hdl); cancel_work_sync(&qmi->event_work); destroy_workqueue(qmi->event_wq);
drivers/net/wireless/ath/ath10k/qmi.c line 1016
Quoted 1 line
drivers/net/wireless/ath/ath10k/qmi.c new file +1
-0+ qmi =NULL ;
This assignment is pointless, as 'qmi' is a local variable. Maybe you meant to clear the struct member, as a precaution? So this would be:
ar_snoc->qmi = NULL;
Brian
Quoted 3 lines
drivers/net/wireless/ath/ath10k/qmi.c new file +3
-0+ +return 0 ; +}
Re: [PATCH v4 6/6] ath10k: Add QMI message handshake for wcn3990 client
Thanks Brian for the review.
Quoted 37 lines · Brian Norris
Hi Govind,
Quoted 31 lines · Govind Singh
Add WCN3990 QMI client handshakes for Q6 integrated WLAN connectivity subsystem. This layer is responsible for communicating qmi control messages to wifi fw QMI service using QMI messaging protocol.
Qualcomm MSM Interface(QMI) is a messaging format used to communicate between components running between remote processors with underlying transport layer based on integrated chipset(shared memory) or discrete chipset(PCI/USB/SDIO/UART).
Signed-off-by Govind Singh <[email protected]>--- drivers/net/wireless/ath/ath10k/Kconfig | 1 + drivers/net/wireless/ath/ath10k/Makefile | 4 +- drivers/net/wireless/ath/ath10k/core.c | 6 +- drivers/net/wireless/ath/ath10k/core.h | 2 + drivers/net/wireless/ath/ath10k/qmi.c | 1019 ++++++++++++++++++++++ drivers/net/wireless/ath/ath10k/qmi.h | 129 +++ drivers/net/wireless/ath/ath10k/snoc.c | 262 +++++- drivers/net/wireless/ath/ath10k/snoc.h | 4 + 8 files changed, 1417 insertions(+), 10 deletions(-) create mode 100644 drivers/net/wireless/ath/ath10k/qmi.c create mode 100644 drivers/net/wireless/ath/ath10k/qmi.hdrivers/net/wireless/ath/ath10k/qmi.c new file +0
-0@@ -0,0 +1,1019 @@...
Quoted 12 lines
drivers/net/wireless/ath/ath10k/qmi.c line 1014
Quoted 7 lines
drivers/net/wireless/ath/ath10k/qmi.c new file +7
-0+int ath10k_qmi_deinit (struct ath10k *ar) +{ +struct ath10k_snoc *ar_snoc =ath10k_snoc_priv (ar); +struct ath10k_qmi *qmi = ar_snoc->qmi; + +cancel_work_sync (&qmi->event_work); +destroy_workqueue (qmi->event_wq);I believe this is incorrect ordering. You should not be destroying the work queue that handles QMI event responses before you release the QMI handle. As it stands, this means you segfault during 'rmmod'.
Yes, correct. I will correct this in v5 as this is still not merged in ath10k-next.
Quoted 8 lines
drivers/net/wireless/ath/ath10k/qmi.c
Quoted 1 line
drivers/net/wireless/ath/ath10k/qmi.c new file +1
-0+qmi_handle_release (&qmi->qmi_hdl);I think this should be:
qmi_handle_release(&qmi->qmi_hdl); cancel_work_sync(&qmi->event_work); destroy_workqueue(qmi->event_wq);
Quoted 7 lines
drivers/net/wireless/ath/ath10k/qmi.c line 1016
Quoted 1 line
drivers/net/wireless/ath/ath10k/qmi.c new file +1
-0+ qmi =NULL ;This assignment is pointless, as 'qmi' is a local variable. Maybe you meant to clear the struct member, as a precaution? So this would be:
ar_snoc->qmi = NULL;
Yes, i will correct this in v5.
Quoted 5 lines
Brian
drivers/net/wireless/ath/ath10k/qmi.c line 110
Quoted 3 lines
drivers/net/wireless/ath/ath10k/qmi.c new file +3
-0+ +return 0 ; +}
Thanks,
Govind
Quoted 10 lines · Govind Singh
Add QMI client handshakes for Q6 integrated WLAN connectivity subsystem. This module is responsible for communicating WLAN control messages to FW over QMI interface. This patch series enables the qmi handshakes required for WCN3990 chipset.
QUALCOMM MSM Interface(QMI) provides the control interface between components running b/w remote processors with underlying transport layer based on integrated chipset(shared memory) or discrete chipset(PCI/USB/SDIO/UART).
QMI client driver implementation is based on qmi framework https://lwn.net/Articles/729924/.
For whole series: