162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause-Clear 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 462306a36Sopenharmony_ci * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/elf.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "qmi.h" 1062306a36Sopenharmony_ci#include "core.h" 1162306a36Sopenharmony_ci#include "debug.h" 1262306a36Sopenharmony_ci#include <linux/of.h> 1362306a36Sopenharmony_ci#include <linux/firmware.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02 1662306a36Sopenharmony_ci#define HOST_CSTATE_BIT 0x04 1762306a36Sopenharmony_ci#define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x08 1862306a36Sopenharmony_ci#define ATH12K_QMI_MAX_CHUNK_SIZE 2097152 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic struct qmi_elem_info wlfw_host_mlo_chip_info_s_v01_ei[] = { 2162306a36Sopenharmony_ci { 2262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 2362306a36Sopenharmony_ci .elem_len = 1, 2462306a36Sopenharmony_ci .elem_size = sizeof(u8), 2562306a36Sopenharmony_ci .array_type = NO_ARRAY, 2662306a36Sopenharmony_ci .tlv_type = 0, 2762306a36Sopenharmony_ci .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 2862306a36Sopenharmony_ci chip_id), 2962306a36Sopenharmony_ci }, 3062306a36Sopenharmony_ci { 3162306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 3262306a36Sopenharmony_ci .elem_len = 1, 3362306a36Sopenharmony_ci .elem_size = sizeof(u8), 3462306a36Sopenharmony_ci .array_type = NO_ARRAY, 3562306a36Sopenharmony_ci .tlv_type = 0, 3662306a36Sopenharmony_ci .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 3762306a36Sopenharmony_ci num_local_links), 3862306a36Sopenharmony_ci }, 3962306a36Sopenharmony_ci { 4062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 4162306a36Sopenharmony_ci .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01, 4262306a36Sopenharmony_ci .elem_size = sizeof(u8), 4362306a36Sopenharmony_ci .array_type = STATIC_ARRAY, 4462306a36Sopenharmony_ci .tlv_type = 0, 4562306a36Sopenharmony_ci .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 4662306a36Sopenharmony_ci hw_link_id), 4762306a36Sopenharmony_ci }, 4862306a36Sopenharmony_ci { 4962306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 5062306a36Sopenharmony_ci .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01, 5162306a36Sopenharmony_ci .elem_size = sizeof(u8), 5262306a36Sopenharmony_ci .array_type = STATIC_ARRAY, 5362306a36Sopenharmony_ci .tlv_type = 0, 5462306a36Sopenharmony_ci .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 5562306a36Sopenharmony_ci valid_mlo_link_id), 5662306a36Sopenharmony_ci }, 5762306a36Sopenharmony_ci { 5862306a36Sopenharmony_ci .data_type = QMI_EOTI, 5962306a36Sopenharmony_ci .array_type = NO_ARRAY, 6062306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 6162306a36Sopenharmony_ci }, 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { 6562306a36Sopenharmony_ci { 6662306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 6762306a36Sopenharmony_ci .elem_len = 1, 6862306a36Sopenharmony_ci .elem_size = sizeof(u8), 6962306a36Sopenharmony_ci .array_type = NO_ARRAY, 7062306a36Sopenharmony_ci .tlv_type = 0x10, 7162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 7262306a36Sopenharmony_ci num_clients_valid), 7362306a36Sopenharmony_ci }, 7462306a36Sopenharmony_ci { 7562306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 7662306a36Sopenharmony_ci .elem_len = 1, 7762306a36Sopenharmony_ci .elem_size = sizeof(u32), 7862306a36Sopenharmony_ci .array_type = NO_ARRAY, 7962306a36Sopenharmony_ci .tlv_type = 0x10, 8062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 8162306a36Sopenharmony_ci num_clients), 8262306a36Sopenharmony_ci }, 8362306a36Sopenharmony_ci { 8462306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 8562306a36Sopenharmony_ci .elem_len = 1, 8662306a36Sopenharmony_ci .elem_size = sizeof(u8), 8762306a36Sopenharmony_ci .array_type = NO_ARRAY, 8862306a36Sopenharmony_ci .tlv_type = 0x11, 8962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 9062306a36Sopenharmony_ci wake_msi_valid), 9162306a36Sopenharmony_ci }, 9262306a36Sopenharmony_ci { 9362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 9462306a36Sopenharmony_ci .elem_len = 1, 9562306a36Sopenharmony_ci .elem_size = sizeof(u32), 9662306a36Sopenharmony_ci .array_type = NO_ARRAY, 9762306a36Sopenharmony_ci .tlv_type = 0x11, 9862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 9962306a36Sopenharmony_ci wake_msi), 10062306a36Sopenharmony_ci }, 10162306a36Sopenharmony_ci { 10262306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 10362306a36Sopenharmony_ci .elem_len = 1, 10462306a36Sopenharmony_ci .elem_size = sizeof(u8), 10562306a36Sopenharmony_ci .array_type = NO_ARRAY, 10662306a36Sopenharmony_ci .tlv_type = 0x12, 10762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 10862306a36Sopenharmony_ci gpios_valid), 10962306a36Sopenharmony_ci }, 11062306a36Sopenharmony_ci { 11162306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 11262306a36Sopenharmony_ci .elem_len = 1, 11362306a36Sopenharmony_ci .elem_size = sizeof(u8), 11462306a36Sopenharmony_ci .array_type = NO_ARRAY, 11562306a36Sopenharmony_ci .tlv_type = 0x12, 11662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 11762306a36Sopenharmony_ci gpios_len), 11862306a36Sopenharmony_ci }, 11962306a36Sopenharmony_ci { 12062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 12162306a36Sopenharmony_ci .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01, 12262306a36Sopenharmony_ci .elem_size = sizeof(u32), 12362306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 12462306a36Sopenharmony_ci .tlv_type = 0x12, 12562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 12662306a36Sopenharmony_ci gpios), 12762306a36Sopenharmony_ci }, 12862306a36Sopenharmony_ci { 12962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 13062306a36Sopenharmony_ci .elem_len = 1, 13162306a36Sopenharmony_ci .elem_size = sizeof(u8), 13262306a36Sopenharmony_ci .array_type = NO_ARRAY, 13362306a36Sopenharmony_ci .tlv_type = 0x13, 13462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 13562306a36Sopenharmony_ci nm_modem_valid), 13662306a36Sopenharmony_ci }, 13762306a36Sopenharmony_ci { 13862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 13962306a36Sopenharmony_ci .elem_len = 1, 14062306a36Sopenharmony_ci .elem_size = sizeof(u8), 14162306a36Sopenharmony_ci .array_type = NO_ARRAY, 14262306a36Sopenharmony_ci .tlv_type = 0x13, 14362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 14462306a36Sopenharmony_ci nm_modem), 14562306a36Sopenharmony_ci }, 14662306a36Sopenharmony_ci { 14762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 14862306a36Sopenharmony_ci .elem_len = 1, 14962306a36Sopenharmony_ci .elem_size = sizeof(u8), 15062306a36Sopenharmony_ci .array_type = NO_ARRAY, 15162306a36Sopenharmony_ci .tlv_type = 0x14, 15262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 15362306a36Sopenharmony_ci bdf_support_valid), 15462306a36Sopenharmony_ci }, 15562306a36Sopenharmony_ci { 15662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 15762306a36Sopenharmony_ci .elem_len = 1, 15862306a36Sopenharmony_ci .elem_size = sizeof(u8), 15962306a36Sopenharmony_ci .array_type = NO_ARRAY, 16062306a36Sopenharmony_ci .tlv_type = 0x14, 16162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 16262306a36Sopenharmony_ci bdf_support), 16362306a36Sopenharmony_ci }, 16462306a36Sopenharmony_ci { 16562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 16662306a36Sopenharmony_ci .elem_len = 1, 16762306a36Sopenharmony_ci .elem_size = sizeof(u8), 16862306a36Sopenharmony_ci .array_type = NO_ARRAY, 16962306a36Sopenharmony_ci .tlv_type = 0x15, 17062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 17162306a36Sopenharmony_ci bdf_cache_support_valid), 17262306a36Sopenharmony_ci }, 17362306a36Sopenharmony_ci { 17462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 17562306a36Sopenharmony_ci .elem_len = 1, 17662306a36Sopenharmony_ci .elem_size = sizeof(u8), 17762306a36Sopenharmony_ci .array_type = NO_ARRAY, 17862306a36Sopenharmony_ci .tlv_type = 0x15, 17962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 18062306a36Sopenharmony_ci bdf_cache_support), 18162306a36Sopenharmony_ci }, 18262306a36Sopenharmony_ci { 18362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 18462306a36Sopenharmony_ci .elem_len = 1, 18562306a36Sopenharmony_ci .elem_size = sizeof(u8), 18662306a36Sopenharmony_ci .array_type = NO_ARRAY, 18762306a36Sopenharmony_ci .tlv_type = 0x16, 18862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 18962306a36Sopenharmony_ci m3_support_valid), 19062306a36Sopenharmony_ci }, 19162306a36Sopenharmony_ci { 19262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 19362306a36Sopenharmony_ci .elem_len = 1, 19462306a36Sopenharmony_ci .elem_size = sizeof(u8), 19562306a36Sopenharmony_ci .array_type = NO_ARRAY, 19662306a36Sopenharmony_ci .tlv_type = 0x16, 19762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 19862306a36Sopenharmony_ci m3_support), 19962306a36Sopenharmony_ci }, 20062306a36Sopenharmony_ci { 20162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 20262306a36Sopenharmony_ci .elem_len = 1, 20362306a36Sopenharmony_ci .elem_size = sizeof(u8), 20462306a36Sopenharmony_ci .array_type = NO_ARRAY, 20562306a36Sopenharmony_ci .tlv_type = 0x17, 20662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 20762306a36Sopenharmony_ci m3_cache_support_valid), 20862306a36Sopenharmony_ci }, 20962306a36Sopenharmony_ci { 21062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 21162306a36Sopenharmony_ci .elem_len = 1, 21262306a36Sopenharmony_ci .elem_size = sizeof(u8), 21362306a36Sopenharmony_ci .array_type = NO_ARRAY, 21462306a36Sopenharmony_ci .tlv_type = 0x17, 21562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 21662306a36Sopenharmony_ci m3_cache_support), 21762306a36Sopenharmony_ci }, 21862306a36Sopenharmony_ci { 21962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 22062306a36Sopenharmony_ci .elem_len = 1, 22162306a36Sopenharmony_ci .elem_size = sizeof(u8), 22262306a36Sopenharmony_ci .array_type = NO_ARRAY, 22362306a36Sopenharmony_ci .tlv_type = 0x18, 22462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 22562306a36Sopenharmony_ci cal_filesys_support_valid), 22662306a36Sopenharmony_ci }, 22762306a36Sopenharmony_ci { 22862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 22962306a36Sopenharmony_ci .elem_len = 1, 23062306a36Sopenharmony_ci .elem_size = sizeof(u8), 23162306a36Sopenharmony_ci .array_type = NO_ARRAY, 23262306a36Sopenharmony_ci .tlv_type = 0x18, 23362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 23462306a36Sopenharmony_ci cal_filesys_support), 23562306a36Sopenharmony_ci }, 23662306a36Sopenharmony_ci { 23762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 23862306a36Sopenharmony_ci .elem_len = 1, 23962306a36Sopenharmony_ci .elem_size = sizeof(u8), 24062306a36Sopenharmony_ci .array_type = NO_ARRAY, 24162306a36Sopenharmony_ci .tlv_type = 0x19, 24262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 24362306a36Sopenharmony_ci cal_cache_support_valid), 24462306a36Sopenharmony_ci }, 24562306a36Sopenharmony_ci { 24662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 24762306a36Sopenharmony_ci .elem_len = 1, 24862306a36Sopenharmony_ci .elem_size = sizeof(u8), 24962306a36Sopenharmony_ci .array_type = NO_ARRAY, 25062306a36Sopenharmony_ci .tlv_type = 0x19, 25162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 25262306a36Sopenharmony_ci cal_cache_support), 25362306a36Sopenharmony_ci }, 25462306a36Sopenharmony_ci { 25562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 25662306a36Sopenharmony_ci .elem_len = 1, 25762306a36Sopenharmony_ci .elem_size = sizeof(u8), 25862306a36Sopenharmony_ci .array_type = NO_ARRAY, 25962306a36Sopenharmony_ci .tlv_type = 0x1A, 26062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 26162306a36Sopenharmony_ci cal_done_valid), 26262306a36Sopenharmony_ci }, 26362306a36Sopenharmony_ci { 26462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 26562306a36Sopenharmony_ci .elem_len = 1, 26662306a36Sopenharmony_ci .elem_size = sizeof(u8), 26762306a36Sopenharmony_ci .array_type = NO_ARRAY, 26862306a36Sopenharmony_ci .tlv_type = 0x1A, 26962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 27062306a36Sopenharmony_ci cal_done), 27162306a36Sopenharmony_ci }, 27262306a36Sopenharmony_ci { 27362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 27462306a36Sopenharmony_ci .elem_len = 1, 27562306a36Sopenharmony_ci .elem_size = sizeof(u8), 27662306a36Sopenharmony_ci .array_type = NO_ARRAY, 27762306a36Sopenharmony_ci .tlv_type = 0x1B, 27862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 27962306a36Sopenharmony_ci mem_bucket_valid), 28062306a36Sopenharmony_ci }, 28162306a36Sopenharmony_ci { 28262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 28362306a36Sopenharmony_ci .elem_len = 1, 28462306a36Sopenharmony_ci .elem_size = sizeof(u32), 28562306a36Sopenharmony_ci .array_type = NO_ARRAY, 28662306a36Sopenharmony_ci .tlv_type = 0x1B, 28762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 28862306a36Sopenharmony_ci mem_bucket), 28962306a36Sopenharmony_ci }, 29062306a36Sopenharmony_ci { 29162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 29262306a36Sopenharmony_ci .elem_len = 1, 29362306a36Sopenharmony_ci .elem_size = sizeof(u8), 29462306a36Sopenharmony_ci .array_type = NO_ARRAY, 29562306a36Sopenharmony_ci .tlv_type = 0x1C, 29662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 29762306a36Sopenharmony_ci mem_cfg_mode_valid), 29862306a36Sopenharmony_ci }, 29962306a36Sopenharmony_ci { 30062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 30162306a36Sopenharmony_ci .elem_len = 1, 30262306a36Sopenharmony_ci .elem_size = sizeof(u8), 30362306a36Sopenharmony_ci .array_type = NO_ARRAY, 30462306a36Sopenharmony_ci .tlv_type = 0x1C, 30562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 30662306a36Sopenharmony_ci mem_cfg_mode), 30762306a36Sopenharmony_ci }, 30862306a36Sopenharmony_ci { 30962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 31062306a36Sopenharmony_ci .elem_len = 1, 31162306a36Sopenharmony_ci .elem_size = sizeof(u8), 31262306a36Sopenharmony_ci .array_type = NO_ARRAY, 31362306a36Sopenharmony_ci .tlv_type = 0x1D, 31462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 31562306a36Sopenharmony_ci cal_duration_valid), 31662306a36Sopenharmony_ci }, 31762306a36Sopenharmony_ci { 31862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_2_BYTE, 31962306a36Sopenharmony_ci .elem_len = 1, 32062306a36Sopenharmony_ci .elem_size = sizeof(u16), 32162306a36Sopenharmony_ci .array_type = NO_ARRAY, 32262306a36Sopenharmony_ci .tlv_type = 0x1D, 32362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 32462306a36Sopenharmony_ci cal_duraiton), 32562306a36Sopenharmony_ci }, 32662306a36Sopenharmony_ci { 32762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 32862306a36Sopenharmony_ci .elem_len = 1, 32962306a36Sopenharmony_ci .elem_size = sizeof(u8), 33062306a36Sopenharmony_ci .array_type = NO_ARRAY, 33162306a36Sopenharmony_ci .tlv_type = 0x1E, 33262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 33362306a36Sopenharmony_ci platform_name_valid), 33462306a36Sopenharmony_ci }, 33562306a36Sopenharmony_ci { 33662306a36Sopenharmony_ci .data_type = QMI_STRING, 33762306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_PLATFORM_NAME_LEN_V01 + 1, 33862306a36Sopenharmony_ci .elem_size = sizeof(char), 33962306a36Sopenharmony_ci .array_type = NO_ARRAY, 34062306a36Sopenharmony_ci .tlv_type = 0x1E, 34162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 34262306a36Sopenharmony_ci platform_name), 34362306a36Sopenharmony_ci }, 34462306a36Sopenharmony_ci { 34562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 34662306a36Sopenharmony_ci .elem_len = 1, 34762306a36Sopenharmony_ci .elem_size = sizeof(u8), 34862306a36Sopenharmony_ci .array_type = NO_ARRAY, 34962306a36Sopenharmony_ci .tlv_type = 0x1F, 35062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 35162306a36Sopenharmony_ci ddr_range_valid), 35262306a36Sopenharmony_ci }, 35362306a36Sopenharmony_ci { 35462306a36Sopenharmony_ci .data_type = QMI_STRUCT, 35562306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_HOST_DDR_RANGE_SIZE_V01, 35662306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_host_ddr_range), 35762306a36Sopenharmony_ci .array_type = STATIC_ARRAY, 35862306a36Sopenharmony_ci .tlv_type = 0x1F, 35962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 36062306a36Sopenharmony_ci ddr_range), 36162306a36Sopenharmony_ci }, 36262306a36Sopenharmony_ci { 36362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 36462306a36Sopenharmony_ci .elem_len = 1, 36562306a36Sopenharmony_ci .elem_size = sizeof(u8), 36662306a36Sopenharmony_ci .array_type = NO_ARRAY, 36762306a36Sopenharmony_ci .tlv_type = 0x20, 36862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 36962306a36Sopenharmony_ci host_build_type_valid), 37062306a36Sopenharmony_ci }, 37162306a36Sopenharmony_ci { 37262306a36Sopenharmony_ci .data_type = QMI_SIGNED_4_BYTE_ENUM, 37362306a36Sopenharmony_ci .elem_len = 1, 37462306a36Sopenharmony_ci .elem_size = sizeof(enum qmi_wlanfw_host_build_type), 37562306a36Sopenharmony_ci .array_type = NO_ARRAY, 37662306a36Sopenharmony_ci .tlv_type = 0x20, 37762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 37862306a36Sopenharmony_ci host_build_type), 37962306a36Sopenharmony_ci }, 38062306a36Sopenharmony_ci { 38162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 38262306a36Sopenharmony_ci .elem_len = 1, 38362306a36Sopenharmony_ci .elem_size = sizeof(u8), 38462306a36Sopenharmony_ci .array_type = NO_ARRAY, 38562306a36Sopenharmony_ci .tlv_type = 0x21, 38662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 38762306a36Sopenharmony_ci mlo_capable_valid), 38862306a36Sopenharmony_ci }, 38962306a36Sopenharmony_ci { 39062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 39162306a36Sopenharmony_ci .elem_len = 1, 39262306a36Sopenharmony_ci .elem_size = sizeof(u8), 39362306a36Sopenharmony_ci .array_type = NO_ARRAY, 39462306a36Sopenharmony_ci .tlv_type = 0x21, 39562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 39662306a36Sopenharmony_ci mlo_capable), 39762306a36Sopenharmony_ci }, 39862306a36Sopenharmony_ci { 39962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 40062306a36Sopenharmony_ci .elem_len = 1, 40162306a36Sopenharmony_ci .elem_size = sizeof(u8), 40262306a36Sopenharmony_ci .array_type = NO_ARRAY, 40362306a36Sopenharmony_ci .tlv_type = 0x22, 40462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 40562306a36Sopenharmony_ci mlo_chip_id_valid), 40662306a36Sopenharmony_ci }, 40762306a36Sopenharmony_ci { 40862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_2_BYTE, 40962306a36Sopenharmony_ci .elem_len = 1, 41062306a36Sopenharmony_ci .elem_size = sizeof(u16), 41162306a36Sopenharmony_ci .array_type = NO_ARRAY, 41262306a36Sopenharmony_ci .tlv_type = 0x22, 41362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 41462306a36Sopenharmony_ci mlo_chip_id), 41562306a36Sopenharmony_ci }, 41662306a36Sopenharmony_ci { 41762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 41862306a36Sopenharmony_ci .elem_len = 1, 41962306a36Sopenharmony_ci .elem_size = sizeof(u8), 42062306a36Sopenharmony_ci .array_type = NO_ARRAY, 42162306a36Sopenharmony_ci .tlv_type = 0x23, 42262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 42362306a36Sopenharmony_ci mlo_group_id_valid), 42462306a36Sopenharmony_ci }, 42562306a36Sopenharmony_ci { 42662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 42762306a36Sopenharmony_ci .elem_len = 1, 42862306a36Sopenharmony_ci .elem_size = sizeof(u8), 42962306a36Sopenharmony_ci .array_type = NO_ARRAY, 43062306a36Sopenharmony_ci .tlv_type = 0x23, 43162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 43262306a36Sopenharmony_ci mlo_group_id), 43362306a36Sopenharmony_ci }, 43462306a36Sopenharmony_ci { 43562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 43662306a36Sopenharmony_ci .elem_len = 1, 43762306a36Sopenharmony_ci .elem_size = sizeof(u8), 43862306a36Sopenharmony_ci .array_type = NO_ARRAY, 43962306a36Sopenharmony_ci .tlv_type = 0x24, 44062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 44162306a36Sopenharmony_ci max_mlo_peer_valid), 44262306a36Sopenharmony_ci }, 44362306a36Sopenharmony_ci { 44462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_2_BYTE, 44562306a36Sopenharmony_ci .elem_len = 1, 44662306a36Sopenharmony_ci .elem_size = sizeof(u16), 44762306a36Sopenharmony_ci .array_type = NO_ARRAY, 44862306a36Sopenharmony_ci .tlv_type = 0x24, 44962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 45062306a36Sopenharmony_ci max_mlo_peer), 45162306a36Sopenharmony_ci }, 45262306a36Sopenharmony_ci { 45362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 45462306a36Sopenharmony_ci .elem_len = 1, 45562306a36Sopenharmony_ci .elem_size = sizeof(u8), 45662306a36Sopenharmony_ci .array_type = NO_ARRAY, 45762306a36Sopenharmony_ci .tlv_type = 0x25, 45862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 45962306a36Sopenharmony_ci mlo_num_chips_valid), 46062306a36Sopenharmony_ci }, 46162306a36Sopenharmony_ci { 46262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 46362306a36Sopenharmony_ci .elem_len = 1, 46462306a36Sopenharmony_ci .elem_size = sizeof(u8), 46562306a36Sopenharmony_ci .array_type = NO_ARRAY, 46662306a36Sopenharmony_ci .tlv_type = 0x25, 46762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 46862306a36Sopenharmony_ci mlo_num_chips), 46962306a36Sopenharmony_ci }, 47062306a36Sopenharmony_ci { 47162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 47262306a36Sopenharmony_ci .elem_len = 1, 47362306a36Sopenharmony_ci .elem_size = sizeof(u8), 47462306a36Sopenharmony_ci .array_type = NO_ARRAY, 47562306a36Sopenharmony_ci .tlv_type = 0x26, 47662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 47762306a36Sopenharmony_ci mlo_chip_info_valid), 47862306a36Sopenharmony_ci }, 47962306a36Sopenharmony_ci { 48062306a36Sopenharmony_ci .data_type = QMI_STRUCT, 48162306a36Sopenharmony_ci .elem_len = QMI_WLFW_MAX_NUM_MLO_CHIPS_V01, 48262306a36Sopenharmony_ci .elem_size = sizeof(struct wlfw_host_mlo_chip_info_s_v01), 48362306a36Sopenharmony_ci .array_type = STATIC_ARRAY, 48462306a36Sopenharmony_ci .tlv_type = 0x26, 48562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 48662306a36Sopenharmony_ci mlo_chip_info), 48762306a36Sopenharmony_ci .ei_array = wlfw_host_mlo_chip_info_s_v01_ei, 48862306a36Sopenharmony_ci }, 48962306a36Sopenharmony_ci { 49062306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 49162306a36Sopenharmony_ci .elem_len = 1, 49262306a36Sopenharmony_ci .elem_size = sizeof(u8), 49362306a36Sopenharmony_ci .array_type = NO_ARRAY, 49462306a36Sopenharmony_ci .tlv_type = 0x27, 49562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 49662306a36Sopenharmony_ci feature_list_valid), 49762306a36Sopenharmony_ci }, 49862306a36Sopenharmony_ci { 49962306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 50062306a36Sopenharmony_ci .elem_len = 1, 50162306a36Sopenharmony_ci .elem_size = sizeof(u64), 50262306a36Sopenharmony_ci .array_type = NO_ARRAY, 50362306a36Sopenharmony_ci .tlv_type = 0x27, 50462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 50562306a36Sopenharmony_ci feature_list), 50662306a36Sopenharmony_ci }, 50762306a36Sopenharmony_ci { 50862306a36Sopenharmony_ci .data_type = QMI_EOTI, 50962306a36Sopenharmony_ci .array_type = NO_ARRAY, 51062306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 51162306a36Sopenharmony_ci }, 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { 51562306a36Sopenharmony_ci { 51662306a36Sopenharmony_ci .data_type = QMI_STRUCT, 51762306a36Sopenharmony_ci .elem_len = 1, 51862306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 51962306a36Sopenharmony_ci .array_type = NO_ARRAY, 52062306a36Sopenharmony_ci .tlv_type = 0x02, 52162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp), 52262306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 52362306a36Sopenharmony_ci }, 52462306a36Sopenharmony_ci { 52562306a36Sopenharmony_ci .data_type = QMI_EOTI, 52662306a36Sopenharmony_ci .array_type = NO_ARRAY, 52762306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 52862306a36Sopenharmony_ci }, 52962306a36Sopenharmony_ci}; 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { 53262306a36Sopenharmony_ci { 53362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 53462306a36Sopenharmony_ci .elem_len = 1, 53562306a36Sopenharmony_ci .elem_size = sizeof(u8), 53662306a36Sopenharmony_ci .array_type = NO_ARRAY, 53762306a36Sopenharmony_ci .tlv_type = 0x10, 53862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 53962306a36Sopenharmony_ci fw_ready_enable_valid), 54062306a36Sopenharmony_ci }, 54162306a36Sopenharmony_ci { 54262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 54362306a36Sopenharmony_ci .elem_len = 1, 54462306a36Sopenharmony_ci .elem_size = sizeof(u8), 54562306a36Sopenharmony_ci .array_type = NO_ARRAY, 54662306a36Sopenharmony_ci .tlv_type = 0x10, 54762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 54862306a36Sopenharmony_ci fw_ready_enable), 54962306a36Sopenharmony_ci }, 55062306a36Sopenharmony_ci { 55162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 55262306a36Sopenharmony_ci .elem_len = 1, 55362306a36Sopenharmony_ci .elem_size = sizeof(u8), 55462306a36Sopenharmony_ci .array_type = NO_ARRAY, 55562306a36Sopenharmony_ci .tlv_type = 0x11, 55662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 55762306a36Sopenharmony_ci initiate_cal_download_enable_valid), 55862306a36Sopenharmony_ci }, 55962306a36Sopenharmony_ci { 56062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 56162306a36Sopenharmony_ci .elem_len = 1, 56262306a36Sopenharmony_ci .elem_size = sizeof(u8), 56362306a36Sopenharmony_ci .array_type = NO_ARRAY, 56462306a36Sopenharmony_ci .tlv_type = 0x11, 56562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 56662306a36Sopenharmony_ci initiate_cal_download_enable), 56762306a36Sopenharmony_ci }, 56862306a36Sopenharmony_ci { 56962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 57062306a36Sopenharmony_ci .elem_len = 1, 57162306a36Sopenharmony_ci .elem_size = sizeof(u8), 57262306a36Sopenharmony_ci .array_type = NO_ARRAY, 57362306a36Sopenharmony_ci .tlv_type = 0x12, 57462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 57562306a36Sopenharmony_ci initiate_cal_update_enable_valid), 57662306a36Sopenharmony_ci }, 57762306a36Sopenharmony_ci { 57862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 57962306a36Sopenharmony_ci .elem_len = 1, 58062306a36Sopenharmony_ci .elem_size = sizeof(u8), 58162306a36Sopenharmony_ci .array_type = NO_ARRAY, 58262306a36Sopenharmony_ci .tlv_type = 0x12, 58362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 58462306a36Sopenharmony_ci initiate_cal_update_enable), 58562306a36Sopenharmony_ci }, 58662306a36Sopenharmony_ci { 58762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 58862306a36Sopenharmony_ci .elem_len = 1, 58962306a36Sopenharmony_ci .elem_size = sizeof(u8), 59062306a36Sopenharmony_ci .array_type = NO_ARRAY, 59162306a36Sopenharmony_ci .tlv_type = 0x13, 59262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 59362306a36Sopenharmony_ci msa_ready_enable_valid), 59462306a36Sopenharmony_ci }, 59562306a36Sopenharmony_ci { 59662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 59762306a36Sopenharmony_ci .elem_len = 1, 59862306a36Sopenharmony_ci .elem_size = sizeof(u8), 59962306a36Sopenharmony_ci .array_type = NO_ARRAY, 60062306a36Sopenharmony_ci .tlv_type = 0x13, 60162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 60262306a36Sopenharmony_ci msa_ready_enable), 60362306a36Sopenharmony_ci }, 60462306a36Sopenharmony_ci { 60562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 60662306a36Sopenharmony_ci .elem_len = 1, 60762306a36Sopenharmony_ci .elem_size = sizeof(u8), 60862306a36Sopenharmony_ci .array_type = NO_ARRAY, 60962306a36Sopenharmony_ci .tlv_type = 0x14, 61062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 61162306a36Sopenharmony_ci pin_connect_result_enable_valid), 61262306a36Sopenharmony_ci }, 61362306a36Sopenharmony_ci { 61462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 61562306a36Sopenharmony_ci .elem_len = 1, 61662306a36Sopenharmony_ci .elem_size = sizeof(u8), 61762306a36Sopenharmony_ci .array_type = NO_ARRAY, 61862306a36Sopenharmony_ci .tlv_type = 0x14, 61962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 62062306a36Sopenharmony_ci pin_connect_result_enable), 62162306a36Sopenharmony_ci }, 62262306a36Sopenharmony_ci { 62362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 62462306a36Sopenharmony_ci .elem_len = 1, 62562306a36Sopenharmony_ci .elem_size = sizeof(u8), 62662306a36Sopenharmony_ci .array_type = NO_ARRAY, 62762306a36Sopenharmony_ci .tlv_type = 0x15, 62862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 62962306a36Sopenharmony_ci client_id_valid), 63062306a36Sopenharmony_ci }, 63162306a36Sopenharmony_ci { 63262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 63362306a36Sopenharmony_ci .elem_len = 1, 63462306a36Sopenharmony_ci .elem_size = sizeof(u32), 63562306a36Sopenharmony_ci .array_type = NO_ARRAY, 63662306a36Sopenharmony_ci .tlv_type = 0x15, 63762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 63862306a36Sopenharmony_ci client_id), 63962306a36Sopenharmony_ci }, 64062306a36Sopenharmony_ci { 64162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 64262306a36Sopenharmony_ci .elem_len = 1, 64362306a36Sopenharmony_ci .elem_size = sizeof(u8), 64462306a36Sopenharmony_ci .array_type = NO_ARRAY, 64562306a36Sopenharmony_ci .tlv_type = 0x16, 64662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 64762306a36Sopenharmony_ci request_mem_enable_valid), 64862306a36Sopenharmony_ci }, 64962306a36Sopenharmony_ci { 65062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 65162306a36Sopenharmony_ci .elem_len = 1, 65262306a36Sopenharmony_ci .elem_size = sizeof(u8), 65362306a36Sopenharmony_ci .array_type = NO_ARRAY, 65462306a36Sopenharmony_ci .tlv_type = 0x16, 65562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 65662306a36Sopenharmony_ci request_mem_enable), 65762306a36Sopenharmony_ci }, 65862306a36Sopenharmony_ci { 65962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 66062306a36Sopenharmony_ci .elem_len = 1, 66162306a36Sopenharmony_ci .elem_size = sizeof(u8), 66262306a36Sopenharmony_ci .array_type = NO_ARRAY, 66362306a36Sopenharmony_ci .tlv_type = 0x17, 66462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 66562306a36Sopenharmony_ci fw_mem_ready_enable_valid), 66662306a36Sopenharmony_ci }, 66762306a36Sopenharmony_ci { 66862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 66962306a36Sopenharmony_ci .elem_len = 1, 67062306a36Sopenharmony_ci .elem_size = sizeof(u8), 67162306a36Sopenharmony_ci .array_type = NO_ARRAY, 67262306a36Sopenharmony_ci .tlv_type = 0x17, 67362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 67462306a36Sopenharmony_ci fw_mem_ready_enable), 67562306a36Sopenharmony_ci }, 67662306a36Sopenharmony_ci { 67762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 67862306a36Sopenharmony_ci .elem_len = 1, 67962306a36Sopenharmony_ci .elem_size = sizeof(u8), 68062306a36Sopenharmony_ci .array_type = NO_ARRAY, 68162306a36Sopenharmony_ci .tlv_type = 0x18, 68262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 68362306a36Sopenharmony_ci fw_init_done_enable_valid), 68462306a36Sopenharmony_ci }, 68562306a36Sopenharmony_ci { 68662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 68762306a36Sopenharmony_ci .elem_len = 1, 68862306a36Sopenharmony_ci .elem_size = sizeof(u8), 68962306a36Sopenharmony_ci .array_type = NO_ARRAY, 69062306a36Sopenharmony_ci .tlv_type = 0x18, 69162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 69262306a36Sopenharmony_ci fw_init_done_enable), 69362306a36Sopenharmony_ci }, 69462306a36Sopenharmony_ci 69562306a36Sopenharmony_ci { 69662306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 69762306a36Sopenharmony_ci .elem_len = 1, 69862306a36Sopenharmony_ci .elem_size = sizeof(u8), 69962306a36Sopenharmony_ci .array_type = NO_ARRAY, 70062306a36Sopenharmony_ci .tlv_type = 0x19, 70162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 70262306a36Sopenharmony_ci rejuvenate_enable_valid), 70362306a36Sopenharmony_ci }, 70462306a36Sopenharmony_ci { 70562306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 70662306a36Sopenharmony_ci .elem_len = 1, 70762306a36Sopenharmony_ci .elem_size = sizeof(u8), 70862306a36Sopenharmony_ci .array_type = NO_ARRAY, 70962306a36Sopenharmony_ci .tlv_type = 0x19, 71062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 71162306a36Sopenharmony_ci rejuvenate_enable), 71262306a36Sopenharmony_ci }, 71362306a36Sopenharmony_ci { 71462306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 71562306a36Sopenharmony_ci .elem_len = 1, 71662306a36Sopenharmony_ci .elem_size = sizeof(u8), 71762306a36Sopenharmony_ci .array_type = NO_ARRAY, 71862306a36Sopenharmony_ci .tlv_type = 0x1A, 71962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 72062306a36Sopenharmony_ci xo_cal_enable_valid), 72162306a36Sopenharmony_ci }, 72262306a36Sopenharmony_ci { 72362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 72462306a36Sopenharmony_ci .elem_len = 1, 72562306a36Sopenharmony_ci .elem_size = sizeof(u8), 72662306a36Sopenharmony_ci .array_type = NO_ARRAY, 72762306a36Sopenharmony_ci .tlv_type = 0x1A, 72862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 72962306a36Sopenharmony_ci xo_cal_enable), 73062306a36Sopenharmony_ci }, 73162306a36Sopenharmony_ci { 73262306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 73362306a36Sopenharmony_ci .elem_len = 1, 73462306a36Sopenharmony_ci .elem_size = sizeof(u8), 73562306a36Sopenharmony_ci .array_type = NO_ARRAY, 73662306a36Sopenharmony_ci .tlv_type = 0x1B, 73762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 73862306a36Sopenharmony_ci cal_done_enable_valid), 73962306a36Sopenharmony_ci }, 74062306a36Sopenharmony_ci { 74162306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 74262306a36Sopenharmony_ci .elem_len = 1, 74362306a36Sopenharmony_ci .elem_size = sizeof(u8), 74462306a36Sopenharmony_ci .array_type = NO_ARRAY, 74562306a36Sopenharmony_ci .tlv_type = 0x1B, 74662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 74762306a36Sopenharmony_ci cal_done_enable), 74862306a36Sopenharmony_ci }, 74962306a36Sopenharmony_ci { 75062306a36Sopenharmony_ci .data_type = QMI_EOTI, 75162306a36Sopenharmony_ci .array_type = NO_ARRAY, 75262306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 75362306a36Sopenharmony_ci }, 75462306a36Sopenharmony_ci}; 75562306a36Sopenharmony_ci 75662306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { 75762306a36Sopenharmony_ci { 75862306a36Sopenharmony_ci .data_type = QMI_STRUCT, 75962306a36Sopenharmony_ci .elem_len = 1, 76062306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 76162306a36Sopenharmony_ci .array_type = NO_ARRAY, 76262306a36Sopenharmony_ci .tlv_type = 0x02, 76362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 76462306a36Sopenharmony_ci resp), 76562306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 76662306a36Sopenharmony_ci }, 76762306a36Sopenharmony_ci { 76862306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 76962306a36Sopenharmony_ci .elem_len = 1, 77062306a36Sopenharmony_ci .elem_size = sizeof(u8), 77162306a36Sopenharmony_ci .array_type = NO_ARRAY, 77262306a36Sopenharmony_ci .tlv_type = 0x10, 77362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 77462306a36Sopenharmony_ci fw_status_valid), 77562306a36Sopenharmony_ci }, 77662306a36Sopenharmony_ci { 77762306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 77862306a36Sopenharmony_ci .elem_len = 1, 77962306a36Sopenharmony_ci .elem_size = sizeof(u64), 78062306a36Sopenharmony_ci .array_type = NO_ARRAY, 78162306a36Sopenharmony_ci .tlv_type = 0x10, 78262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 78362306a36Sopenharmony_ci fw_status), 78462306a36Sopenharmony_ci }, 78562306a36Sopenharmony_ci { 78662306a36Sopenharmony_ci .data_type = QMI_EOTI, 78762306a36Sopenharmony_ci .array_type = NO_ARRAY, 78862306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 78962306a36Sopenharmony_ci }, 79062306a36Sopenharmony_ci}; 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { 79362306a36Sopenharmony_ci { 79462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 79562306a36Sopenharmony_ci .elem_len = 1, 79662306a36Sopenharmony_ci .elem_size = sizeof(u64), 79762306a36Sopenharmony_ci .array_type = NO_ARRAY, 79862306a36Sopenharmony_ci .tlv_type = 0, 79962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset), 80062306a36Sopenharmony_ci }, 80162306a36Sopenharmony_ci { 80262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 80362306a36Sopenharmony_ci .elem_len = 1, 80462306a36Sopenharmony_ci .elem_size = sizeof(u32), 80562306a36Sopenharmony_ci .array_type = NO_ARRAY, 80662306a36Sopenharmony_ci .tlv_type = 0, 80762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size), 80862306a36Sopenharmony_ci }, 80962306a36Sopenharmony_ci { 81062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 81162306a36Sopenharmony_ci .elem_len = 1, 81262306a36Sopenharmony_ci .elem_size = sizeof(u8), 81362306a36Sopenharmony_ci .array_type = NO_ARRAY, 81462306a36Sopenharmony_ci .tlv_type = 0, 81562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag), 81662306a36Sopenharmony_ci }, 81762306a36Sopenharmony_ci { 81862306a36Sopenharmony_ci .data_type = QMI_EOTI, 81962306a36Sopenharmony_ci .array_type = NO_ARRAY, 82062306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 82162306a36Sopenharmony_ci }, 82262306a36Sopenharmony_ci}; 82362306a36Sopenharmony_ci 82462306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { 82562306a36Sopenharmony_ci { 82662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 82762306a36Sopenharmony_ci .elem_len = 1, 82862306a36Sopenharmony_ci .elem_size = sizeof(u32), 82962306a36Sopenharmony_ci .array_type = NO_ARRAY, 83062306a36Sopenharmony_ci .tlv_type = 0, 83162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, 83262306a36Sopenharmony_ci size), 83362306a36Sopenharmony_ci }, 83462306a36Sopenharmony_ci { 83562306a36Sopenharmony_ci .data_type = QMI_SIGNED_4_BYTE_ENUM, 83662306a36Sopenharmony_ci .elem_len = 1, 83762306a36Sopenharmony_ci .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01), 83862306a36Sopenharmony_ci .array_type = NO_ARRAY, 83962306a36Sopenharmony_ci .tlv_type = 0, 84062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type), 84162306a36Sopenharmony_ci }, 84262306a36Sopenharmony_ci { 84362306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 84462306a36Sopenharmony_ci .elem_len = 1, 84562306a36Sopenharmony_ci .elem_size = sizeof(u8), 84662306a36Sopenharmony_ci .array_type = NO_ARRAY, 84762306a36Sopenharmony_ci .tlv_type = 0, 84862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len), 84962306a36Sopenharmony_ci }, 85062306a36Sopenharmony_ci { 85162306a36Sopenharmony_ci .data_type = QMI_STRUCT, 85262306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01, 85362306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01), 85462306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 85562306a36Sopenharmony_ci .tlv_type = 0, 85662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg), 85762306a36Sopenharmony_ci .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei, 85862306a36Sopenharmony_ci }, 85962306a36Sopenharmony_ci { 86062306a36Sopenharmony_ci .data_type = QMI_EOTI, 86162306a36Sopenharmony_ci .array_type = NO_ARRAY, 86262306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 86362306a36Sopenharmony_ci }, 86462306a36Sopenharmony_ci}; 86562306a36Sopenharmony_ci 86662306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { 86762306a36Sopenharmony_ci { 86862306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 86962306a36Sopenharmony_ci .elem_len = 1, 87062306a36Sopenharmony_ci .elem_size = sizeof(u8), 87162306a36Sopenharmony_ci .array_type = NO_ARRAY, 87262306a36Sopenharmony_ci .tlv_type = 0x01, 87362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01, 87462306a36Sopenharmony_ci mem_seg_len), 87562306a36Sopenharmony_ci }, 87662306a36Sopenharmony_ci { 87762306a36Sopenharmony_ci .data_type = QMI_STRUCT, 87862306a36Sopenharmony_ci .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01, 87962306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01), 88062306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 88162306a36Sopenharmony_ci .tlv_type = 0x01, 88262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01, 88362306a36Sopenharmony_ci mem_seg), 88462306a36Sopenharmony_ci .ei_array = qmi_wlanfw_mem_seg_s_v01_ei, 88562306a36Sopenharmony_ci }, 88662306a36Sopenharmony_ci { 88762306a36Sopenharmony_ci .data_type = QMI_EOTI, 88862306a36Sopenharmony_ci .array_type = NO_ARRAY, 88962306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 89062306a36Sopenharmony_ci }, 89162306a36Sopenharmony_ci}; 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { 89462306a36Sopenharmony_ci { 89562306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 89662306a36Sopenharmony_ci .elem_len = 1, 89762306a36Sopenharmony_ci .elem_size = sizeof(u64), 89862306a36Sopenharmony_ci .array_type = NO_ARRAY, 89962306a36Sopenharmony_ci .tlv_type = 0, 90062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr), 90162306a36Sopenharmony_ci }, 90262306a36Sopenharmony_ci { 90362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 90462306a36Sopenharmony_ci .elem_len = 1, 90562306a36Sopenharmony_ci .elem_size = sizeof(u32), 90662306a36Sopenharmony_ci .array_type = NO_ARRAY, 90762306a36Sopenharmony_ci .tlv_type = 0, 90862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size), 90962306a36Sopenharmony_ci }, 91062306a36Sopenharmony_ci { 91162306a36Sopenharmony_ci .data_type = QMI_SIGNED_4_BYTE_ENUM, 91262306a36Sopenharmony_ci .elem_len = 1, 91362306a36Sopenharmony_ci .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01), 91462306a36Sopenharmony_ci .array_type = NO_ARRAY, 91562306a36Sopenharmony_ci .tlv_type = 0, 91662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type), 91762306a36Sopenharmony_ci }, 91862306a36Sopenharmony_ci { 91962306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 92062306a36Sopenharmony_ci .elem_len = 1, 92162306a36Sopenharmony_ci .elem_size = sizeof(u8), 92262306a36Sopenharmony_ci .array_type = NO_ARRAY, 92362306a36Sopenharmony_ci .tlv_type = 0, 92462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore), 92562306a36Sopenharmony_ci }, 92662306a36Sopenharmony_ci { 92762306a36Sopenharmony_ci .data_type = QMI_EOTI, 92862306a36Sopenharmony_ci .array_type = NO_ARRAY, 92962306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 93062306a36Sopenharmony_ci }, 93162306a36Sopenharmony_ci}; 93262306a36Sopenharmony_ci 93362306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { 93462306a36Sopenharmony_ci { 93562306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 93662306a36Sopenharmony_ci .elem_len = 1, 93762306a36Sopenharmony_ci .elem_size = sizeof(u8), 93862306a36Sopenharmony_ci .array_type = NO_ARRAY, 93962306a36Sopenharmony_ci .tlv_type = 0x01, 94062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01, 94162306a36Sopenharmony_ci mem_seg_len), 94262306a36Sopenharmony_ci }, 94362306a36Sopenharmony_ci { 94462306a36Sopenharmony_ci .data_type = QMI_STRUCT, 94562306a36Sopenharmony_ci .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01, 94662306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01), 94762306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 94862306a36Sopenharmony_ci .tlv_type = 0x01, 94962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01, 95062306a36Sopenharmony_ci mem_seg), 95162306a36Sopenharmony_ci .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei, 95262306a36Sopenharmony_ci }, 95362306a36Sopenharmony_ci { 95462306a36Sopenharmony_ci .data_type = QMI_EOTI, 95562306a36Sopenharmony_ci .array_type = NO_ARRAY, 95662306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 95762306a36Sopenharmony_ci }, 95862306a36Sopenharmony_ci}; 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { 96162306a36Sopenharmony_ci { 96262306a36Sopenharmony_ci .data_type = QMI_STRUCT, 96362306a36Sopenharmony_ci .elem_len = 1, 96462306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 96562306a36Sopenharmony_ci .array_type = NO_ARRAY, 96662306a36Sopenharmony_ci .tlv_type = 0x02, 96762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01, 96862306a36Sopenharmony_ci resp), 96962306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 97062306a36Sopenharmony_ci }, 97162306a36Sopenharmony_ci { 97262306a36Sopenharmony_ci .data_type = QMI_EOTI, 97362306a36Sopenharmony_ci .array_type = NO_ARRAY, 97462306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 97562306a36Sopenharmony_ci }, 97662306a36Sopenharmony_ci}; 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { 97962306a36Sopenharmony_ci { 98062306a36Sopenharmony_ci .data_type = QMI_EOTI, 98162306a36Sopenharmony_ci .array_type = NO_ARRAY, 98262306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 98362306a36Sopenharmony_ci }, 98462306a36Sopenharmony_ci}; 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { 98762306a36Sopenharmony_ci { 98862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 98962306a36Sopenharmony_ci .elem_len = 1, 99062306a36Sopenharmony_ci .elem_size = sizeof(u32), 99162306a36Sopenharmony_ci .array_type = NO_ARRAY, 99262306a36Sopenharmony_ci .tlv_type = 0, 99362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01, 99462306a36Sopenharmony_ci chip_id), 99562306a36Sopenharmony_ci }, 99662306a36Sopenharmony_ci { 99762306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 99862306a36Sopenharmony_ci .elem_len = 1, 99962306a36Sopenharmony_ci .elem_size = sizeof(u32), 100062306a36Sopenharmony_ci .array_type = NO_ARRAY, 100162306a36Sopenharmony_ci .tlv_type = 0, 100262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01, 100362306a36Sopenharmony_ci chip_family), 100462306a36Sopenharmony_ci }, 100562306a36Sopenharmony_ci { 100662306a36Sopenharmony_ci .data_type = QMI_EOTI, 100762306a36Sopenharmony_ci .array_type = NO_ARRAY, 100862306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 100962306a36Sopenharmony_ci }, 101062306a36Sopenharmony_ci}; 101162306a36Sopenharmony_ci 101262306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { 101362306a36Sopenharmony_ci { 101462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 101562306a36Sopenharmony_ci .elem_len = 1, 101662306a36Sopenharmony_ci .elem_size = sizeof(u32), 101762306a36Sopenharmony_ci .array_type = NO_ARRAY, 101862306a36Sopenharmony_ci .tlv_type = 0, 101962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01, 102062306a36Sopenharmony_ci board_id), 102162306a36Sopenharmony_ci }, 102262306a36Sopenharmony_ci { 102362306a36Sopenharmony_ci .data_type = QMI_EOTI, 102462306a36Sopenharmony_ci .array_type = NO_ARRAY, 102562306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 102662306a36Sopenharmony_ci }, 102762306a36Sopenharmony_ci}; 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { 103062306a36Sopenharmony_ci { 103162306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 103262306a36Sopenharmony_ci .elem_len = 1, 103362306a36Sopenharmony_ci .elem_size = sizeof(u32), 103462306a36Sopenharmony_ci .array_type = NO_ARRAY, 103562306a36Sopenharmony_ci .tlv_type = 0, 103662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id), 103762306a36Sopenharmony_ci }, 103862306a36Sopenharmony_ci { 103962306a36Sopenharmony_ci .data_type = QMI_EOTI, 104062306a36Sopenharmony_ci .array_type = NO_ARRAY, 104162306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 104262306a36Sopenharmony_ci }, 104362306a36Sopenharmony_ci}; 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_dev_mem_info_s_v01_ei[] = { 104662306a36Sopenharmony_ci { 104762306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 104862306a36Sopenharmony_ci .elem_len = 1, 104962306a36Sopenharmony_ci .elem_size = sizeof(u64), 105062306a36Sopenharmony_ci .array_type = NO_ARRAY, 105162306a36Sopenharmony_ci .tlv_type = 0, 105262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01, 105362306a36Sopenharmony_ci start), 105462306a36Sopenharmony_ci }, 105562306a36Sopenharmony_ci { 105662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 105762306a36Sopenharmony_ci .elem_len = 1, 105862306a36Sopenharmony_ci .elem_size = sizeof(u64), 105962306a36Sopenharmony_ci .array_type = NO_ARRAY, 106062306a36Sopenharmony_ci .tlv_type = 0, 106162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01, 106262306a36Sopenharmony_ci size), 106362306a36Sopenharmony_ci }, 106462306a36Sopenharmony_ci { 106562306a36Sopenharmony_ci .data_type = QMI_EOTI, 106662306a36Sopenharmony_ci .array_type = NO_ARRAY, 106762306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 106862306a36Sopenharmony_ci }, 106962306a36Sopenharmony_ci}; 107062306a36Sopenharmony_ci 107162306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { 107262306a36Sopenharmony_ci { 107362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 107462306a36Sopenharmony_ci .elem_len = 1, 107562306a36Sopenharmony_ci .elem_size = sizeof(u32), 107662306a36Sopenharmony_ci .array_type = NO_ARRAY, 107762306a36Sopenharmony_ci .tlv_type = 0, 107862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01, 107962306a36Sopenharmony_ci fw_version), 108062306a36Sopenharmony_ci }, 108162306a36Sopenharmony_ci { 108262306a36Sopenharmony_ci .data_type = QMI_STRING, 108362306a36Sopenharmony_ci .elem_len = ATH12K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1, 108462306a36Sopenharmony_ci .elem_size = sizeof(char), 108562306a36Sopenharmony_ci .array_type = NO_ARRAY, 108662306a36Sopenharmony_ci .tlv_type = 0, 108762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01, 108862306a36Sopenharmony_ci fw_build_timestamp), 108962306a36Sopenharmony_ci }, 109062306a36Sopenharmony_ci { 109162306a36Sopenharmony_ci .data_type = QMI_EOTI, 109262306a36Sopenharmony_ci .array_type = NO_ARRAY, 109362306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 109462306a36Sopenharmony_ci }, 109562306a36Sopenharmony_ci}; 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { 109862306a36Sopenharmony_ci { 109962306a36Sopenharmony_ci .data_type = QMI_STRUCT, 110062306a36Sopenharmony_ci .elem_len = 1, 110162306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 110262306a36Sopenharmony_ci .array_type = NO_ARRAY, 110362306a36Sopenharmony_ci .tlv_type = 0x02, 110462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp), 110562306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 110662306a36Sopenharmony_ci }, 110762306a36Sopenharmony_ci { 110862306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 110962306a36Sopenharmony_ci .elem_len = 1, 111062306a36Sopenharmony_ci .elem_size = sizeof(u8), 111162306a36Sopenharmony_ci .array_type = NO_ARRAY, 111262306a36Sopenharmony_ci .tlv_type = 0x10, 111362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 111462306a36Sopenharmony_ci chip_info_valid), 111562306a36Sopenharmony_ci }, 111662306a36Sopenharmony_ci { 111762306a36Sopenharmony_ci .data_type = QMI_STRUCT, 111862306a36Sopenharmony_ci .elem_len = 1, 111962306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01), 112062306a36Sopenharmony_ci .array_type = NO_ARRAY, 112162306a36Sopenharmony_ci .tlv_type = 0x10, 112262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 112362306a36Sopenharmony_ci chip_info), 112462306a36Sopenharmony_ci .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei, 112562306a36Sopenharmony_ci }, 112662306a36Sopenharmony_ci { 112762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 112862306a36Sopenharmony_ci .elem_len = 1, 112962306a36Sopenharmony_ci .elem_size = sizeof(u8), 113062306a36Sopenharmony_ci .array_type = NO_ARRAY, 113162306a36Sopenharmony_ci .tlv_type = 0x11, 113262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 113362306a36Sopenharmony_ci board_info_valid), 113462306a36Sopenharmony_ci }, 113562306a36Sopenharmony_ci { 113662306a36Sopenharmony_ci .data_type = QMI_STRUCT, 113762306a36Sopenharmony_ci .elem_len = 1, 113862306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01), 113962306a36Sopenharmony_ci .array_type = NO_ARRAY, 114062306a36Sopenharmony_ci .tlv_type = 0x11, 114162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 114262306a36Sopenharmony_ci board_info), 114362306a36Sopenharmony_ci .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei, 114462306a36Sopenharmony_ci }, 114562306a36Sopenharmony_ci { 114662306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 114762306a36Sopenharmony_ci .elem_len = 1, 114862306a36Sopenharmony_ci .elem_size = sizeof(u8), 114962306a36Sopenharmony_ci .array_type = NO_ARRAY, 115062306a36Sopenharmony_ci .tlv_type = 0x12, 115162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 115262306a36Sopenharmony_ci soc_info_valid), 115362306a36Sopenharmony_ci }, 115462306a36Sopenharmony_ci { 115562306a36Sopenharmony_ci .data_type = QMI_STRUCT, 115662306a36Sopenharmony_ci .elem_len = 1, 115762306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01), 115862306a36Sopenharmony_ci .array_type = NO_ARRAY, 115962306a36Sopenharmony_ci .tlv_type = 0x12, 116062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 116162306a36Sopenharmony_ci soc_info), 116262306a36Sopenharmony_ci .ei_array = qmi_wlanfw_soc_info_s_v01_ei, 116362306a36Sopenharmony_ci }, 116462306a36Sopenharmony_ci { 116562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 116662306a36Sopenharmony_ci .elem_len = 1, 116762306a36Sopenharmony_ci .elem_size = sizeof(u8), 116862306a36Sopenharmony_ci .array_type = NO_ARRAY, 116962306a36Sopenharmony_ci .tlv_type = 0x13, 117062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 117162306a36Sopenharmony_ci fw_version_info_valid), 117262306a36Sopenharmony_ci }, 117362306a36Sopenharmony_ci { 117462306a36Sopenharmony_ci .data_type = QMI_STRUCT, 117562306a36Sopenharmony_ci .elem_len = 1, 117662306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01), 117762306a36Sopenharmony_ci .array_type = NO_ARRAY, 117862306a36Sopenharmony_ci .tlv_type = 0x13, 117962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 118062306a36Sopenharmony_ci fw_version_info), 118162306a36Sopenharmony_ci .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei, 118262306a36Sopenharmony_ci }, 118362306a36Sopenharmony_ci { 118462306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 118562306a36Sopenharmony_ci .elem_len = 1, 118662306a36Sopenharmony_ci .elem_size = sizeof(u8), 118762306a36Sopenharmony_ci .array_type = NO_ARRAY, 118862306a36Sopenharmony_ci .tlv_type = 0x14, 118962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 119062306a36Sopenharmony_ci fw_build_id_valid), 119162306a36Sopenharmony_ci }, 119262306a36Sopenharmony_ci { 119362306a36Sopenharmony_ci .data_type = QMI_STRING, 119462306a36Sopenharmony_ci .elem_len = ATH12K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1, 119562306a36Sopenharmony_ci .elem_size = sizeof(char), 119662306a36Sopenharmony_ci .array_type = NO_ARRAY, 119762306a36Sopenharmony_ci .tlv_type = 0x14, 119862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 119962306a36Sopenharmony_ci fw_build_id), 120062306a36Sopenharmony_ci }, 120162306a36Sopenharmony_ci { 120262306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 120362306a36Sopenharmony_ci .elem_len = 1, 120462306a36Sopenharmony_ci .elem_size = sizeof(u8), 120562306a36Sopenharmony_ci .array_type = NO_ARRAY, 120662306a36Sopenharmony_ci .tlv_type = 0x15, 120762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 120862306a36Sopenharmony_ci num_macs_valid), 120962306a36Sopenharmony_ci }, 121062306a36Sopenharmony_ci { 121162306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 121262306a36Sopenharmony_ci .elem_len = 1, 121362306a36Sopenharmony_ci .elem_size = sizeof(u8), 121462306a36Sopenharmony_ci .array_type = NO_ARRAY, 121562306a36Sopenharmony_ci .tlv_type = 0x15, 121662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 121762306a36Sopenharmony_ci num_macs), 121862306a36Sopenharmony_ci }, 121962306a36Sopenharmony_ci { 122062306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 122162306a36Sopenharmony_ci .elem_len = 1, 122262306a36Sopenharmony_ci .elem_size = sizeof(u8), 122362306a36Sopenharmony_ci .array_type = NO_ARRAY, 122462306a36Sopenharmony_ci .tlv_type = 0x16, 122562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 122662306a36Sopenharmony_ci voltage_mv_valid), 122762306a36Sopenharmony_ci }, 122862306a36Sopenharmony_ci { 122962306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 123062306a36Sopenharmony_ci .elem_len = 1, 123162306a36Sopenharmony_ci .elem_size = sizeof(u32), 123262306a36Sopenharmony_ci .array_type = NO_ARRAY, 123362306a36Sopenharmony_ci .tlv_type = 0x16, 123462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 123562306a36Sopenharmony_ci voltage_mv), 123662306a36Sopenharmony_ci }, 123762306a36Sopenharmony_ci { 123862306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 123962306a36Sopenharmony_ci .elem_len = 1, 124062306a36Sopenharmony_ci .elem_size = sizeof(u8), 124162306a36Sopenharmony_ci .array_type = NO_ARRAY, 124262306a36Sopenharmony_ci .tlv_type = 0x17, 124362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 124462306a36Sopenharmony_ci time_freq_hz_valid), 124562306a36Sopenharmony_ci }, 124662306a36Sopenharmony_ci { 124762306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 124862306a36Sopenharmony_ci .elem_len = 1, 124962306a36Sopenharmony_ci .elem_size = sizeof(u32), 125062306a36Sopenharmony_ci .array_type = NO_ARRAY, 125162306a36Sopenharmony_ci .tlv_type = 0x17, 125262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 125362306a36Sopenharmony_ci time_freq_hz), 125462306a36Sopenharmony_ci }, 125562306a36Sopenharmony_ci { 125662306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 125762306a36Sopenharmony_ci .elem_len = 1, 125862306a36Sopenharmony_ci .elem_size = sizeof(u8), 125962306a36Sopenharmony_ci .array_type = NO_ARRAY, 126062306a36Sopenharmony_ci .tlv_type = 0x18, 126162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 126262306a36Sopenharmony_ci otp_version_valid), 126362306a36Sopenharmony_ci }, 126462306a36Sopenharmony_ci { 126562306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 126662306a36Sopenharmony_ci .elem_len = 1, 126762306a36Sopenharmony_ci .elem_size = sizeof(u32), 126862306a36Sopenharmony_ci .array_type = NO_ARRAY, 126962306a36Sopenharmony_ci .tlv_type = 0x18, 127062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 127162306a36Sopenharmony_ci otp_version), 127262306a36Sopenharmony_ci }, 127362306a36Sopenharmony_ci { 127462306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 127562306a36Sopenharmony_ci .elem_len = 1, 127662306a36Sopenharmony_ci .elem_size = sizeof(u8), 127762306a36Sopenharmony_ci .array_type = NO_ARRAY, 127862306a36Sopenharmony_ci .tlv_type = 0x19, 127962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 128062306a36Sopenharmony_ci eeprom_caldata_read_timeout_valid), 128162306a36Sopenharmony_ci }, 128262306a36Sopenharmony_ci { 128362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 128462306a36Sopenharmony_ci .elem_len = 1, 128562306a36Sopenharmony_ci .elem_size = sizeof(u32), 128662306a36Sopenharmony_ci .array_type = NO_ARRAY, 128762306a36Sopenharmony_ci .tlv_type = 0x19, 128862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 128962306a36Sopenharmony_ci eeprom_caldata_read_timeout), 129062306a36Sopenharmony_ci }, 129162306a36Sopenharmony_ci { 129262306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 129362306a36Sopenharmony_ci .elem_len = 1, 129462306a36Sopenharmony_ci .elem_size = sizeof(u8), 129562306a36Sopenharmony_ci .array_type = NO_ARRAY, 129662306a36Sopenharmony_ci .tlv_type = 0x1A, 129762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 129862306a36Sopenharmony_ci fw_caps_valid), 129962306a36Sopenharmony_ci }, 130062306a36Sopenharmony_ci { 130162306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 130262306a36Sopenharmony_ci .elem_len = 1, 130362306a36Sopenharmony_ci .elem_size = sizeof(u64), 130462306a36Sopenharmony_ci .array_type = NO_ARRAY, 130562306a36Sopenharmony_ci .tlv_type = 0x1A, 130662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, fw_caps), 130762306a36Sopenharmony_ci }, 130862306a36Sopenharmony_ci { 130962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 131062306a36Sopenharmony_ci .elem_len = 1, 131162306a36Sopenharmony_ci .elem_size = sizeof(u8), 131262306a36Sopenharmony_ci .array_type = NO_ARRAY, 131362306a36Sopenharmony_ci .tlv_type = 0x1B, 131462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 131562306a36Sopenharmony_ci rd_card_chain_cap_valid), 131662306a36Sopenharmony_ci }, 131762306a36Sopenharmony_ci { 131862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 131962306a36Sopenharmony_ci .elem_len = 1, 132062306a36Sopenharmony_ci .elem_size = sizeof(u32), 132162306a36Sopenharmony_ci .array_type = NO_ARRAY, 132262306a36Sopenharmony_ci .tlv_type = 0x1B, 132362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 132462306a36Sopenharmony_ci rd_card_chain_cap), 132562306a36Sopenharmony_ci }, 132662306a36Sopenharmony_ci { 132762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 132862306a36Sopenharmony_ci .elem_len = 1, 132962306a36Sopenharmony_ci .elem_size = sizeof(u8), 133062306a36Sopenharmony_ci .array_type = NO_ARRAY, 133162306a36Sopenharmony_ci .tlv_type = 0x1C, 133262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 133362306a36Sopenharmony_ci dev_mem_info_valid), 133462306a36Sopenharmony_ci }, 133562306a36Sopenharmony_ci { 133662306a36Sopenharmony_ci .data_type = QMI_STRUCT, 133762306a36Sopenharmony_ci .elem_len = ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01, 133862306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_dev_mem_info_s_v01), 133962306a36Sopenharmony_ci .array_type = STATIC_ARRAY, 134062306a36Sopenharmony_ci .tlv_type = 0x1C, 134162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, dev_mem), 134262306a36Sopenharmony_ci .ei_array = qmi_wlanfw_dev_mem_info_s_v01_ei, 134362306a36Sopenharmony_ci }, 134462306a36Sopenharmony_ci { 134562306a36Sopenharmony_ci .data_type = QMI_EOTI, 134662306a36Sopenharmony_ci .array_type = NO_ARRAY, 134762306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 134862306a36Sopenharmony_ci }, 134962306a36Sopenharmony_ci}; 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { 135262306a36Sopenharmony_ci { 135362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 135462306a36Sopenharmony_ci .elem_len = 1, 135562306a36Sopenharmony_ci .elem_size = sizeof(u8), 135662306a36Sopenharmony_ci .array_type = NO_ARRAY, 135762306a36Sopenharmony_ci .tlv_type = 0x01, 135862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 135962306a36Sopenharmony_ci valid), 136062306a36Sopenharmony_ci }, 136162306a36Sopenharmony_ci { 136262306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 136362306a36Sopenharmony_ci .elem_len = 1, 136462306a36Sopenharmony_ci .elem_size = sizeof(u8), 136562306a36Sopenharmony_ci .array_type = NO_ARRAY, 136662306a36Sopenharmony_ci .tlv_type = 0x10, 136762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 136862306a36Sopenharmony_ci file_id_valid), 136962306a36Sopenharmony_ci }, 137062306a36Sopenharmony_ci { 137162306a36Sopenharmony_ci .data_type = QMI_SIGNED_4_BYTE_ENUM, 137262306a36Sopenharmony_ci .elem_len = 1, 137362306a36Sopenharmony_ci .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01), 137462306a36Sopenharmony_ci .array_type = NO_ARRAY, 137562306a36Sopenharmony_ci .tlv_type = 0x10, 137662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 137762306a36Sopenharmony_ci file_id), 137862306a36Sopenharmony_ci }, 137962306a36Sopenharmony_ci { 138062306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 138162306a36Sopenharmony_ci .elem_len = 1, 138262306a36Sopenharmony_ci .elem_size = sizeof(u8), 138362306a36Sopenharmony_ci .array_type = NO_ARRAY, 138462306a36Sopenharmony_ci .tlv_type = 0x11, 138562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 138662306a36Sopenharmony_ci total_size_valid), 138762306a36Sopenharmony_ci }, 138862306a36Sopenharmony_ci { 138962306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 139062306a36Sopenharmony_ci .elem_len = 1, 139162306a36Sopenharmony_ci .elem_size = sizeof(u32), 139262306a36Sopenharmony_ci .array_type = NO_ARRAY, 139362306a36Sopenharmony_ci .tlv_type = 0x11, 139462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 139562306a36Sopenharmony_ci total_size), 139662306a36Sopenharmony_ci }, 139762306a36Sopenharmony_ci { 139862306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 139962306a36Sopenharmony_ci .elem_len = 1, 140062306a36Sopenharmony_ci .elem_size = sizeof(u8), 140162306a36Sopenharmony_ci .array_type = NO_ARRAY, 140262306a36Sopenharmony_ci .tlv_type = 0x12, 140362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 140462306a36Sopenharmony_ci seg_id_valid), 140562306a36Sopenharmony_ci }, 140662306a36Sopenharmony_ci { 140762306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 140862306a36Sopenharmony_ci .elem_len = 1, 140962306a36Sopenharmony_ci .elem_size = sizeof(u32), 141062306a36Sopenharmony_ci .array_type = NO_ARRAY, 141162306a36Sopenharmony_ci .tlv_type = 0x12, 141262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 141362306a36Sopenharmony_ci seg_id), 141462306a36Sopenharmony_ci }, 141562306a36Sopenharmony_ci { 141662306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 141762306a36Sopenharmony_ci .elem_len = 1, 141862306a36Sopenharmony_ci .elem_size = sizeof(u8), 141962306a36Sopenharmony_ci .array_type = NO_ARRAY, 142062306a36Sopenharmony_ci .tlv_type = 0x13, 142162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 142262306a36Sopenharmony_ci data_valid), 142362306a36Sopenharmony_ci }, 142462306a36Sopenharmony_ci { 142562306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 142662306a36Sopenharmony_ci .elem_len = 1, 142762306a36Sopenharmony_ci .elem_size = sizeof(u16), 142862306a36Sopenharmony_ci .array_type = NO_ARRAY, 142962306a36Sopenharmony_ci .tlv_type = 0x13, 143062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 143162306a36Sopenharmony_ci data_len), 143262306a36Sopenharmony_ci }, 143362306a36Sopenharmony_ci { 143462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 143562306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01, 143662306a36Sopenharmony_ci .elem_size = sizeof(u8), 143762306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 143862306a36Sopenharmony_ci .tlv_type = 0x13, 143962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 144062306a36Sopenharmony_ci data), 144162306a36Sopenharmony_ci }, 144262306a36Sopenharmony_ci { 144362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 144462306a36Sopenharmony_ci .elem_len = 1, 144562306a36Sopenharmony_ci .elem_size = sizeof(u8), 144662306a36Sopenharmony_ci .array_type = NO_ARRAY, 144762306a36Sopenharmony_ci .tlv_type = 0x14, 144862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 144962306a36Sopenharmony_ci end_valid), 145062306a36Sopenharmony_ci }, 145162306a36Sopenharmony_ci { 145262306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 145362306a36Sopenharmony_ci .elem_len = 1, 145462306a36Sopenharmony_ci .elem_size = sizeof(u8), 145562306a36Sopenharmony_ci .array_type = NO_ARRAY, 145662306a36Sopenharmony_ci .tlv_type = 0x14, 145762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 145862306a36Sopenharmony_ci end), 145962306a36Sopenharmony_ci }, 146062306a36Sopenharmony_ci { 146162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 146262306a36Sopenharmony_ci .elem_len = 1, 146362306a36Sopenharmony_ci .elem_size = sizeof(u8), 146462306a36Sopenharmony_ci .array_type = NO_ARRAY, 146562306a36Sopenharmony_ci .tlv_type = 0x15, 146662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 146762306a36Sopenharmony_ci bdf_type_valid), 146862306a36Sopenharmony_ci }, 146962306a36Sopenharmony_ci { 147062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 147162306a36Sopenharmony_ci .elem_len = 1, 147262306a36Sopenharmony_ci .elem_size = sizeof(u8), 147362306a36Sopenharmony_ci .array_type = NO_ARRAY, 147462306a36Sopenharmony_ci .tlv_type = 0x15, 147562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 147662306a36Sopenharmony_ci bdf_type), 147762306a36Sopenharmony_ci }, 147862306a36Sopenharmony_ci 147962306a36Sopenharmony_ci { 148062306a36Sopenharmony_ci .data_type = QMI_EOTI, 148162306a36Sopenharmony_ci .array_type = NO_ARRAY, 148262306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 148362306a36Sopenharmony_ci }, 148462306a36Sopenharmony_ci}; 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { 148762306a36Sopenharmony_ci { 148862306a36Sopenharmony_ci .data_type = QMI_STRUCT, 148962306a36Sopenharmony_ci .elem_len = 1, 149062306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 149162306a36Sopenharmony_ci .array_type = NO_ARRAY, 149262306a36Sopenharmony_ci .tlv_type = 0x02, 149362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01, 149462306a36Sopenharmony_ci resp), 149562306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 149662306a36Sopenharmony_ci }, 149762306a36Sopenharmony_ci { 149862306a36Sopenharmony_ci .data_type = QMI_EOTI, 149962306a36Sopenharmony_ci .array_type = NO_ARRAY, 150062306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 150162306a36Sopenharmony_ci }, 150262306a36Sopenharmony_ci}; 150362306a36Sopenharmony_ci 150462306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { 150562306a36Sopenharmony_ci { 150662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_8_BYTE, 150762306a36Sopenharmony_ci .elem_len = 1, 150862306a36Sopenharmony_ci .elem_size = sizeof(u64), 150962306a36Sopenharmony_ci .array_type = NO_ARRAY, 151062306a36Sopenharmony_ci .tlv_type = 0x01, 151162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr), 151262306a36Sopenharmony_ci }, 151362306a36Sopenharmony_ci { 151462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 151562306a36Sopenharmony_ci .elem_len = 1, 151662306a36Sopenharmony_ci .elem_size = sizeof(u32), 151762306a36Sopenharmony_ci .array_type = NO_ARRAY, 151862306a36Sopenharmony_ci .tlv_type = 0x02, 151962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size), 152062306a36Sopenharmony_ci }, 152162306a36Sopenharmony_ci { 152262306a36Sopenharmony_ci .data_type = QMI_EOTI, 152362306a36Sopenharmony_ci .array_type = NO_ARRAY, 152462306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 152562306a36Sopenharmony_ci }, 152662306a36Sopenharmony_ci}; 152762306a36Sopenharmony_ci 152862306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { 152962306a36Sopenharmony_ci { 153062306a36Sopenharmony_ci .data_type = QMI_STRUCT, 153162306a36Sopenharmony_ci .elem_len = 1, 153262306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 153362306a36Sopenharmony_ci .array_type = NO_ARRAY, 153462306a36Sopenharmony_ci .tlv_type = 0x02, 153562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp), 153662306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 153762306a36Sopenharmony_ci }, 153862306a36Sopenharmony_ci { 153962306a36Sopenharmony_ci .data_type = QMI_EOTI, 154062306a36Sopenharmony_ci .array_type = NO_ARRAY, 154162306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 154262306a36Sopenharmony_ci }, 154362306a36Sopenharmony_ci}; 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { 154662306a36Sopenharmony_ci { 154762306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 154862306a36Sopenharmony_ci .elem_len = 1, 154962306a36Sopenharmony_ci .elem_size = sizeof(u32), 155062306a36Sopenharmony_ci .array_type = NO_ARRAY, 155162306a36Sopenharmony_ci .tlv_type = 0, 155262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 155362306a36Sopenharmony_ci pipe_num), 155462306a36Sopenharmony_ci }, 155562306a36Sopenharmony_ci { 155662306a36Sopenharmony_ci .data_type = QMI_SIGNED_4_BYTE_ENUM, 155762306a36Sopenharmony_ci .elem_len = 1, 155862306a36Sopenharmony_ci .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01), 155962306a36Sopenharmony_ci .array_type = NO_ARRAY, 156062306a36Sopenharmony_ci .tlv_type = 0, 156162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 156262306a36Sopenharmony_ci pipe_dir), 156362306a36Sopenharmony_ci }, 156462306a36Sopenharmony_ci { 156562306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 156662306a36Sopenharmony_ci .elem_len = 1, 156762306a36Sopenharmony_ci .elem_size = sizeof(u32), 156862306a36Sopenharmony_ci .array_type = NO_ARRAY, 156962306a36Sopenharmony_ci .tlv_type = 0, 157062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 157162306a36Sopenharmony_ci nentries), 157262306a36Sopenharmony_ci }, 157362306a36Sopenharmony_ci { 157462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 157562306a36Sopenharmony_ci .elem_len = 1, 157662306a36Sopenharmony_ci .elem_size = sizeof(u32), 157762306a36Sopenharmony_ci .array_type = NO_ARRAY, 157862306a36Sopenharmony_ci .tlv_type = 0, 157962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 158062306a36Sopenharmony_ci nbytes_max), 158162306a36Sopenharmony_ci }, 158262306a36Sopenharmony_ci { 158362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 158462306a36Sopenharmony_ci .elem_len = 1, 158562306a36Sopenharmony_ci .elem_size = sizeof(u32), 158662306a36Sopenharmony_ci .array_type = NO_ARRAY, 158762306a36Sopenharmony_ci .tlv_type = 0, 158862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 158962306a36Sopenharmony_ci flags), 159062306a36Sopenharmony_ci }, 159162306a36Sopenharmony_ci { 159262306a36Sopenharmony_ci .data_type = QMI_EOTI, 159362306a36Sopenharmony_ci .array_type = NO_ARRAY, 159462306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 159562306a36Sopenharmony_ci }, 159662306a36Sopenharmony_ci}; 159762306a36Sopenharmony_ci 159862306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { 159962306a36Sopenharmony_ci { 160062306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 160162306a36Sopenharmony_ci .elem_len = 1, 160262306a36Sopenharmony_ci .elem_size = sizeof(u32), 160362306a36Sopenharmony_ci .array_type = NO_ARRAY, 160462306a36Sopenharmony_ci .tlv_type = 0, 160562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 160662306a36Sopenharmony_ci service_id), 160762306a36Sopenharmony_ci }, 160862306a36Sopenharmony_ci { 160962306a36Sopenharmony_ci .data_type = QMI_SIGNED_4_BYTE_ENUM, 161062306a36Sopenharmony_ci .elem_len = 1, 161162306a36Sopenharmony_ci .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01), 161262306a36Sopenharmony_ci .array_type = NO_ARRAY, 161362306a36Sopenharmony_ci .tlv_type = 0, 161462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 161562306a36Sopenharmony_ci pipe_dir), 161662306a36Sopenharmony_ci }, 161762306a36Sopenharmony_ci { 161862306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 161962306a36Sopenharmony_ci .elem_len = 1, 162062306a36Sopenharmony_ci .elem_size = sizeof(u32), 162162306a36Sopenharmony_ci .array_type = NO_ARRAY, 162262306a36Sopenharmony_ci .tlv_type = 0, 162362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 162462306a36Sopenharmony_ci pipe_num), 162562306a36Sopenharmony_ci }, 162662306a36Sopenharmony_ci { 162762306a36Sopenharmony_ci .data_type = QMI_EOTI, 162862306a36Sopenharmony_ci .array_type = NO_ARRAY, 162962306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 163062306a36Sopenharmony_ci }, 163162306a36Sopenharmony_ci}; 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { 163462306a36Sopenharmony_ci { 163562306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_2_BYTE, 163662306a36Sopenharmony_ci .elem_len = 1, 163762306a36Sopenharmony_ci .elem_size = sizeof(u16), 163862306a36Sopenharmony_ci .array_type = NO_ARRAY, 163962306a36Sopenharmony_ci .tlv_type = 0, 164062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id), 164162306a36Sopenharmony_ci }, 164262306a36Sopenharmony_ci { 164362306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_2_BYTE, 164462306a36Sopenharmony_ci .elem_len = 1, 164562306a36Sopenharmony_ci .elem_size = sizeof(u16), 164662306a36Sopenharmony_ci .array_type = NO_ARRAY, 164762306a36Sopenharmony_ci .tlv_type = 0, 164862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, 164962306a36Sopenharmony_ci offset), 165062306a36Sopenharmony_ci }, 165162306a36Sopenharmony_ci { 165262306a36Sopenharmony_ci .data_type = QMI_EOTI, 165362306a36Sopenharmony_ci .array_type = QMI_COMMON_TLV_TYPE, 165462306a36Sopenharmony_ci }, 165562306a36Sopenharmony_ci}; 165662306a36Sopenharmony_ci 165762306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei[] = { 165862306a36Sopenharmony_ci { 165962306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 166062306a36Sopenharmony_ci .elem_len = 1, 166162306a36Sopenharmony_ci .elem_size = sizeof(u32), 166262306a36Sopenharmony_ci .array_type = NO_ARRAY, 166362306a36Sopenharmony_ci .tlv_type = 0, 166462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01, 166562306a36Sopenharmony_ci addr), 166662306a36Sopenharmony_ci }, 166762306a36Sopenharmony_ci { 166862306a36Sopenharmony_ci .data_type = QMI_EOTI, 166962306a36Sopenharmony_ci .array_type = NO_ARRAY, 167062306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 167162306a36Sopenharmony_ci }, 167262306a36Sopenharmony_ci}; 167362306a36Sopenharmony_ci 167462306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { 167562306a36Sopenharmony_ci { 167662306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_4_BYTE, 167762306a36Sopenharmony_ci .elem_len = 1, 167862306a36Sopenharmony_ci .elem_size = sizeof(u32), 167962306a36Sopenharmony_ci .array_type = NO_ARRAY, 168062306a36Sopenharmony_ci .tlv_type = 0x01, 168162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 168262306a36Sopenharmony_ci mode), 168362306a36Sopenharmony_ci }, 168462306a36Sopenharmony_ci { 168562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 168662306a36Sopenharmony_ci .elem_len = 1, 168762306a36Sopenharmony_ci .elem_size = sizeof(u8), 168862306a36Sopenharmony_ci .array_type = NO_ARRAY, 168962306a36Sopenharmony_ci .tlv_type = 0x10, 169062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 169162306a36Sopenharmony_ci hw_debug_valid), 169262306a36Sopenharmony_ci }, 169362306a36Sopenharmony_ci { 169462306a36Sopenharmony_ci .data_type = QMI_UNSIGNED_1_BYTE, 169562306a36Sopenharmony_ci .elem_len = 1, 169662306a36Sopenharmony_ci .elem_size = sizeof(u8), 169762306a36Sopenharmony_ci .array_type = NO_ARRAY, 169862306a36Sopenharmony_ci .tlv_type = 0x10, 169962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 170062306a36Sopenharmony_ci hw_debug), 170162306a36Sopenharmony_ci }, 170262306a36Sopenharmony_ci { 170362306a36Sopenharmony_ci .data_type = QMI_EOTI, 170462306a36Sopenharmony_ci .array_type = NO_ARRAY, 170562306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 170662306a36Sopenharmony_ci }, 170762306a36Sopenharmony_ci}; 170862306a36Sopenharmony_ci 170962306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { 171062306a36Sopenharmony_ci { 171162306a36Sopenharmony_ci .data_type = QMI_STRUCT, 171262306a36Sopenharmony_ci .elem_len = 1, 171362306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 171462306a36Sopenharmony_ci .array_type = NO_ARRAY, 171562306a36Sopenharmony_ci .tlv_type = 0x02, 171662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01, 171762306a36Sopenharmony_ci resp), 171862306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 171962306a36Sopenharmony_ci }, 172062306a36Sopenharmony_ci { 172162306a36Sopenharmony_ci .data_type = QMI_EOTI, 172262306a36Sopenharmony_ci .array_type = NO_ARRAY, 172362306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 172462306a36Sopenharmony_ci }, 172562306a36Sopenharmony_ci}; 172662306a36Sopenharmony_ci 172762306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { 172862306a36Sopenharmony_ci { 172962306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 173062306a36Sopenharmony_ci .elem_len = 1, 173162306a36Sopenharmony_ci .elem_size = sizeof(u8), 173262306a36Sopenharmony_ci .array_type = NO_ARRAY, 173362306a36Sopenharmony_ci .tlv_type = 0x10, 173462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 173562306a36Sopenharmony_ci host_version_valid), 173662306a36Sopenharmony_ci }, 173762306a36Sopenharmony_ci { 173862306a36Sopenharmony_ci .data_type = QMI_STRING, 173962306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1, 174062306a36Sopenharmony_ci .elem_size = sizeof(char), 174162306a36Sopenharmony_ci .array_type = NO_ARRAY, 174262306a36Sopenharmony_ci .tlv_type = 0x10, 174362306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 174462306a36Sopenharmony_ci host_version), 174562306a36Sopenharmony_ci }, 174662306a36Sopenharmony_ci { 174762306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 174862306a36Sopenharmony_ci .elem_len = 1, 174962306a36Sopenharmony_ci .elem_size = sizeof(u8), 175062306a36Sopenharmony_ci .array_type = NO_ARRAY, 175162306a36Sopenharmony_ci .tlv_type = 0x11, 175262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 175362306a36Sopenharmony_ci tgt_cfg_valid), 175462306a36Sopenharmony_ci }, 175562306a36Sopenharmony_ci { 175662306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 175762306a36Sopenharmony_ci .elem_len = 1, 175862306a36Sopenharmony_ci .elem_size = sizeof(u8), 175962306a36Sopenharmony_ci .array_type = NO_ARRAY, 176062306a36Sopenharmony_ci .tlv_type = 0x11, 176162306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 176262306a36Sopenharmony_ci tgt_cfg_len), 176362306a36Sopenharmony_ci }, 176462306a36Sopenharmony_ci { 176562306a36Sopenharmony_ci .data_type = QMI_STRUCT, 176662306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_NUM_CE_V01, 176762306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01), 176862306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 176962306a36Sopenharmony_ci .tlv_type = 0x11, 177062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 177162306a36Sopenharmony_ci tgt_cfg), 177262306a36Sopenharmony_ci .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei, 177362306a36Sopenharmony_ci }, 177462306a36Sopenharmony_ci { 177562306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 177662306a36Sopenharmony_ci .elem_len = 1, 177762306a36Sopenharmony_ci .elem_size = sizeof(u8), 177862306a36Sopenharmony_ci .array_type = NO_ARRAY, 177962306a36Sopenharmony_ci .tlv_type = 0x12, 178062306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 178162306a36Sopenharmony_ci svc_cfg_valid), 178262306a36Sopenharmony_ci }, 178362306a36Sopenharmony_ci { 178462306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 178562306a36Sopenharmony_ci .elem_len = 1, 178662306a36Sopenharmony_ci .elem_size = sizeof(u8), 178762306a36Sopenharmony_ci .array_type = NO_ARRAY, 178862306a36Sopenharmony_ci .tlv_type = 0x12, 178962306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 179062306a36Sopenharmony_ci svc_cfg_len), 179162306a36Sopenharmony_ci }, 179262306a36Sopenharmony_ci { 179362306a36Sopenharmony_ci .data_type = QMI_STRUCT, 179462306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01, 179562306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01), 179662306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 179762306a36Sopenharmony_ci .tlv_type = 0x12, 179862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 179962306a36Sopenharmony_ci svc_cfg), 180062306a36Sopenharmony_ci .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei, 180162306a36Sopenharmony_ci }, 180262306a36Sopenharmony_ci { 180362306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 180462306a36Sopenharmony_ci .elem_len = 1, 180562306a36Sopenharmony_ci .elem_size = sizeof(u8), 180662306a36Sopenharmony_ci .array_type = NO_ARRAY, 180762306a36Sopenharmony_ci .tlv_type = 0x13, 180862306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 180962306a36Sopenharmony_ci shadow_reg_valid), 181062306a36Sopenharmony_ci }, 181162306a36Sopenharmony_ci { 181262306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 181362306a36Sopenharmony_ci .elem_len = 1, 181462306a36Sopenharmony_ci .elem_size = sizeof(u8), 181562306a36Sopenharmony_ci .array_type = NO_ARRAY, 181662306a36Sopenharmony_ci .tlv_type = 0x13, 181762306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 181862306a36Sopenharmony_ci shadow_reg_len), 181962306a36Sopenharmony_ci }, 182062306a36Sopenharmony_ci { 182162306a36Sopenharmony_ci .data_type = QMI_STRUCT, 182262306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01, 182362306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01), 182462306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 182562306a36Sopenharmony_ci .tlv_type = 0x13, 182662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 182762306a36Sopenharmony_ci shadow_reg), 182862306a36Sopenharmony_ci .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei, 182962306a36Sopenharmony_ci }, 183062306a36Sopenharmony_ci { 183162306a36Sopenharmony_ci .data_type = QMI_OPT_FLAG, 183262306a36Sopenharmony_ci .elem_len = 1, 183362306a36Sopenharmony_ci .elem_size = sizeof(u8), 183462306a36Sopenharmony_ci .array_type = NO_ARRAY, 183562306a36Sopenharmony_ci .tlv_type = 0x17, 183662306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 183762306a36Sopenharmony_ci shadow_reg_v3_valid), 183862306a36Sopenharmony_ci }, 183962306a36Sopenharmony_ci { 184062306a36Sopenharmony_ci .data_type = QMI_DATA_LEN, 184162306a36Sopenharmony_ci .elem_len = 1, 184262306a36Sopenharmony_ci .elem_size = sizeof(u8), 184362306a36Sopenharmony_ci .array_type = NO_ARRAY, 184462306a36Sopenharmony_ci .tlv_type = 0x17, 184562306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 184662306a36Sopenharmony_ci shadow_reg_v3_len), 184762306a36Sopenharmony_ci }, 184862306a36Sopenharmony_ci { 184962306a36Sopenharmony_ci .data_type = QMI_STRUCT, 185062306a36Sopenharmony_ci .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01, 185162306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01), 185262306a36Sopenharmony_ci .array_type = VAR_LEN_ARRAY, 185362306a36Sopenharmony_ci .tlv_type = 0x17, 185462306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 185562306a36Sopenharmony_ci shadow_reg_v3), 185662306a36Sopenharmony_ci .ei_array = qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei, 185762306a36Sopenharmony_ci }, 185862306a36Sopenharmony_ci { 185962306a36Sopenharmony_ci .data_type = QMI_EOTI, 186062306a36Sopenharmony_ci .array_type = NO_ARRAY, 186162306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 186262306a36Sopenharmony_ci }, 186362306a36Sopenharmony_ci}; 186462306a36Sopenharmony_ci 186562306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { 186662306a36Sopenharmony_ci { 186762306a36Sopenharmony_ci .data_type = QMI_STRUCT, 186862306a36Sopenharmony_ci .elem_len = 1, 186962306a36Sopenharmony_ci .elem_size = sizeof(struct qmi_response_type_v01), 187062306a36Sopenharmony_ci .array_type = NO_ARRAY, 187162306a36Sopenharmony_ci .tlv_type = 0x02, 187262306a36Sopenharmony_ci .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp), 187362306a36Sopenharmony_ci .ei_array = qmi_response_type_v01_ei, 187462306a36Sopenharmony_ci }, 187562306a36Sopenharmony_ci { 187662306a36Sopenharmony_ci .data_type = QMI_EOTI, 187762306a36Sopenharmony_ci .array_type = NO_ARRAY, 187862306a36Sopenharmony_ci .tlv_type = QMI_COMMON_TLV_TYPE, 187962306a36Sopenharmony_ci }, 188062306a36Sopenharmony_ci}; 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { 188362306a36Sopenharmony_ci { 188462306a36Sopenharmony_ci .data_type = QMI_EOTI, 188562306a36Sopenharmony_ci .array_type = NO_ARRAY, 188662306a36Sopenharmony_ci }, 188762306a36Sopenharmony_ci}; 188862306a36Sopenharmony_ci 188962306a36Sopenharmony_cistatic struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { 189062306a36Sopenharmony_ci { 189162306a36Sopenharmony_ci .data_type = QMI_EOTI, 189262306a36Sopenharmony_ci .array_type = NO_ARRAY, 189362306a36Sopenharmony_ci }, 189462306a36Sopenharmony_ci}; 189562306a36Sopenharmony_ci 189662306a36Sopenharmony_cistatic void ath12k_host_cap_parse_mlo(struct qmi_wlanfw_host_cap_req_msg_v01 *req) 189762306a36Sopenharmony_ci{ 189862306a36Sopenharmony_ci req->mlo_capable_valid = 1; 189962306a36Sopenharmony_ci req->mlo_capable = 1; 190062306a36Sopenharmony_ci req->mlo_chip_id_valid = 1; 190162306a36Sopenharmony_ci req->mlo_chip_id = 0; 190262306a36Sopenharmony_ci req->mlo_group_id_valid = 1; 190362306a36Sopenharmony_ci req->mlo_group_id = 0; 190462306a36Sopenharmony_ci req->max_mlo_peer_valid = 1; 190562306a36Sopenharmony_ci /* Max peer number generally won't change for the same device 190662306a36Sopenharmony_ci * but needs to be synced with host driver. 190762306a36Sopenharmony_ci */ 190862306a36Sopenharmony_ci req->max_mlo_peer = 32; 190962306a36Sopenharmony_ci req->mlo_num_chips_valid = 1; 191062306a36Sopenharmony_ci req->mlo_num_chips = 1; 191162306a36Sopenharmony_ci req->mlo_chip_info_valid = 1; 191262306a36Sopenharmony_ci req->mlo_chip_info[0].chip_id = 0; 191362306a36Sopenharmony_ci req->mlo_chip_info[0].num_local_links = 2; 191462306a36Sopenharmony_ci req->mlo_chip_info[0].hw_link_id[0] = 0; 191562306a36Sopenharmony_ci req->mlo_chip_info[0].hw_link_id[1] = 1; 191662306a36Sopenharmony_ci req->mlo_chip_info[0].valid_mlo_link_id[0] = 1; 191762306a36Sopenharmony_ci req->mlo_chip_info[0].valid_mlo_link_id[1] = 1; 191862306a36Sopenharmony_ci} 191962306a36Sopenharmony_ci 192062306a36Sopenharmony_cistatic int ath12k_qmi_host_cap_send(struct ath12k_base *ab) 192162306a36Sopenharmony_ci{ 192262306a36Sopenharmony_ci struct qmi_wlanfw_host_cap_req_msg_v01 req; 192362306a36Sopenharmony_ci struct qmi_wlanfw_host_cap_resp_msg_v01 resp; 192462306a36Sopenharmony_ci struct qmi_txn txn = {}; 192562306a36Sopenharmony_ci int ret = 0; 192662306a36Sopenharmony_ci 192762306a36Sopenharmony_ci memset(&req, 0, sizeof(req)); 192862306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 192962306a36Sopenharmony_ci 193062306a36Sopenharmony_ci req.num_clients_valid = 1; 193162306a36Sopenharmony_ci req.num_clients = 1; 193262306a36Sopenharmony_ci req.mem_cfg_mode = ab->qmi.target_mem_mode; 193362306a36Sopenharmony_ci req.mem_cfg_mode_valid = 1; 193462306a36Sopenharmony_ci req.bdf_support_valid = 1; 193562306a36Sopenharmony_ci req.bdf_support = 1; 193662306a36Sopenharmony_ci 193762306a36Sopenharmony_ci req.m3_support_valid = 1; 193862306a36Sopenharmony_ci req.m3_support = 1; 193962306a36Sopenharmony_ci req.m3_cache_support_valid = 1; 194062306a36Sopenharmony_ci req.m3_cache_support = 1; 194162306a36Sopenharmony_ci 194262306a36Sopenharmony_ci req.cal_done_valid = 1; 194362306a36Sopenharmony_ci req.cal_done = ab->qmi.cal_done; 194462306a36Sopenharmony_ci 194562306a36Sopenharmony_ci if (ab->hw_params->qmi_cnss_feature_bitmap) { 194662306a36Sopenharmony_ci req.feature_list_valid = 1; 194762306a36Sopenharmony_ci req.feature_list = ab->hw_params->qmi_cnss_feature_bitmap; 194862306a36Sopenharmony_ci } 194962306a36Sopenharmony_ci 195062306a36Sopenharmony_ci /* BRINGUP: here we are piggybacking a lot of stuff using 195162306a36Sopenharmony_ci * internal_sleep_clock, should it be split? 195262306a36Sopenharmony_ci */ 195362306a36Sopenharmony_ci if (ab->hw_params->internal_sleep_clock) { 195462306a36Sopenharmony_ci req.nm_modem_valid = 1; 195562306a36Sopenharmony_ci 195662306a36Sopenharmony_ci /* Notify firmware that this is non-qualcomm platform. */ 195762306a36Sopenharmony_ci req.nm_modem |= HOST_CSTATE_BIT; 195862306a36Sopenharmony_ci 195962306a36Sopenharmony_ci /* Notify firmware about the sleep clock selection, 196062306a36Sopenharmony_ci * nm_modem_bit[1] is used for this purpose. Host driver on 196162306a36Sopenharmony_ci * non-qualcomm platforms should select internal sleep 196262306a36Sopenharmony_ci * clock. 196362306a36Sopenharmony_ci */ 196462306a36Sopenharmony_ci req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT; 196562306a36Sopenharmony_ci req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET; 196662306a36Sopenharmony_ci 196762306a36Sopenharmony_ci ath12k_host_cap_parse_mlo(&req); 196862306a36Sopenharmony_ci } 196962306a36Sopenharmony_ci 197062306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 197162306a36Sopenharmony_ci qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp); 197262306a36Sopenharmony_ci if (ret < 0) 197362306a36Sopenharmony_ci goto out; 197462306a36Sopenharmony_ci 197562306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 197662306a36Sopenharmony_ci QMI_WLANFW_HOST_CAP_REQ_V01, 197762306a36Sopenharmony_ci QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN, 197862306a36Sopenharmony_ci qmi_wlanfw_host_cap_req_msg_v01_ei, &req); 197962306a36Sopenharmony_ci if (ret < 0) { 198062306a36Sopenharmony_ci ath12k_warn(ab, "Failed to send host capability request,err = %d\n", ret); 198162306a36Sopenharmony_ci goto out; 198262306a36Sopenharmony_ci } 198362306a36Sopenharmony_ci 198462306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 198562306a36Sopenharmony_ci if (ret < 0) 198662306a36Sopenharmony_ci goto out; 198762306a36Sopenharmony_ci 198862306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 198962306a36Sopenharmony_ci ath12k_warn(ab, "Host capability request failed, result: %d, err: %d\n", 199062306a36Sopenharmony_ci resp.resp.result, resp.resp.error); 199162306a36Sopenharmony_ci ret = -EINVAL; 199262306a36Sopenharmony_ci goto out; 199362306a36Sopenharmony_ci } 199462306a36Sopenharmony_ci 199562306a36Sopenharmony_ciout: 199662306a36Sopenharmony_ci return ret; 199762306a36Sopenharmony_ci} 199862306a36Sopenharmony_ci 199962306a36Sopenharmony_cistatic int ath12k_qmi_fw_ind_register_send(struct ath12k_base *ab) 200062306a36Sopenharmony_ci{ 200162306a36Sopenharmony_ci struct qmi_wlanfw_ind_register_req_msg_v01 *req; 200262306a36Sopenharmony_ci struct qmi_wlanfw_ind_register_resp_msg_v01 *resp; 200362306a36Sopenharmony_ci struct qmi_handle *handle = &ab->qmi.handle; 200462306a36Sopenharmony_ci struct qmi_txn txn; 200562306a36Sopenharmony_ci int ret; 200662306a36Sopenharmony_ci 200762306a36Sopenharmony_ci req = kzalloc(sizeof(*req), GFP_KERNEL); 200862306a36Sopenharmony_ci if (!req) 200962306a36Sopenharmony_ci return -ENOMEM; 201062306a36Sopenharmony_ci 201162306a36Sopenharmony_ci resp = kzalloc(sizeof(*resp), GFP_KERNEL); 201262306a36Sopenharmony_ci if (!resp) { 201362306a36Sopenharmony_ci ret = -ENOMEM; 201462306a36Sopenharmony_ci goto resp_out; 201562306a36Sopenharmony_ci } 201662306a36Sopenharmony_ci 201762306a36Sopenharmony_ci req->client_id_valid = 1; 201862306a36Sopenharmony_ci req->client_id = QMI_WLANFW_CLIENT_ID; 201962306a36Sopenharmony_ci req->fw_ready_enable_valid = 1; 202062306a36Sopenharmony_ci req->fw_ready_enable = 1; 202162306a36Sopenharmony_ci req->request_mem_enable_valid = 1; 202262306a36Sopenharmony_ci req->request_mem_enable = 1; 202362306a36Sopenharmony_ci req->fw_mem_ready_enable_valid = 1; 202462306a36Sopenharmony_ci req->fw_mem_ready_enable = 1; 202562306a36Sopenharmony_ci req->cal_done_enable_valid = 1; 202662306a36Sopenharmony_ci req->cal_done_enable = 1; 202762306a36Sopenharmony_ci req->fw_init_done_enable_valid = 1; 202862306a36Sopenharmony_ci req->fw_init_done_enable = 1; 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_ci req->pin_connect_result_enable_valid = 0; 203162306a36Sopenharmony_ci req->pin_connect_result_enable = 0; 203262306a36Sopenharmony_ci 203362306a36Sopenharmony_ci ret = qmi_txn_init(handle, &txn, 203462306a36Sopenharmony_ci qmi_wlanfw_ind_register_resp_msg_v01_ei, resp); 203562306a36Sopenharmony_ci if (ret < 0) 203662306a36Sopenharmony_ci goto out; 203762306a36Sopenharmony_ci 203862306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 203962306a36Sopenharmony_ci QMI_WLANFW_IND_REGISTER_REQ_V01, 204062306a36Sopenharmony_ci QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN, 204162306a36Sopenharmony_ci qmi_wlanfw_ind_register_req_msg_v01_ei, req); 204262306a36Sopenharmony_ci if (ret < 0) { 204362306a36Sopenharmony_ci ath12k_warn(ab, "Failed to send indication register request, err = %d\n", 204462306a36Sopenharmony_ci ret); 204562306a36Sopenharmony_ci goto out; 204662306a36Sopenharmony_ci } 204762306a36Sopenharmony_ci 204862306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 204962306a36Sopenharmony_ci if (ret < 0) { 205062306a36Sopenharmony_ci ath12k_warn(ab, "failed to register fw indication %d\n", ret); 205162306a36Sopenharmony_ci goto out; 205262306a36Sopenharmony_ci } 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_ci if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { 205562306a36Sopenharmony_ci ath12k_warn(ab, "FW Ind register request failed, result: %d, err: %d\n", 205662306a36Sopenharmony_ci resp->resp.result, resp->resp.error); 205762306a36Sopenharmony_ci ret = -EINVAL; 205862306a36Sopenharmony_ci goto out; 205962306a36Sopenharmony_ci } 206062306a36Sopenharmony_ci 206162306a36Sopenharmony_ciout: 206262306a36Sopenharmony_ci kfree(resp); 206362306a36Sopenharmony_ciresp_out: 206462306a36Sopenharmony_ci kfree(req); 206562306a36Sopenharmony_ci return ret; 206662306a36Sopenharmony_ci} 206762306a36Sopenharmony_ci 206862306a36Sopenharmony_cistatic int ath12k_qmi_respond_fw_mem_request(struct ath12k_base *ab) 206962306a36Sopenharmony_ci{ 207062306a36Sopenharmony_ci struct qmi_wlanfw_respond_mem_req_msg_v01 *req; 207162306a36Sopenharmony_ci struct qmi_wlanfw_respond_mem_resp_msg_v01 resp; 207262306a36Sopenharmony_ci struct qmi_txn txn = {}; 207362306a36Sopenharmony_ci int ret = 0, i; 207462306a36Sopenharmony_ci bool delayed; 207562306a36Sopenharmony_ci 207662306a36Sopenharmony_ci req = kzalloc(sizeof(*req), GFP_KERNEL); 207762306a36Sopenharmony_ci if (!req) 207862306a36Sopenharmony_ci return -ENOMEM; 207962306a36Sopenharmony_ci 208062306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 208162306a36Sopenharmony_ci 208262306a36Sopenharmony_ci /* Some targets by default request a block of big contiguous 208362306a36Sopenharmony_ci * DMA memory, it's hard to allocate from kernel. So host returns 208462306a36Sopenharmony_ci * failure to firmware and firmware then request multiple blocks of 208562306a36Sopenharmony_ci * small chunk size memory. 208662306a36Sopenharmony_ci */ 208762306a36Sopenharmony_ci if (ab->qmi.target_mem_delayed) { 208862306a36Sopenharmony_ci delayed = true; 208962306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi delays mem_request %d\n", 209062306a36Sopenharmony_ci ab->qmi.mem_seg_count); 209162306a36Sopenharmony_ci memset(req, 0, sizeof(*req)); 209262306a36Sopenharmony_ci } else { 209362306a36Sopenharmony_ci delayed = false; 209462306a36Sopenharmony_ci req->mem_seg_len = ab->qmi.mem_seg_count; 209562306a36Sopenharmony_ci for (i = 0; i < req->mem_seg_len ; i++) { 209662306a36Sopenharmony_ci req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr; 209762306a36Sopenharmony_ci req->mem_seg[i].size = ab->qmi.target_mem[i].size; 209862306a36Sopenharmony_ci req->mem_seg[i].type = ab->qmi.target_mem[i].type; 209962306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, 210062306a36Sopenharmony_ci "qmi req mem_seg[%d] %pad %u %u\n", i, 210162306a36Sopenharmony_ci &ab->qmi.target_mem[i].paddr, 210262306a36Sopenharmony_ci ab->qmi.target_mem[i].size, 210362306a36Sopenharmony_ci ab->qmi.target_mem[i].type); 210462306a36Sopenharmony_ci } 210562306a36Sopenharmony_ci } 210662306a36Sopenharmony_ci 210762306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 210862306a36Sopenharmony_ci qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp); 210962306a36Sopenharmony_ci if (ret < 0) 211062306a36Sopenharmony_ci goto out; 211162306a36Sopenharmony_ci 211262306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 211362306a36Sopenharmony_ci QMI_WLANFW_RESPOND_MEM_REQ_V01, 211462306a36Sopenharmony_ci QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN, 211562306a36Sopenharmony_ci qmi_wlanfw_respond_mem_req_msg_v01_ei, req); 211662306a36Sopenharmony_ci if (ret < 0) { 211762306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to respond memory request, err = %d\n", 211862306a36Sopenharmony_ci ret); 211962306a36Sopenharmony_ci goto out; 212062306a36Sopenharmony_ci } 212162306a36Sopenharmony_ci 212262306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 212362306a36Sopenharmony_ci if (ret < 0) { 212462306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed memory request, err = %d\n", ret); 212562306a36Sopenharmony_ci goto out; 212662306a36Sopenharmony_ci } 212762306a36Sopenharmony_ci 212862306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 212962306a36Sopenharmony_ci /* the error response is expected when 213062306a36Sopenharmony_ci * target_mem_delayed is true. 213162306a36Sopenharmony_ci */ 213262306a36Sopenharmony_ci if (delayed && resp.resp.error == 0) 213362306a36Sopenharmony_ci goto out; 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci ath12k_warn(ab, "Respond mem req failed, result: %d, err: %d\n", 213662306a36Sopenharmony_ci resp.resp.result, resp.resp.error); 213762306a36Sopenharmony_ci ret = -EINVAL; 213862306a36Sopenharmony_ci goto out; 213962306a36Sopenharmony_ci } 214062306a36Sopenharmony_ciout: 214162306a36Sopenharmony_ci kfree(req); 214262306a36Sopenharmony_ci return ret; 214362306a36Sopenharmony_ci} 214462306a36Sopenharmony_ci 214562306a36Sopenharmony_cistatic void ath12k_qmi_free_target_mem_chunk(struct ath12k_base *ab) 214662306a36Sopenharmony_ci{ 214762306a36Sopenharmony_ci int i; 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci for (i = 0; i < ab->qmi.mem_seg_count; i++) { 215062306a36Sopenharmony_ci if (!ab->qmi.target_mem[i].v.addr) 215162306a36Sopenharmony_ci continue; 215262306a36Sopenharmony_ci dma_free_coherent(ab->dev, 215362306a36Sopenharmony_ci ab->qmi.target_mem[i].size, 215462306a36Sopenharmony_ci ab->qmi.target_mem[i].v.addr, 215562306a36Sopenharmony_ci ab->qmi.target_mem[i].paddr); 215662306a36Sopenharmony_ci ab->qmi.target_mem[i].v.addr = NULL; 215762306a36Sopenharmony_ci } 215862306a36Sopenharmony_ci} 215962306a36Sopenharmony_ci 216062306a36Sopenharmony_cistatic int ath12k_qmi_alloc_target_mem_chunk(struct ath12k_base *ab) 216162306a36Sopenharmony_ci{ 216262306a36Sopenharmony_ci int i; 216362306a36Sopenharmony_ci struct target_mem_chunk *chunk; 216462306a36Sopenharmony_ci 216562306a36Sopenharmony_ci ab->qmi.target_mem_delayed = false; 216662306a36Sopenharmony_ci 216762306a36Sopenharmony_ci for (i = 0; i < ab->qmi.mem_seg_count; i++) { 216862306a36Sopenharmony_ci chunk = &ab->qmi.target_mem[i]; 216962306a36Sopenharmony_ci 217062306a36Sopenharmony_ci /* Allocate memory for the region and the functionality supported 217162306a36Sopenharmony_ci * on the host. For the non-supported memory region, host does not 217262306a36Sopenharmony_ci * allocate memory, assigns NULL and FW will handle this without crashing. 217362306a36Sopenharmony_ci */ 217462306a36Sopenharmony_ci switch (chunk->type) { 217562306a36Sopenharmony_ci case HOST_DDR_REGION_TYPE: 217662306a36Sopenharmony_ci case M3_DUMP_REGION_TYPE: 217762306a36Sopenharmony_ci case PAGEABLE_MEM_REGION_TYPE: 217862306a36Sopenharmony_ci case CALDB_MEM_REGION_TYPE: 217962306a36Sopenharmony_ci chunk->v.addr = dma_alloc_coherent(ab->dev, 218062306a36Sopenharmony_ci chunk->size, 218162306a36Sopenharmony_ci &chunk->paddr, 218262306a36Sopenharmony_ci GFP_KERNEL | __GFP_NOWARN); 218362306a36Sopenharmony_ci if (!chunk->v.addr) { 218462306a36Sopenharmony_ci if (chunk->size > ATH12K_QMI_MAX_CHUNK_SIZE) { 218562306a36Sopenharmony_ci ab->qmi.target_mem_delayed = true; 218662306a36Sopenharmony_ci ath12k_warn(ab, 218762306a36Sopenharmony_ci "qmi dma allocation failed (%d B type %u), will try later with small size\n", 218862306a36Sopenharmony_ci chunk->size, 218962306a36Sopenharmony_ci chunk->type); 219062306a36Sopenharmony_ci ath12k_qmi_free_target_mem_chunk(ab); 219162306a36Sopenharmony_ci return 0; 219262306a36Sopenharmony_ci } 219362306a36Sopenharmony_ci ath12k_warn(ab, "memory allocation failure for %u size: %d\n", 219462306a36Sopenharmony_ci chunk->type, chunk->size); 219562306a36Sopenharmony_ci return -ENOMEM; 219662306a36Sopenharmony_ci } 219762306a36Sopenharmony_ci break; 219862306a36Sopenharmony_ci default: 219962306a36Sopenharmony_ci ath12k_warn(ab, "memory type %u not supported\n", 220062306a36Sopenharmony_ci chunk->type); 220162306a36Sopenharmony_ci chunk->paddr = 0; 220262306a36Sopenharmony_ci chunk->v.addr = NULL; 220362306a36Sopenharmony_ci break; 220462306a36Sopenharmony_ci } 220562306a36Sopenharmony_ci } 220662306a36Sopenharmony_ci return 0; 220762306a36Sopenharmony_ci} 220862306a36Sopenharmony_ci 220962306a36Sopenharmony_cistatic int ath12k_qmi_request_target_cap(struct ath12k_base *ab) 221062306a36Sopenharmony_ci{ 221162306a36Sopenharmony_ci struct qmi_wlanfw_cap_req_msg_v01 req; 221262306a36Sopenharmony_ci struct qmi_wlanfw_cap_resp_msg_v01 resp; 221362306a36Sopenharmony_ci struct qmi_txn txn = {}; 221462306a36Sopenharmony_ci unsigned int board_id = ATH12K_BOARD_ID_DEFAULT; 221562306a36Sopenharmony_ci int ret = 0; 221662306a36Sopenharmony_ci int i; 221762306a36Sopenharmony_ci 221862306a36Sopenharmony_ci memset(&req, 0, sizeof(req)); 221962306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 222062306a36Sopenharmony_ci 222162306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 222262306a36Sopenharmony_ci qmi_wlanfw_cap_resp_msg_v01_ei, &resp); 222362306a36Sopenharmony_ci if (ret < 0) 222462306a36Sopenharmony_ci goto out; 222562306a36Sopenharmony_ci 222662306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 222762306a36Sopenharmony_ci QMI_WLANFW_CAP_REQ_V01, 222862306a36Sopenharmony_ci QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN, 222962306a36Sopenharmony_ci qmi_wlanfw_cap_req_msg_v01_ei, &req); 223062306a36Sopenharmony_ci if (ret < 0) { 223162306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send target cap request, err = %d\n", 223262306a36Sopenharmony_ci ret); 223362306a36Sopenharmony_ci goto out; 223462306a36Sopenharmony_ci } 223562306a36Sopenharmony_ci 223662306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 223762306a36Sopenharmony_ci if (ret < 0) { 223862306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed target cap request %d\n", ret); 223962306a36Sopenharmony_ci goto out; 224062306a36Sopenharmony_ci } 224162306a36Sopenharmony_ci 224262306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 224362306a36Sopenharmony_ci ath12k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n", 224462306a36Sopenharmony_ci resp.resp.result, resp.resp.error); 224562306a36Sopenharmony_ci ret = -EINVAL; 224662306a36Sopenharmony_ci goto out; 224762306a36Sopenharmony_ci } 224862306a36Sopenharmony_ci 224962306a36Sopenharmony_ci if (resp.chip_info_valid) { 225062306a36Sopenharmony_ci ab->qmi.target.chip_id = resp.chip_info.chip_id; 225162306a36Sopenharmony_ci ab->qmi.target.chip_family = resp.chip_info.chip_family; 225262306a36Sopenharmony_ci } 225362306a36Sopenharmony_ci 225462306a36Sopenharmony_ci if (resp.board_info_valid) 225562306a36Sopenharmony_ci ab->qmi.target.board_id = resp.board_info.board_id; 225662306a36Sopenharmony_ci else 225762306a36Sopenharmony_ci ab->qmi.target.board_id = board_id; 225862306a36Sopenharmony_ci 225962306a36Sopenharmony_ci if (resp.soc_info_valid) 226062306a36Sopenharmony_ci ab->qmi.target.soc_id = resp.soc_info.soc_id; 226162306a36Sopenharmony_ci 226262306a36Sopenharmony_ci if (resp.fw_version_info_valid) { 226362306a36Sopenharmony_ci ab->qmi.target.fw_version = resp.fw_version_info.fw_version; 226462306a36Sopenharmony_ci strscpy(ab->qmi.target.fw_build_timestamp, 226562306a36Sopenharmony_ci resp.fw_version_info.fw_build_timestamp, 226662306a36Sopenharmony_ci sizeof(ab->qmi.target.fw_build_timestamp)); 226762306a36Sopenharmony_ci } 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci if (resp.fw_build_id_valid) 227062306a36Sopenharmony_ci strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id, 227162306a36Sopenharmony_ci sizeof(ab->qmi.target.fw_build_id)); 227262306a36Sopenharmony_ci 227362306a36Sopenharmony_ci if (resp.dev_mem_info_valid) { 227462306a36Sopenharmony_ci for (i = 0; i < ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01; i++) { 227562306a36Sopenharmony_ci ab->qmi.dev_mem[i].start = 227662306a36Sopenharmony_ci resp.dev_mem[i].start; 227762306a36Sopenharmony_ci ab->qmi.dev_mem[i].size = 227862306a36Sopenharmony_ci resp.dev_mem[i].size; 227962306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, 228062306a36Sopenharmony_ci "devmem [%d] start ox%llx size %llu\n", i, 228162306a36Sopenharmony_ci ab->qmi.dev_mem[i].start, 228262306a36Sopenharmony_ci ab->qmi.dev_mem[i].size); 228362306a36Sopenharmony_ci } 228462306a36Sopenharmony_ci } 228562306a36Sopenharmony_ci 228662306a36Sopenharmony_ci if (resp.eeprom_caldata_read_timeout_valid) { 228762306a36Sopenharmony_ci ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout; 228862306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n"); 228962306a36Sopenharmony_ci } 229062306a36Sopenharmony_ci 229162306a36Sopenharmony_ci ath12k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n", 229262306a36Sopenharmony_ci ab->qmi.target.chip_id, ab->qmi.target.chip_family, 229362306a36Sopenharmony_ci ab->qmi.target.board_id, ab->qmi.target.soc_id); 229462306a36Sopenharmony_ci 229562306a36Sopenharmony_ci ath12k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s", 229662306a36Sopenharmony_ci ab->qmi.target.fw_version, 229762306a36Sopenharmony_ci ab->qmi.target.fw_build_timestamp, 229862306a36Sopenharmony_ci ab->qmi.target.fw_build_id); 229962306a36Sopenharmony_ci 230062306a36Sopenharmony_ciout: 230162306a36Sopenharmony_ci return ret; 230262306a36Sopenharmony_ci} 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_cistatic int ath12k_qmi_load_file_target_mem(struct ath12k_base *ab, 230562306a36Sopenharmony_ci const u8 *data, u32 len, u8 type) 230662306a36Sopenharmony_ci{ 230762306a36Sopenharmony_ci struct qmi_wlanfw_bdf_download_req_msg_v01 *req; 230862306a36Sopenharmony_ci struct qmi_wlanfw_bdf_download_resp_msg_v01 resp; 230962306a36Sopenharmony_ci struct qmi_txn txn = {}; 231062306a36Sopenharmony_ci const u8 *temp = data; 231162306a36Sopenharmony_ci int ret; 231262306a36Sopenharmony_ci u32 remaining = len; 231362306a36Sopenharmony_ci 231462306a36Sopenharmony_ci req = kzalloc(sizeof(*req), GFP_KERNEL); 231562306a36Sopenharmony_ci if (!req) 231662306a36Sopenharmony_ci return -ENOMEM; 231762306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 231862306a36Sopenharmony_ci 231962306a36Sopenharmony_ci while (remaining) { 232062306a36Sopenharmony_ci req->valid = 1; 232162306a36Sopenharmony_ci req->file_id_valid = 1; 232262306a36Sopenharmony_ci req->file_id = ab->qmi.target.board_id; 232362306a36Sopenharmony_ci req->total_size_valid = 1; 232462306a36Sopenharmony_ci req->total_size = remaining; 232562306a36Sopenharmony_ci req->seg_id_valid = 1; 232662306a36Sopenharmony_ci req->data_valid = 1; 232762306a36Sopenharmony_ci req->bdf_type = type; 232862306a36Sopenharmony_ci req->bdf_type_valid = 1; 232962306a36Sopenharmony_ci req->end_valid = 1; 233062306a36Sopenharmony_ci req->end = 0; 233162306a36Sopenharmony_ci 233262306a36Sopenharmony_ci if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) { 233362306a36Sopenharmony_ci req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01; 233462306a36Sopenharmony_ci } else { 233562306a36Sopenharmony_ci req->data_len = remaining; 233662306a36Sopenharmony_ci req->end = 1; 233762306a36Sopenharmony_ci } 233862306a36Sopenharmony_ci 233962306a36Sopenharmony_ci if (type == ATH12K_QMI_FILE_TYPE_EEPROM) { 234062306a36Sopenharmony_ci req->data_valid = 0; 234162306a36Sopenharmony_ci req->end = 1; 234262306a36Sopenharmony_ci req->data_len = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; 234362306a36Sopenharmony_ci } else { 234462306a36Sopenharmony_ci memcpy(req->data, temp, req->data_len); 234562306a36Sopenharmony_ci } 234662306a36Sopenharmony_ci 234762306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 234862306a36Sopenharmony_ci qmi_wlanfw_bdf_download_resp_msg_v01_ei, 234962306a36Sopenharmony_ci &resp); 235062306a36Sopenharmony_ci if (ret < 0) 235162306a36Sopenharmony_ci goto out; 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf download req fixed addr type %d\n", 235462306a36Sopenharmony_ci type); 235562306a36Sopenharmony_ci 235662306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 235762306a36Sopenharmony_ci QMI_WLANFW_BDF_DOWNLOAD_REQ_V01, 235862306a36Sopenharmony_ci QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN, 235962306a36Sopenharmony_ci qmi_wlanfw_bdf_download_req_msg_v01_ei, req); 236062306a36Sopenharmony_ci if (ret < 0) { 236162306a36Sopenharmony_ci qmi_txn_cancel(&txn); 236262306a36Sopenharmony_ci goto out; 236362306a36Sopenharmony_ci } 236462306a36Sopenharmony_ci 236562306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 236662306a36Sopenharmony_ci if (ret < 0) 236762306a36Sopenharmony_ci goto out; 236862306a36Sopenharmony_ci 236962306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 237062306a36Sopenharmony_ci ath12k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n", 237162306a36Sopenharmony_ci resp.resp.result, resp.resp.error); 237262306a36Sopenharmony_ci ret = -EINVAL; 237362306a36Sopenharmony_ci goto out; 237462306a36Sopenharmony_ci } 237562306a36Sopenharmony_ci 237662306a36Sopenharmony_ci if (type == ATH12K_QMI_FILE_TYPE_EEPROM) { 237762306a36Sopenharmony_ci remaining = 0; 237862306a36Sopenharmony_ci } else { 237962306a36Sopenharmony_ci remaining -= req->data_len; 238062306a36Sopenharmony_ci temp += req->data_len; 238162306a36Sopenharmony_ci req->seg_id++; 238262306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, 238362306a36Sopenharmony_ci "qmi bdf download request remaining %i\n", 238462306a36Sopenharmony_ci remaining); 238562306a36Sopenharmony_ci } 238662306a36Sopenharmony_ci } 238762306a36Sopenharmony_ci 238862306a36Sopenharmony_ciout: 238962306a36Sopenharmony_ci kfree(req); 239062306a36Sopenharmony_ci return ret; 239162306a36Sopenharmony_ci} 239262306a36Sopenharmony_ci 239362306a36Sopenharmony_cistatic int ath12k_qmi_load_bdf_qmi(struct ath12k_base *ab, 239462306a36Sopenharmony_ci enum ath12k_qmi_bdf_type type) 239562306a36Sopenharmony_ci{ 239662306a36Sopenharmony_ci struct device *dev = ab->dev; 239762306a36Sopenharmony_ci char filename[ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE]; 239862306a36Sopenharmony_ci const struct firmware *fw_entry; 239962306a36Sopenharmony_ci struct ath12k_board_data bd; 240062306a36Sopenharmony_ci u32 fw_size, file_type; 240162306a36Sopenharmony_ci int ret = 0; 240262306a36Sopenharmony_ci const u8 *tmp; 240362306a36Sopenharmony_ci 240462306a36Sopenharmony_ci memset(&bd, 0, sizeof(bd)); 240562306a36Sopenharmony_ci 240662306a36Sopenharmony_ci switch (type) { 240762306a36Sopenharmony_ci case ATH12K_QMI_BDF_TYPE_ELF: 240862306a36Sopenharmony_ci ret = ath12k_core_fetch_bdf(ab, &bd); 240962306a36Sopenharmony_ci if (ret) { 241062306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load bdf:\n"); 241162306a36Sopenharmony_ci goto out; 241262306a36Sopenharmony_ci } 241362306a36Sopenharmony_ci 241462306a36Sopenharmony_ci if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0) 241562306a36Sopenharmony_ci type = ATH12K_QMI_BDF_TYPE_ELF; 241662306a36Sopenharmony_ci else 241762306a36Sopenharmony_ci type = ATH12K_QMI_BDF_TYPE_BIN; 241862306a36Sopenharmony_ci 241962306a36Sopenharmony_ci break; 242062306a36Sopenharmony_ci case ATH12K_QMI_BDF_TYPE_REGDB: 242162306a36Sopenharmony_ci ret = ath12k_core_fetch_board_data_api_1(ab, &bd, 242262306a36Sopenharmony_ci ATH12K_REGDB_FILE_NAME); 242362306a36Sopenharmony_ci if (ret) { 242462306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load regdb bin:\n"); 242562306a36Sopenharmony_ci goto out; 242662306a36Sopenharmony_ci } 242762306a36Sopenharmony_ci break; 242862306a36Sopenharmony_ci case ATH12K_QMI_BDF_TYPE_CALIBRATION: 242962306a36Sopenharmony_ci 243062306a36Sopenharmony_ci if (ab->qmi.target.eeprom_caldata) { 243162306a36Sopenharmony_ci file_type = ATH12K_QMI_FILE_TYPE_EEPROM; 243262306a36Sopenharmony_ci tmp = filename; 243362306a36Sopenharmony_ci fw_size = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; 243462306a36Sopenharmony_ci } else { 243562306a36Sopenharmony_ci file_type = ATH12K_QMI_FILE_TYPE_CALDATA; 243662306a36Sopenharmony_ci 243762306a36Sopenharmony_ci /* cal-<bus>-<id>.bin */ 243862306a36Sopenharmony_ci snprintf(filename, sizeof(filename), "cal-%s-%s.bin", 243962306a36Sopenharmony_ci ath12k_bus_str(ab->hif.bus), dev_name(dev)); 244062306a36Sopenharmony_ci fw_entry = ath12k_core_firmware_request(ab, filename); 244162306a36Sopenharmony_ci if (!IS_ERR(fw_entry)) 244262306a36Sopenharmony_ci goto success; 244362306a36Sopenharmony_ci 244462306a36Sopenharmony_ci fw_entry = ath12k_core_firmware_request(ab, 244562306a36Sopenharmony_ci ATH12K_DEFAULT_CAL_FILE); 244662306a36Sopenharmony_ci if (IS_ERR(fw_entry)) { 244762306a36Sopenharmony_ci ret = PTR_ERR(fw_entry); 244862306a36Sopenharmony_ci ath12k_warn(ab, 244962306a36Sopenharmony_ci "qmi failed to load CAL data file:%s\n", 245062306a36Sopenharmony_ci filename); 245162306a36Sopenharmony_ci goto out; 245262306a36Sopenharmony_ci } 245362306a36Sopenharmony_ci 245462306a36Sopenharmony_cisuccess: 245562306a36Sopenharmony_ci fw_size = min_t(u32, ab->hw_params->fw.board_size, 245662306a36Sopenharmony_ci fw_entry->size); 245762306a36Sopenharmony_ci tmp = fw_entry->data; 245862306a36Sopenharmony_ci } 245962306a36Sopenharmony_ci ret = ath12k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type); 246062306a36Sopenharmony_ci if (ret < 0) { 246162306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load caldata\n"); 246262306a36Sopenharmony_ci goto out_qmi_cal; 246362306a36Sopenharmony_ci } 246462306a36Sopenharmony_ci 246562306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi caldata downloaded: type: %u\n", 246662306a36Sopenharmony_ci file_type); 246762306a36Sopenharmony_ci 246862306a36Sopenharmony_ciout_qmi_cal: 246962306a36Sopenharmony_ci if (!ab->qmi.target.eeprom_caldata) 247062306a36Sopenharmony_ci release_firmware(fw_entry); 247162306a36Sopenharmony_ci return ret; 247262306a36Sopenharmony_ci default: 247362306a36Sopenharmony_ci ath12k_warn(ab, "unknown file type for load %d", type); 247462306a36Sopenharmony_ci goto out; 247562306a36Sopenharmony_ci } 247662306a36Sopenharmony_ci 247762306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf_type %d\n", type); 247862306a36Sopenharmony_ci 247962306a36Sopenharmony_ci fw_size = min_t(u32, ab->hw_params->fw.board_size, bd.len); 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_ci ret = ath12k_qmi_load_file_target_mem(ab, bd.data, fw_size, type); 248262306a36Sopenharmony_ci if (ret < 0) 248362306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load bdf file\n"); 248462306a36Sopenharmony_ci 248562306a36Sopenharmony_ciout: 248662306a36Sopenharmony_ci ath12k_core_free_bdf(ab, &bd); 248762306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi BDF download sequence completed\n"); 248862306a36Sopenharmony_ci 248962306a36Sopenharmony_ci return ret; 249062306a36Sopenharmony_ci} 249162306a36Sopenharmony_ci 249262306a36Sopenharmony_cistatic int ath12k_qmi_m3_load(struct ath12k_base *ab) 249362306a36Sopenharmony_ci{ 249462306a36Sopenharmony_ci struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 249562306a36Sopenharmony_ci const struct firmware *fw; 249662306a36Sopenharmony_ci char path[100]; 249762306a36Sopenharmony_ci int ret; 249862306a36Sopenharmony_ci 249962306a36Sopenharmony_ci if (m3_mem->vaddr || m3_mem->size) 250062306a36Sopenharmony_ci return 0; 250162306a36Sopenharmony_ci 250262306a36Sopenharmony_ci fw = ath12k_core_firmware_request(ab, ATH12K_M3_FILE); 250362306a36Sopenharmony_ci if (IS_ERR(fw)) { 250462306a36Sopenharmony_ci ret = PTR_ERR(fw); 250562306a36Sopenharmony_ci ath12k_core_create_firmware_path(ab, ATH12K_M3_FILE, 250662306a36Sopenharmony_ci path, sizeof(path)); 250762306a36Sopenharmony_ci ath12k_err(ab, "failed to load %s: %d\n", path, ret); 250862306a36Sopenharmony_ci return ret; 250962306a36Sopenharmony_ci } 251062306a36Sopenharmony_ci 251162306a36Sopenharmony_ci m3_mem->vaddr = dma_alloc_coherent(ab->dev, 251262306a36Sopenharmony_ci fw->size, &m3_mem->paddr, 251362306a36Sopenharmony_ci GFP_KERNEL); 251462306a36Sopenharmony_ci if (!m3_mem->vaddr) { 251562306a36Sopenharmony_ci ath12k_err(ab, "failed to allocate memory for M3 with size %zu\n", 251662306a36Sopenharmony_ci fw->size); 251762306a36Sopenharmony_ci release_firmware(fw); 251862306a36Sopenharmony_ci return -ENOMEM; 251962306a36Sopenharmony_ci } 252062306a36Sopenharmony_ci 252162306a36Sopenharmony_ci memcpy(m3_mem->vaddr, fw->data, fw->size); 252262306a36Sopenharmony_ci m3_mem->size = fw->size; 252362306a36Sopenharmony_ci release_firmware(fw); 252462306a36Sopenharmony_ci 252562306a36Sopenharmony_ci return 0; 252662306a36Sopenharmony_ci} 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_cistatic void ath12k_qmi_m3_free(struct ath12k_base *ab) 252962306a36Sopenharmony_ci{ 253062306a36Sopenharmony_ci struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 253162306a36Sopenharmony_ci 253262306a36Sopenharmony_ci if (!m3_mem->vaddr) 253362306a36Sopenharmony_ci return; 253462306a36Sopenharmony_ci 253562306a36Sopenharmony_ci dma_free_coherent(ab->dev, m3_mem->size, 253662306a36Sopenharmony_ci m3_mem->vaddr, m3_mem->paddr); 253762306a36Sopenharmony_ci m3_mem->vaddr = NULL; 253862306a36Sopenharmony_ci} 253962306a36Sopenharmony_ci 254062306a36Sopenharmony_cistatic int ath12k_qmi_wlanfw_m3_info_send(struct ath12k_base *ab) 254162306a36Sopenharmony_ci{ 254262306a36Sopenharmony_ci struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 254362306a36Sopenharmony_ci struct qmi_wlanfw_m3_info_req_msg_v01 req; 254462306a36Sopenharmony_ci struct qmi_wlanfw_m3_info_resp_msg_v01 resp; 254562306a36Sopenharmony_ci struct qmi_txn txn = {}; 254662306a36Sopenharmony_ci int ret = 0; 254762306a36Sopenharmony_ci 254862306a36Sopenharmony_ci memset(&req, 0, sizeof(req)); 254962306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 255062306a36Sopenharmony_ci 255162306a36Sopenharmony_ci ret = ath12k_qmi_m3_load(ab); 255262306a36Sopenharmony_ci if (ret) { 255362306a36Sopenharmony_ci ath12k_err(ab, "failed to load m3 firmware: %d", ret); 255462306a36Sopenharmony_ci return ret; 255562306a36Sopenharmony_ci } 255662306a36Sopenharmony_ci 255762306a36Sopenharmony_ci req.addr = m3_mem->paddr; 255862306a36Sopenharmony_ci req.size = m3_mem->size; 255962306a36Sopenharmony_ci 256062306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 256162306a36Sopenharmony_ci qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp); 256262306a36Sopenharmony_ci if (ret < 0) 256362306a36Sopenharmony_ci goto out; 256462306a36Sopenharmony_ci 256562306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 256662306a36Sopenharmony_ci QMI_WLANFW_M3_INFO_REQ_V01, 256762306a36Sopenharmony_ci QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN, 256862306a36Sopenharmony_ci qmi_wlanfw_m3_info_req_msg_v01_ei, &req); 256962306a36Sopenharmony_ci if (ret < 0) { 257062306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send M3 information request, err = %d\n", 257162306a36Sopenharmony_ci ret); 257262306a36Sopenharmony_ci goto out; 257362306a36Sopenharmony_ci } 257462306a36Sopenharmony_ci 257562306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 257662306a36Sopenharmony_ci if (ret < 0) { 257762306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed M3 information request %d\n", ret); 257862306a36Sopenharmony_ci goto out; 257962306a36Sopenharmony_ci } 258062306a36Sopenharmony_ci 258162306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 258262306a36Sopenharmony_ci ath12k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n", 258362306a36Sopenharmony_ci resp.resp.result, resp.resp.error); 258462306a36Sopenharmony_ci ret = -EINVAL; 258562306a36Sopenharmony_ci goto out; 258662306a36Sopenharmony_ci } 258762306a36Sopenharmony_ciout: 258862306a36Sopenharmony_ci return ret; 258962306a36Sopenharmony_ci} 259062306a36Sopenharmony_ci 259162306a36Sopenharmony_cistatic int ath12k_qmi_wlanfw_mode_send(struct ath12k_base *ab, 259262306a36Sopenharmony_ci u32 mode) 259362306a36Sopenharmony_ci{ 259462306a36Sopenharmony_ci struct qmi_wlanfw_wlan_mode_req_msg_v01 req; 259562306a36Sopenharmony_ci struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp; 259662306a36Sopenharmony_ci struct qmi_txn txn = {}; 259762306a36Sopenharmony_ci int ret = 0; 259862306a36Sopenharmony_ci 259962306a36Sopenharmony_ci memset(&req, 0, sizeof(req)); 260062306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 260162306a36Sopenharmony_ci 260262306a36Sopenharmony_ci req.mode = mode; 260362306a36Sopenharmony_ci req.hw_debug_valid = 1; 260462306a36Sopenharmony_ci req.hw_debug = 0; 260562306a36Sopenharmony_ci 260662306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 260762306a36Sopenharmony_ci qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp); 260862306a36Sopenharmony_ci if (ret < 0) 260962306a36Sopenharmony_ci goto out; 261062306a36Sopenharmony_ci 261162306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 261262306a36Sopenharmony_ci QMI_WLANFW_WLAN_MODE_REQ_V01, 261362306a36Sopenharmony_ci QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN, 261462306a36Sopenharmony_ci qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req); 261562306a36Sopenharmony_ci if (ret < 0) { 261662306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n", 261762306a36Sopenharmony_ci mode, ret); 261862306a36Sopenharmony_ci goto out; 261962306a36Sopenharmony_ci } 262062306a36Sopenharmony_ci 262162306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 262262306a36Sopenharmony_ci if (ret < 0) { 262362306a36Sopenharmony_ci if (mode == ATH12K_FIRMWARE_MODE_OFF && ret == -ENETRESET) { 262462306a36Sopenharmony_ci ath12k_warn(ab, "WLFW service is dis-connected\n"); 262562306a36Sopenharmony_ci return 0; 262662306a36Sopenharmony_ci } 262762306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n", 262862306a36Sopenharmony_ci mode, ret); 262962306a36Sopenharmony_ci goto out; 263062306a36Sopenharmony_ci } 263162306a36Sopenharmony_ci 263262306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 263362306a36Sopenharmony_ci ath12k_warn(ab, "Mode request failed, mode: %d, result: %d err: %d\n", 263462306a36Sopenharmony_ci mode, resp.resp.result, resp.resp.error); 263562306a36Sopenharmony_ci ret = -EINVAL; 263662306a36Sopenharmony_ci goto out; 263762306a36Sopenharmony_ci } 263862306a36Sopenharmony_ci 263962306a36Sopenharmony_ciout: 264062306a36Sopenharmony_ci return ret; 264162306a36Sopenharmony_ci} 264262306a36Sopenharmony_ci 264362306a36Sopenharmony_cistatic int ath12k_qmi_wlanfw_wlan_cfg_send(struct ath12k_base *ab) 264462306a36Sopenharmony_ci{ 264562306a36Sopenharmony_ci struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req; 264662306a36Sopenharmony_ci struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp; 264762306a36Sopenharmony_ci struct ce_pipe_config *ce_cfg; 264862306a36Sopenharmony_ci struct service_to_pipe *svc_cfg; 264962306a36Sopenharmony_ci struct qmi_txn txn = {}; 265062306a36Sopenharmony_ci int ret = 0, pipe_num; 265162306a36Sopenharmony_ci 265262306a36Sopenharmony_ci ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce; 265362306a36Sopenharmony_ci svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map; 265462306a36Sopenharmony_ci 265562306a36Sopenharmony_ci req = kzalloc(sizeof(*req), GFP_KERNEL); 265662306a36Sopenharmony_ci if (!req) 265762306a36Sopenharmony_ci return -ENOMEM; 265862306a36Sopenharmony_ci 265962306a36Sopenharmony_ci memset(&resp, 0, sizeof(resp)); 266062306a36Sopenharmony_ci 266162306a36Sopenharmony_ci req->host_version_valid = 1; 266262306a36Sopenharmony_ci strscpy(req->host_version, ATH12K_HOST_VERSION_STRING, 266362306a36Sopenharmony_ci sizeof(req->host_version)); 266462306a36Sopenharmony_ci 266562306a36Sopenharmony_ci req->tgt_cfg_valid = 1; 266662306a36Sopenharmony_ci /* This is number of CE configs */ 266762306a36Sopenharmony_ci req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len; 266862306a36Sopenharmony_ci for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) { 266962306a36Sopenharmony_ci req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum; 267062306a36Sopenharmony_ci req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir; 267162306a36Sopenharmony_ci req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries; 267262306a36Sopenharmony_ci req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max; 267362306a36Sopenharmony_ci req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags; 267462306a36Sopenharmony_ci } 267562306a36Sopenharmony_ci 267662306a36Sopenharmony_ci req->svc_cfg_valid = 1; 267762306a36Sopenharmony_ci /* This is number of Service/CE configs */ 267862306a36Sopenharmony_ci req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len; 267962306a36Sopenharmony_ci for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) { 268062306a36Sopenharmony_ci req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id; 268162306a36Sopenharmony_ci req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir; 268262306a36Sopenharmony_ci req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum; 268362306a36Sopenharmony_ci } 268462306a36Sopenharmony_ci 268562306a36Sopenharmony_ci /* set shadow v3 configuration */ 268662306a36Sopenharmony_ci if (ab->hw_params->supports_shadow_regs) { 268762306a36Sopenharmony_ci req->shadow_reg_v3_valid = 1; 268862306a36Sopenharmony_ci req->shadow_reg_v3_len = min_t(u32, 268962306a36Sopenharmony_ci ab->qmi.ce_cfg.shadow_reg_v3_len, 269062306a36Sopenharmony_ci QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01); 269162306a36Sopenharmony_ci memcpy(&req->shadow_reg_v3, ab->qmi.ce_cfg.shadow_reg_v3, 269262306a36Sopenharmony_ci sizeof(u32) * req->shadow_reg_v3_len); 269362306a36Sopenharmony_ci } else { 269462306a36Sopenharmony_ci req->shadow_reg_v3_valid = 0; 269562306a36Sopenharmony_ci } 269662306a36Sopenharmony_ci 269762306a36Sopenharmony_ci ret = qmi_txn_init(&ab->qmi.handle, &txn, 269862306a36Sopenharmony_ci qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp); 269962306a36Sopenharmony_ci if (ret < 0) 270062306a36Sopenharmony_ci goto out; 270162306a36Sopenharmony_ci 270262306a36Sopenharmony_ci ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 270362306a36Sopenharmony_ci QMI_WLANFW_WLAN_CFG_REQ_V01, 270462306a36Sopenharmony_ci QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN, 270562306a36Sopenharmony_ci qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req); 270662306a36Sopenharmony_ci if (ret < 0) { 270762306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send wlan config request, err = %d\n", 270862306a36Sopenharmony_ci ret); 270962306a36Sopenharmony_ci goto out; 271062306a36Sopenharmony_ci } 271162306a36Sopenharmony_ci 271262306a36Sopenharmony_ci ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 271362306a36Sopenharmony_ci if (ret < 0) { 271462306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed wlan config request, err = %d\n", ret); 271562306a36Sopenharmony_ci goto out; 271662306a36Sopenharmony_ci } 271762306a36Sopenharmony_ci 271862306a36Sopenharmony_ci if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 271962306a36Sopenharmony_ci ath12k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n", 272062306a36Sopenharmony_ci resp.resp.result, resp.resp.error); 272162306a36Sopenharmony_ci ret = -EINVAL; 272262306a36Sopenharmony_ci goto out; 272362306a36Sopenharmony_ci } 272462306a36Sopenharmony_ci 272562306a36Sopenharmony_ciout: 272662306a36Sopenharmony_ci kfree(req); 272762306a36Sopenharmony_ci return ret; 272862306a36Sopenharmony_ci} 272962306a36Sopenharmony_ci 273062306a36Sopenharmony_civoid ath12k_qmi_firmware_stop(struct ath12k_base *ab) 273162306a36Sopenharmony_ci{ 273262306a36Sopenharmony_ci int ret; 273362306a36Sopenharmony_ci 273462306a36Sopenharmony_ci ret = ath12k_qmi_wlanfw_mode_send(ab, ATH12K_FIRMWARE_MODE_OFF); 273562306a36Sopenharmony_ci if (ret < 0) { 273662306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send wlan mode off\n"); 273762306a36Sopenharmony_ci return; 273862306a36Sopenharmony_ci } 273962306a36Sopenharmony_ci} 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ciint ath12k_qmi_firmware_start(struct ath12k_base *ab, 274262306a36Sopenharmony_ci u32 mode) 274362306a36Sopenharmony_ci{ 274462306a36Sopenharmony_ci int ret; 274562306a36Sopenharmony_ci 274662306a36Sopenharmony_ci ret = ath12k_qmi_wlanfw_wlan_cfg_send(ab); 274762306a36Sopenharmony_ci if (ret < 0) { 274862306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret); 274962306a36Sopenharmony_ci return ret; 275062306a36Sopenharmony_ci } 275162306a36Sopenharmony_ci 275262306a36Sopenharmony_ci ret = ath12k_qmi_wlanfw_mode_send(ab, mode); 275362306a36Sopenharmony_ci if (ret < 0) { 275462306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret); 275562306a36Sopenharmony_ci return ret; 275662306a36Sopenharmony_ci } 275762306a36Sopenharmony_ci 275862306a36Sopenharmony_ci return 0; 275962306a36Sopenharmony_ci} 276062306a36Sopenharmony_ci 276162306a36Sopenharmony_cistatic int 276262306a36Sopenharmony_ciath12k_qmi_driver_event_post(struct ath12k_qmi *qmi, 276362306a36Sopenharmony_ci enum ath12k_qmi_event_type type, 276462306a36Sopenharmony_ci void *data) 276562306a36Sopenharmony_ci{ 276662306a36Sopenharmony_ci struct ath12k_qmi_driver_event *event; 276762306a36Sopenharmony_ci 276862306a36Sopenharmony_ci event = kzalloc(sizeof(*event), GFP_ATOMIC); 276962306a36Sopenharmony_ci if (!event) 277062306a36Sopenharmony_ci return -ENOMEM; 277162306a36Sopenharmony_ci 277262306a36Sopenharmony_ci event->type = type; 277362306a36Sopenharmony_ci event->data = data; 277462306a36Sopenharmony_ci 277562306a36Sopenharmony_ci spin_lock(&qmi->event_lock); 277662306a36Sopenharmony_ci list_add_tail(&event->list, &qmi->event_list); 277762306a36Sopenharmony_ci spin_unlock(&qmi->event_lock); 277862306a36Sopenharmony_ci 277962306a36Sopenharmony_ci queue_work(qmi->event_wq, &qmi->event_work); 278062306a36Sopenharmony_ci 278162306a36Sopenharmony_ci return 0; 278262306a36Sopenharmony_ci} 278362306a36Sopenharmony_ci 278462306a36Sopenharmony_cistatic int ath12k_qmi_event_server_arrive(struct ath12k_qmi *qmi) 278562306a36Sopenharmony_ci{ 278662306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 278762306a36Sopenharmony_ci int ret; 278862306a36Sopenharmony_ci 278962306a36Sopenharmony_ci ret = ath12k_qmi_fw_ind_register_send(ab); 279062306a36Sopenharmony_ci if (ret < 0) { 279162306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret); 279262306a36Sopenharmony_ci return ret; 279362306a36Sopenharmony_ci } 279462306a36Sopenharmony_ci 279562306a36Sopenharmony_ci ret = ath12k_qmi_host_cap_send(ab); 279662306a36Sopenharmony_ci if (ret < 0) { 279762306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret); 279862306a36Sopenharmony_ci return ret; 279962306a36Sopenharmony_ci } 280062306a36Sopenharmony_ci 280162306a36Sopenharmony_ci return ret; 280262306a36Sopenharmony_ci} 280362306a36Sopenharmony_ci 280462306a36Sopenharmony_cistatic int ath12k_qmi_event_mem_request(struct ath12k_qmi *qmi) 280562306a36Sopenharmony_ci{ 280662306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 280762306a36Sopenharmony_ci int ret; 280862306a36Sopenharmony_ci 280962306a36Sopenharmony_ci ret = ath12k_qmi_respond_fw_mem_request(ab); 281062306a36Sopenharmony_ci if (ret < 0) { 281162306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret); 281262306a36Sopenharmony_ci return ret; 281362306a36Sopenharmony_ci } 281462306a36Sopenharmony_ci 281562306a36Sopenharmony_ci return ret; 281662306a36Sopenharmony_ci} 281762306a36Sopenharmony_ci 281862306a36Sopenharmony_cistatic int ath12k_qmi_event_load_bdf(struct ath12k_qmi *qmi) 281962306a36Sopenharmony_ci{ 282062306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 282162306a36Sopenharmony_ci int ret; 282262306a36Sopenharmony_ci 282362306a36Sopenharmony_ci ret = ath12k_qmi_request_target_cap(ab); 282462306a36Sopenharmony_ci if (ret < 0) { 282562306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to req target capabilities:%d\n", ret); 282662306a36Sopenharmony_ci return ret; 282762306a36Sopenharmony_ci } 282862306a36Sopenharmony_ci 282962306a36Sopenharmony_ci ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_REGDB); 283062306a36Sopenharmony_ci if (ret < 0) { 283162306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load regdb file:%d\n", ret); 283262306a36Sopenharmony_ci return ret; 283362306a36Sopenharmony_ci } 283462306a36Sopenharmony_ci 283562306a36Sopenharmony_ci ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_ELF); 283662306a36Sopenharmony_ci if (ret < 0) { 283762306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load board data file:%d\n", ret); 283862306a36Sopenharmony_ci return ret; 283962306a36Sopenharmony_ci } 284062306a36Sopenharmony_ci 284162306a36Sopenharmony_ci if (ab->hw_params->download_calib) { 284262306a36Sopenharmony_ci ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_CALIBRATION); 284362306a36Sopenharmony_ci if (ret < 0) 284462306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to load calibrated data :%d\n", ret); 284562306a36Sopenharmony_ci } 284662306a36Sopenharmony_ci 284762306a36Sopenharmony_ci ret = ath12k_qmi_wlanfw_m3_info_send(ab); 284862306a36Sopenharmony_ci if (ret < 0) { 284962306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to send m3 info req:%d\n", ret); 285062306a36Sopenharmony_ci return ret; 285162306a36Sopenharmony_ci } 285262306a36Sopenharmony_ci 285362306a36Sopenharmony_ci return ret; 285462306a36Sopenharmony_ci} 285562306a36Sopenharmony_ci 285662306a36Sopenharmony_cistatic void ath12k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl, 285762306a36Sopenharmony_ci struct sockaddr_qrtr *sq, 285862306a36Sopenharmony_ci struct qmi_txn *txn, 285962306a36Sopenharmony_ci const void *data) 286062306a36Sopenharmony_ci{ 286162306a36Sopenharmony_ci struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 286262306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 286362306a36Sopenharmony_ci const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data; 286462306a36Sopenharmony_ci int i, ret; 286562306a36Sopenharmony_ci 286662306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware request memory request\n"); 286762306a36Sopenharmony_ci 286862306a36Sopenharmony_ci if (msg->mem_seg_len == 0 || 286962306a36Sopenharmony_ci msg->mem_seg_len > ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01) 287062306a36Sopenharmony_ci ath12k_warn(ab, "Invalid memory segment length: %u\n", 287162306a36Sopenharmony_ci msg->mem_seg_len); 287262306a36Sopenharmony_ci 287362306a36Sopenharmony_ci ab->qmi.mem_seg_count = msg->mem_seg_len; 287462306a36Sopenharmony_ci 287562306a36Sopenharmony_ci for (i = 0; i < qmi->mem_seg_count ; i++) { 287662306a36Sopenharmony_ci ab->qmi.target_mem[i].type = msg->mem_seg[i].type; 287762306a36Sopenharmony_ci ab->qmi.target_mem[i].size = msg->mem_seg[i].size; 287862306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi mem seg type %d size %d\n", 287962306a36Sopenharmony_ci msg->mem_seg[i].type, msg->mem_seg[i].size); 288062306a36Sopenharmony_ci } 288162306a36Sopenharmony_ci 288262306a36Sopenharmony_ci ret = ath12k_qmi_alloc_target_mem_chunk(ab); 288362306a36Sopenharmony_ci if (ret) { 288462306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to alloc target memory: %d\n", 288562306a36Sopenharmony_ci ret); 288662306a36Sopenharmony_ci return; 288762306a36Sopenharmony_ci } 288862306a36Sopenharmony_ci 288962306a36Sopenharmony_ci ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_REQUEST_MEM, NULL); 289062306a36Sopenharmony_ci} 289162306a36Sopenharmony_ci 289262306a36Sopenharmony_cistatic void ath12k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl, 289362306a36Sopenharmony_ci struct sockaddr_qrtr *sq, 289462306a36Sopenharmony_ci struct qmi_txn *txn, 289562306a36Sopenharmony_ci const void *decoded) 289662306a36Sopenharmony_ci{ 289762306a36Sopenharmony_ci struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 289862306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 289962306a36Sopenharmony_ci 290062306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware memory ready indication\n"); 290162306a36Sopenharmony_ci ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_MEM_READY, NULL); 290262306a36Sopenharmony_ci} 290362306a36Sopenharmony_ci 290462306a36Sopenharmony_cistatic void ath12k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl, 290562306a36Sopenharmony_ci struct sockaddr_qrtr *sq, 290662306a36Sopenharmony_ci struct qmi_txn *txn, 290762306a36Sopenharmony_ci const void *decoded) 290862306a36Sopenharmony_ci{ 290962306a36Sopenharmony_ci struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 291062306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 291162306a36Sopenharmony_ci 291262306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware ready\n"); 291362306a36Sopenharmony_ci ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_READY, NULL); 291462306a36Sopenharmony_ci} 291562306a36Sopenharmony_ci 291662306a36Sopenharmony_cistatic const struct qmi_msg_handler ath12k_qmi_msg_handlers[] = { 291762306a36Sopenharmony_ci { 291862306a36Sopenharmony_ci .type = QMI_INDICATION, 291962306a36Sopenharmony_ci .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01, 292062306a36Sopenharmony_ci .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei, 292162306a36Sopenharmony_ci .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01), 292262306a36Sopenharmony_ci .fn = ath12k_qmi_msg_mem_request_cb, 292362306a36Sopenharmony_ci }, 292462306a36Sopenharmony_ci { 292562306a36Sopenharmony_ci .type = QMI_INDICATION, 292662306a36Sopenharmony_ci .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01, 292762306a36Sopenharmony_ci .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei, 292862306a36Sopenharmony_ci .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01), 292962306a36Sopenharmony_ci .fn = ath12k_qmi_msg_mem_ready_cb, 293062306a36Sopenharmony_ci }, 293162306a36Sopenharmony_ci { 293262306a36Sopenharmony_ci .type = QMI_INDICATION, 293362306a36Sopenharmony_ci .msg_id = QMI_WLFW_FW_READY_IND_V01, 293462306a36Sopenharmony_ci .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei, 293562306a36Sopenharmony_ci .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01), 293662306a36Sopenharmony_ci .fn = ath12k_qmi_msg_fw_ready_cb, 293762306a36Sopenharmony_ci }, 293862306a36Sopenharmony_ci}; 293962306a36Sopenharmony_ci 294062306a36Sopenharmony_cistatic int ath12k_qmi_ops_new_server(struct qmi_handle *qmi_hdl, 294162306a36Sopenharmony_ci struct qmi_service *service) 294262306a36Sopenharmony_ci{ 294362306a36Sopenharmony_ci struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 294462306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 294562306a36Sopenharmony_ci struct sockaddr_qrtr *sq = &qmi->sq; 294662306a36Sopenharmony_ci int ret; 294762306a36Sopenharmony_ci 294862306a36Sopenharmony_ci sq->sq_family = AF_QIPCRTR; 294962306a36Sopenharmony_ci sq->sq_node = service->node; 295062306a36Sopenharmony_ci sq->sq_port = service->port; 295162306a36Sopenharmony_ci 295262306a36Sopenharmony_ci ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq, 295362306a36Sopenharmony_ci sizeof(*sq), 0); 295462306a36Sopenharmony_ci if (ret) { 295562306a36Sopenharmony_ci ath12k_warn(ab, "qmi failed to connect to remote service %d\n", ret); 295662306a36Sopenharmony_ci return ret; 295762306a36Sopenharmony_ci } 295862306a36Sopenharmony_ci 295962306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw qmi service connected\n"); 296062306a36Sopenharmony_ci ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_ARRIVE, NULL); 296162306a36Sopenharmony_ci 296262306a36Sopenharmony_ci return ret; 296362306a36Sopenharmony_ci} 296462306a36Sopenharmony_ci 296562306a36Sopenharmony_cistatic void ath12k_qmi_ops_del_server(struct qmi_handle *qmi_hdl, 296662306a36Sopenharmony_ci struct qmi_service *service) 296762306a36Sopenharmony_ci{ 296862306a36Sopenharmony_ci struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 296962306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 297062306a36Sopenharmony_ci 297162306a36Sopenharmony_ci ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw del server\n"); 297262306a36Sopenharmony_ci ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_EXIT, NULL); 297362306a36Sopenharmony_ci} 297462306a36Sopenharmony_ci 297562306a36Sopenharmony_cistatic const struct qmi_ops ath12k_qmi_ops = { 297662306a36Sopenharmony_ci .new_server = ath12k_qmi_ops_new_server, 297762306a36Sopenharmony_ci .del_server = ath12k_qmi_ops_del_server, 297862306a36Sopenharmony_ci}; 297962306a36Sopenharmony_ci 298062306a36Sopenharmony_cistatic void ath12k_qmi_driver_event_work(struct work_struct *work) 298162306a36Sopenharmony_ci{ 298262306a36Sopenharmony_ci struct ath12k_qmi *qmi = container_of(work, struct ath12k_qmi, 298362306a36Sopenharmony_ci event_work); 298462306a36Sopenharmony_ci struct ath12k_qmi_driver_event *event; 298562306a36Sopenharmony_ci struct ath12k_base *ab = qmi->ab; 298662306a36Sopenharmony_ci int ret; 298762306a36Sopenharmony_ci 298862306a36Sopenharmony_ci spin_lock(&qmi->event_lock); 298962306a36Sopenharmony_ci while (!list_empty(&qmi->event_list)) { 299062306a36Sopenharmony_ci event = list_first_entry(&qmi->event_list, 299162306a36Sopenharmony_ci struct ath12k_qmi_driver_event, list); 299262306a36Sopenharmony_ci list_del(&event->list); 299362306a36Sopenharmony_ci spin_unlock(&qmi->event_lock); 299462306a36Sopenharmony_ci 299562306a36Sopenharmony_ci if (test_bit(ATH12K_FLAG_UNREGISTERING, &ab->dev_flags)) 299662306a36Sopenharmony_ci goto skip; 299762306a36Sopenharmony_ci 299862306a36Sopenharmony_ci switch (event->type) { 299962306a36Sopenharmony_ci case ATH12K_QMI_EVENT_SERVER_ARRIVE: 300062306a36Sopenharmony_ci ret = ath12k_qmi_event_server_arrive(qmi); 300162306a36Sopenharmony_ci if (ret < 0) 300262306a36Sopenharmony_ci set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 300362306a36Sopenharmony_ci break; 300462306a36Sopenharmony_ci case ATH12K_QMI_EVENT_SERVER_EXIT: 300562306a36Sopenharmony_ci set_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags); 300662306a36Sopenharmony_ci set_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags); 300762306a36Sopenharmony_ci break; 300862306a36Sopenharmony_ci case ATH12K_QMI_EVENT_REQUEST_MEM: 300962306a36Sopenharmony_ci ret = ath12k_qmi_event_mem_request(qmi); 301062306a36Sopenharmony_ci if (ret < 0) 301162306a36Sopenharmony_ci set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 301262306a36Sopenharmony_ci break; 301362306a36Sopenharmony_ci case ATH12K_QMI_EVENT_FW_MEM_READY: 301462306a36Sopenharmony_ci ret = ath12k_qmi_event_load_bdf(qmi); 301562306a36Sopenharmony_ci if (ret < 0) 301662306a36Sopenharmony_ci set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 301762306a36Sopenharmony_ci break; 301862306a36Sopenharmony_ci case ATH12K_QMI_EVENT_FW_READY: 301962306a36Sopenharmony_ci clear_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 302062306a36Sopenharmony_ci if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) { 302162306a36Sopenharmony_ci ath12k_hal_dump_srng_stats(ab); 302262306a36Sopenharmony_ci queue_work(ab->workqueue, &ab->restart_work); 302362306a36Sopenharmony_ci break; 302462306a36Sopenharmony_ci } 302562306a36Sopenharmony_ci 302662306a36Sopenharmony_ci clear_bit(ATH12K_FLAG_CRASH_FLUSH, 302762306a36Sopenharmony_ci &ab->dev_flags); 302862306a36Sopenharmony_ci clear_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags); 302962306a36Sopenharmony_ci ath12k_core_qmi_firmware_ready(ab); 303062306a36Sopenharmony_ci set_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags); 303162306a36Sopenharmony_ci 303262306a36Sopenharmony_ci break; 303362306a36Sopenharmony_ci default: 303462306a36Sopenharmony_ci ath12k_warn(ab, "invalid event type: %d", event->type); 303562306a36Sopenharmony_ci break; 303662306a36Sopenharmony_ci } 303762306a36Sopenharmony_ci 303862306a36Sopenharmony_ciskip: 303962306a36Sopenharmony_ci kfree(event); 304062306a36Sopenharmony_ci spin_lock(&qmi->event_lock); 304162306a36Sopenharmony_ci } 304262306a36Sopenharmony_ci spin_unlock(&qmi->event_lock); 304362306a36Sopenharmony_ci} 304462306a36Sopenharmony_ci 304562306a36Sopenharmony_ciint ath12k_qmi_init_service(struct ath12k_base *ab) 304662306a36Sopenharmony_ci{ 304762306a36Sopenharmony_ci int ret; 304862306a36Sopenharmony_ci 304962306a36Sopenharmony_ci memset(&ab->qmi.target, 0, sizeof(struct target_info)); 305062306a36Sopenharmony_ci memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk)); 305162306a36Sopenharmony_ci ab->qmi.ab = ab; 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ci ab->qmi.target_mem_mode = ATH12K_QMI_TARGET_MEM_MODE_DEFAULT; 305462306a36Sopenharmony_ci ret = qmi_handle_init(&ab->qmi.handle, ATH12K_QMI_RESP_LEN_MAX, 305562306a36Sopenharmony_ci &ath12k_qmi_ops, ath12k_qmi_msg_handlers); 305662306a36Sopenharmony_ci if (ret < 0) { 305762306a36Sopenharmony_ci ath12k_warn(ab, "failed to initialize qmi handle\n"); 305862306a36Sopenharmony_ci return ret; 305962306a36Sopenharmony_ci } 306062306a36Sopenharmony_ci 306162306a36Sopenharmony_ci ab->qmi.event_wq = alloc_ordered_workqueue("ath12k_qmi_driver_event", 0); 306262306a36Sopenharmony_ci if (!ab->qmi.event_wq) { 306362306a36Sopenharmony_ci ath12k_err(ab, "failed to allocate workqueue\n"); 306462306a36Sopenharmony_ci return -EFAULT; 306562306a36Sopenharmony_ci } 306662306a36Sopenharmony_ci 306762306a36Sopenharmony_ci INIT_LIST_HEAD(&ab->qmi.event_list); 306862306a36Sopenharmony_ci spin_lock_init(&ab->qmi.event_lock); 306962306a36Sopenharmony_ci INIT_WORK(&ab->qmi.event_work, ath12k_qmi_driver_event_work); 307062306a36Sopenharmony_ci 307162306a36Sopenharmony_ci ret = qmi_add_lookup(&ab->qmi.handle, ATH12K_QMI_WLFW_SERVICE_ID_V01, 307262306a36Sopenharmony_ci ATH12K_QMI_WLFW_SERVICE_VERS_V01, 307362306a36Sopenharmony_ci ab->qmi.service_ins_id); 307462306a36Sopenharmony_ci if (ret < 0) { 307562306a36Sopenharmony_ci ath12k_warn(ab, "failed to add qmi lookup\n"); 307662306a36Sopenharmony_ci destroy_workqueue(ab->qmi.event_wq); 307762306a36Sopenharmony_ci return ret; 307862306a36Sopenharmony_ci } 307962306a36Sopenharmony_ci 308062306a36Sopenharmony_ci return ret; 308162306a36Sopenharmony_ci} 308262306a36Sopenharmony_ci 308362306a36Sopenharmony_civoid ath12k_qmi_deinit_service(struct ath12k_base *ab) 308462306a36Sopenharmony_ci{ 308562306a36Sopenharmony_ci qmi_handle_release(&ab->qmi.handle); 308662306a36Sopenharmony_ci cancel_work_sync(&ab->qmi.event_work); 308762306a36Sopenharmony_ci destroy_workqueue(ab->qmi.event_wq); 308862306a36Sopenharmony_ci ath12k_qmi_m3_free(ab); 308962306a36Sopenharmony_ci ath12k_qmi_free_target_mem_chunk(ab); 309062306a36Sopenharmony_ci} 3091