Path: blob/main/sys/contrib/dev/athk/ath12k/qmi.c
106844 views
// SPDX-License-Identifier: BSD-3-Clause-Clear1/*2* Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.3* Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.4*/56#include <linux/elf.h>7#if defined(__FreeBSD__)8#include <linux/of.h>9#include <linux/firmware.h>10#include <linux/socket.h>11#include <linux/workqueue.h>12#endif1314#include "qmi.h"15#include "core.h"16#include "debug.h"17#if defined(__linux__)18#include <linux/of.h>19#include <linux/firmware.h>20#endif2122#define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x0223#define HOST_CSTATE_BIT 0x0424#define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x0825#define ATH12K_QMI_MAX_CHUNK_SIZE 20971522627static struct qmi_elem_info wlfw_host_mlo_chip_info_s_v01_ei[] = {28{29.data_type = QMI_UNSIGNED_1_BYTE,30.elem_len = 1,31.elem_size = sizeof(u8),32.array_type = NO_ARRAY,33.tlv_type = 0,34.offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,35chip_id),36},37{38.data_type = QMI_UNSIGNED_1_BYTE,39.elem_len = 1,40.elem_size = sizeof(u8),41.array_type = NO_ARRAY,42.tlv_type = 0,43.offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,44num_local_links),45},46{47.data_type = QMI_UNSIGNED_1_BYTE,48.elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01,49.elem_size = sizeof(u8),50.array_type = STATIC_ARRAY,51.tlv_type = 0,52.offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,53hw_link_id),54},55{56.data_type = QMI_UNSIGNED_1_BYTE,57.elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01,58.elem_size = sizeof(u8),59.array_type = STATIC_ARRAY,60.tlv_type = 0,61.offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,62valid_mlo_link_id),63},64{65.data_type = QMI_EOTI,66.array_type = NO_ARRAY,67.tlv_type = QMI_COMMON_TLV_TYPE,68},69};7071static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = {72{73.data_type = QMI_OPT_FLAG,74.elem_len = 1,75.elem_size = sizeof(u8),76.array_type = NO_ARRAY,77.tlv_type = 0x10,78.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,79num_clients_valid),80},81{82.data_type = QMI_UNSIGNED_4_BYTE,83.elem_len = 1,84.elem_size = sizeof(u32),85.array_type = NO_ARRAY,86.tlv_type = 0x10,87.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,88num_clients),89},90{91.data_type = QMI_OPT_FLAG,92.elem_len = 1,93.elem_size = sizeof(u8),94.array_type = NO_ARRAY,95.tlv_type = 0x11,96.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,97wake_msi_valid),98},99{100.data_type = QMI_UNSIGNED_4_BYTE,101.elem_len = 1,102.elem_size = sizeof(u32),103.array_type = NO_ARRAY,104.tlv_type = 0x11,105.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,106wake_msi),107},108{109.data_type = QMI_OPT_FLAG,110.elem_len = 1,111.elem_size = sizeof(u8),112.array_type = NO_ARRAY,113.tlv_type = 0x12,114.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,115gpios_valid),116},117{118.data_type = QMI_DATA_LEN,119.elem_len = 1,120.elem_size = sizeof(u8),121.array_type = NO_ARRAY,122.tlv_type = 0x12,123.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,124gpios_len),125},126{127.data_type = QMI_UNSIGNED_4_BYTE,128.elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,129.elem_size = sizeof(u32),130.array_type = VAR_LEN_ARRAY,131.tlv_type = 0x12,132.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,133gpios),134},135{136.data_type = QMI_OPT_FLAG,137.elem_len = 1,138.elem_size = sizeof(u8),139.array_type = NO_ARRAY,140.tlv_type = 0x13,141.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,142nm_modem_valid),143},144{145.data_type = QMI_UNSIGNED_1_BYTE,146.elem_len = 1,147.elem_size = sizeof(u8),148.array_type = NO_ARRAY,149.tlv_type = 0x13,150.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,151nm_modem),152},153{154.data_type = QMI_OPT_FLAG,155.elem_len = 1,156.elem_size = sizeof(u8),157.array_type = NO_ARRAY,158.tlv_type = 0x14,159.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,160bdf_support_valid),161},162{163.data_type = QMI_UNSIGNED_1_BYTE,164.elem_len = 1,165.elem_size = sizeof(u8),166.array_type = NO_ARRAY,167.tlv_type = 0x14,168.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,169bdf_support),170},171{172.data_type = QMI_OPT_FLAG,173.elem_len = 1,174.elem_size = sizeof(u8),175.array_type = NO_ARRAY,176.tlv_type = 0x15,177.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,178bdf_cache_support_valid),179},180{181.data_type = QMI_UNSIGNED_1_BYTE,182.elem_len = 1,183.elem_size = sizeof(u8),184.array_type = NO_ARRAY,185.tlv_type = 0x15,186.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,187bdf_cache_support),188},189{190.data_type = QMI_OPT_FLAG,191.elem_len = 1,192.elem_size = sizeof(u8),193.array_type = NO_ARRAY,194.tlv_type = 0x16,195.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,196m3_support_valid),197},198{199.data_type = QMI_UNSIGNED_1_BYTE,200.elem_len = 1,201.elem_size = sizeof(u8),202.array_type = NO_ARRAY,203.tlv_type = 0x16,204.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,205m3_support),206},207{208.data_type = QMI_OPT_FLAG,209.elem_len = 1,210.elem_size = sizeof(u8),211.array_type = NO_ARRAY,212.tlv_type = 0x17,213.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,214m3_cache_support_valid),215},216{217.data_type = QMI_UNSIGNED_1_BYTE,218.elem_len = 1,219.elem_size = sizeof(u8),220.array_type = NO_ARRAY,221.tlv_type = 0x17,222.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,223m3_cache_support),224},225{226.data_type = QMI_OPT_FLAG,227.elem_len = 1,228.elem_size = sizeof(u8),229.array_type = NO_ARRAY,230.tlv_type = 0x18,231.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,232cal_filesys_support_valid),233},234{235.data_type = QMI_UNSIGNED_1_BYTE,236.elem_len = 1,237.elem_size = sizeof(u8),238.array_type = NO_ARRAY,239.tlv_type = 0x18,240.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,241cal_filesys_support),242},243{244.data_type = QMI_OPT_FLAG,245.elem_len = 1,246.elem_size = sizeof(u8),247.array_type = NO_ARRAY,248.tlv_type = 0x19,249.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,250cal_cache_support_valid),251},252{253.data_type = QMI_UNSIGNED_1_BYTE,254.elem_len = 1,255.elem_size = sizeof(u8),256.array_type = NO_ARRAY,257.tlv_type = 0x19,258.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,259cal_cache_support),260},261{262.data_type = QMI_OPT_FLAG,263.elem_len = 1,264.elem_size = sizeof(u8),265.array_type = NO_ARRAY,266.tlv_type = 0x1A,267.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,268cal_done_valid),269},270{271.data_type = QMI_UNSIGNED_1_BYTE,272.elem_len = 1,273.elem_size = sizeof(u8),274.array_type = NO_ARRAY,275.tlv_type = 0x1A,276.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,277cal_done),278},279{280.data_type = QMI_OPT_FLAG,281.elem_len = 1,282.elem_size = sizeof(u8),283.array_type = NO_ARRAY,284.tlv_type = 0x1B,285.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,286mem_bucket_valid),287},288{289.data_type = QMI_UNSIGNED_4_BYTE,290.elem_len = 1,291.elem_size = sizeof(u32),292.array_type = NO_ARRAY,293.tlv_type = 0x1B,294.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,295mem_bucket),296},297{298.data_type = QMI_OPT_FLAG,299.elem_len = 1,300.elem_size = sizeof(u8),301.array_type = NO_ARRAY,302.tlv_type = 0x1C,303.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,304mem_cfg_mode_valid),305},306{307.data_type = QMI_UNSIGNED_1_BYTE,308.elem_len = 1,309.elem_size = sizeof(u8),310.array_type = NO_ARRAY,311.tlv_type = 0x1C,312.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,313mem_cfg_mode),314},315{316.data_type = QMI_OPT_FLAG,317.elem_len = 1,318.elem_size = sizeof(u8),319.array_type = NO_ARRAY,320.tlv_type = 0x1D,321.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,322cal_duration_valid),323},324{325.data_type = QMI_UNSIGNED_2_BYTE,326.elem_len = 1,327.elem_size = sizeof(u16),328.array_type = NO_ARRAY,329.tlv_type = 0x1D,330.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,331cal_duraiton),332},333{334.data_type = QMI_OPT_FLAG,335.elem_len = 1,336.elem_size = sizeof(u8),337.array_type = NO_ARRAY,338.tlv_type = 0x1E,339.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,340platform_name_valid),341},342{343.data_type = QMI_STRING,344.elem_len = QMI_WLANFW_MAX_PLATFORM_NAME_LEN_V01 + 1,345.elem_size = sizeof(char),346.array_type = NO_ARRAY,347.tlv_type = 0x1E,348.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,349platform_name),350},351{352.data_type = QMI_OPT_FLAG,353.elem_len = 1,354.elem_size = sizeof(u8),355.array_type = NO_ARRAY,356.tlv_type = 0x1F,357.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,358ddr_range_valid),359},360{361.data_type = QMI_STRUCT,362.elem_len = QMI_WLANFW_MAX_HOST_DDR_RANGE_SIZE_V01,363.elem_size = sizeof(struct qmi_wlanfw_host_ddr_range),364.array_type = STATIC_ARRAY,365.tlv_type = 0x1F,366.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,367ddr_range),368},369{370.data_type = QMI_OPT_FLAG,371.elem_len = 1,372.elem_size = sizeof(u8),373.array_type = NO_ARRAY,374.tlv_type = 0x20,375.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,376host_build_type_valid),377},378{379.data_type = QMI_SIGNED_4_BYTE_ENUM,380.elem_len = 1,381.elem_size = sizeof(enum qmi_wlanfw_host_build_type),382.array_type = NO_ARRAY,383.tlv_type = 0x20,384.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,385host_build_type),386},387{388.data_type = QMI_OPT_FLAG,389.elem_len = 1,390.elem_size = sizeof(u8),391.array_type = NO_ARRAY,392.tlv_type = 0x21,393.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,394mlo_capable_valid),395},396{397.data_type = QMI_UNSIGNED_1_BYTE,398.elem_len = 1,399.elem_size = sizeof(u8),400.array_type = NO_ARRAY,401.tlv_type = 0x21,402.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,403mlo_capable),404},405{406.data_type = QMI_OPT_FLAG,407.elem_len = 1,408.elem_size = sizeof(u8),409.array_type = NO_ARRAY,410.tlv_type = 0x22,411.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,412mlo_chip_id_valid),413},414{415.data_type = QMI_UNSIGNED_2_BYTE,416.elem_len = 1,417.elem_size = sizeof(u16),418.array_type = NO_ARRAY,419.tlv_type = 0x22,420.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,421mlo_chip_id),422},423{424.data_type = QMI_OPT_FLAG,425.elem_len = 1,426.elem_size = sizeof(u8),427.array_type = NO_ARRAY,428.tlv_type = 0x23,429.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,430mlo_group_id_valid),431},432{433.data_type = QMI_UNSIGNED_1_BYTE,434.elem_len = 1,435.elem_size = sizeof(u8),436.array_type = NO_ARRAY,437.tlv_type = 0x23,438.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,439mlo_group_id),440},441{442.data_type = QMI_OPT_FLAG,443.elem_len = 1,444.elem_size = sizeof(u8),445.array_type = NO_ARRAY,446.tlv_type = 0x24,447.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,448max_mlo_peer_valid),449},450{451.data_type = QMI_UNSIGNED_2_BYTE,452.elem_len = 1,453.elem_size = sizeof(u16),454.array_type = NO_ARRAY,455.tlv_type = 0x24,456.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,457max_mlo_peer),458},459{460.data_type = QMI_OPT_FLAG,461.elem_len = 1,462.elem_size = sizeof(u8),463.array_type = NO_ARRAY,464.tlv_type = 0x25,465.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,466mlo_num_chips_valid),467},468{469.data_type = QMI_UNSIGNED_1_BYTE,470.elem_len = 1,471.elem_size = sizeof(u8),472.array_type = NO_ARRAY,473.tlv_type = 0x25,474.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,475mlo_num_chips),476},477{478.data_type = QMI_OPT_FLAG,479.elem_len = 1,480.elem_size = sizeof(u8),481.array_type = NO_ARRAY,482.tlv_type = 0x26,483.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,484mlo_chip_info_valid),485},486{487.data_type = QMI_STRUCT,488.elem_len = QMI_WLFW_MAX_NUM_MLO_CHIPS_V01,489.elem_size = sizeof(struct wlfw_host_mlo_chip_info_s_v01),490.array_type = STATIC_ARRAY,491.tlv_type = 0x26,492.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,493mlo_chip_info),494.ei_array = wlfw_host_mlo_chip_info_s_v01_ei,495},496{497.data_type = QMI_OPT_FLAG,498.elem_len = 1,499.elem_size = sizeof(u8),500.array_type = NO_ARRAY,501.tlv_type = 0x27,502.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,503feature_list_valid),504},505{506.data_type = QMI_UNSIGNED_8_BYTE,507.elem_len = 1,508.elem_size = sizeof(u64),509.array_type = NO_ARRAY,510.tlv_type = 0x27,511.offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,512feature_list),513},514{515.data_type = QMI_EOTI,516.array_type = NO_ARRAY,517.tlv_type = QMI_COMMON_TLV_TYPE,518},519};520521static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = {522{523.data_type = QMI_STRUCT,524.elem_len = 1,525.elem_size = sizeof(struct qmi_response_type_v01),526.array_type = NO_ARRAY,527.tlv_type = 0x02,528.offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp),529.ei_array = qmi_response_type_v01_ei,530},531{532.data_type = QMI_EOTI,533.array_type = NO_ARRAY,534.tlv_type = QMI_COMMON_TLV_TYPE,535},536};537538static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = {539{540.data_type = QMI_OPT_FLAG,541.elem_len = 1,542.elem_size = sizeof(u8),543.array_type = NO_ARRAY,544.tlv_type = 0x10,545.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,546fw_ready_enable_valid),547},548{549.data_type = QMI_UNSIGNED_1_BYTE,550.elem_len = 1,551.elem_size = sizeof(u8),552.array_type = NO_ARRAY,553.tlv_type = 0x10,554.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,555fw_ready_enable),556},557{558.data_type = QMI_OPT_FLAG,559.elem_len = 1,560.elem_size = sizeof(u8),561.array_type = NO_ARRAY,562.tlv_type = 0x11,563.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,564initiate_cal_download_enable_valid),565},566{567.data_type = QMI_UNSIGNED_1_BYTE,568.elem_len = 1,569.elem_size = sizeof(u8),570.array_type = NO_ARRAY,571.tlv_type = 0x11,572.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,573initiate_cal_download_enable),574},575{576.data_type = QMI_OPT_FLAG,577.elem_len = 1,578.elem_size = sizeof(u8),579.array_type = NO_ARRAY,580.tlv_type = 0x12,581.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,582initiate_cal_update_enable_valid),583},584{585.data_type = QMI_UNSIGNED_1_BYTE,586.elem_len = 1,587.elem_size = sizeof(u8),588.array_type = NO_ARRAY,589.tlv_type = 0x12,590.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,591initiate_cal_update_enable),592},593{594.data_type = QMI_OPT_FLAG,595.elem_len = 1,596.elem_size = sizeof(u8),597.array_type = NO_ARRAY,598.tlv_type = 0x13,599.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,600msa_ready_enable_valid),601},602{603.data_type = QMI_UNSIGNED_1_BYTE,604.elem_len = 1,605.elem_size = sizeof(u8),606.array_type = NO_ARRAY,607.tlv_type = 0x13,608.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,609msa_ready_enable),610},611{612.data_type = QMI_OPT_FLAG,613.elem_len = 1,614.elem_size = sizeof(u8),615.array_type = NO_ARRAY,616.tlv_type = 0x14,617.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,618pin_connect_result_enable_valid),619},620{621.data_type = QMI_UNSIGNED_1_BYTE,622.elem_len = 1,623.elem_size = sizeof(u8),624.array_type = NO_ARRAY,625.tlv_type = 0x14,626.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,627pin_connect_result_enable),628},629{630.data_type = QMI_OPT_FLAG,631.elem_len = 1,632.elem_size = sizeof(u8),633.array_type = NO_ARRAY,634.tlv_type = 0x15,635.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,636client_id_valid),637},638{639.data_type = QMI_UNSIGNED_4_BYTE,640.elem_len = 1,641.elem_size = sizeof(u32),642.array_type = NO_ARRAY,643.tlv_type = 0x15,644.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,645client_id),646},647{648.data_type = QMI_OPT_FLAG,649.elem_len = 1,650.elem_size = sizeof(u8),651.array_type = NO_ARRAY,652.tlv_type = 0x16,653.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,654request_mem_enable_valid),655},656{657.data_type = QMI_UNSIGNED_1_BYTE,658.elem_len = 1,659.elem_size = sizeof(u8),660.array_type = NO_ARRAY,661.tlv_type = 0x16,662.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,663request_mem_enable),664},665{666.data_type = QMI_OPT_FLAG,667.elem_len = 1,668.elem_size = sizeof(u8),669.array_type = NO_ARRAY,670.tlv_type = 0x17,671.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,672fw_mem_ready_enable_valid),673},674{675.data_type = QMI_UNSIGNED_1_BYTE,676.elem_len = 1,677.elem_size = sizeof(u8),678.array_type = NO_ARRAY,679.tlv_type = 0x17,680.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,681fw_mem_ready_enable),682},683{684.data_type = QMI_OPT_FLAG,685.elem_len = 1,686.elem_size = sizeof(u8),687.array_type = NO_ARRAY,688.tlv_type = 0x18,689.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,690fw_init_done_enable_valid),691},692{693.data_type = QMI_UNSIGNED_1_BYTE,694.elem_len = 1,695.elem_size = sizeof(u8),696.array_type = NO_ARRAY,697.tlv_type = 0x18,698.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,699fw_init_done_enable),700},701702{703.data_type = QMI_OPT_FLAG,704.elem_len = 1,705.elem_size = sizeof(u8),706.array_type = NO_ARRAY,707.tlv_type = 0x19,708.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,709rejuvenate_enable_valid),710},711{712.data_type = QMI_UNSIGNED_1_BYTE,713.elem_len = 1,714.elem_size = sizeof(u8),715.array_type = NO_ARRAY,716.tlv_type = 0x19,717.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,718rejuvenate_enable),719},720{721.data_type = QMI_OPT_FLAG,722.elem_len = 1,723.elem_size = sizeof(u8),724.array_type = NO_ARRAY,725.tlv_type = 0x1A,726.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,727xo_cal_enable_valid),728},729{730.data_type = QMI_UNSIGNED_1_BYTE,731.elem_len = 1,732.elem_size = sizeof(u8),733.array_type = NO_ARRAY,734.tlv_type = 0x1A,735.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,736xo_cal_enable),737},738{739.data_type = QMI_OPT_FLAG,740.elem_len = 1,741.elem_size = sizeof(u8),742.array_type = NO_ARRAY,743.tlv_type = 0x1B,744.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,745cal_done_enable_valid),746},747{748.data_type = QMI_UNSIGNED_1_BYTE,749.elem_len = 1,750.elem_size = sizeof(u8),751.array_type = NO_ARRAY,752.tlv_type = 0x1B,753.offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,754cal_done_enable),755},756{757.data_type = QMI_EOTI,758.array_type = NO_ARRAY,759.tlv_type = QMI_COMMON_TLV_TYPE,760},761};762763static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = {764{765.data_type = QMI_STRUCT,766.elem_len = 1,767.elem_size = sizeof(struct qmi_response_type_v01),768.array_type = NO_ARRAY,769.tlv_type = 0x02,770.offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,771resp),772.ei_array = qmi_response_type_v01_ei,773},774{775.data_type = QMI_OPT_FLAG,776.elem_len = 1,777.elem_size = sizeof(u8),778.array_type = NO_ARRAY,779.tlv_type = 0x10,780.offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,781fw_status_valid),782},783{784.data_type = QMI_UNSIGNED_8_BYTE,785.elem_len = 1,786.elem_size = sizeof(u64),787.array_type = NO_ARRAY,788.tlv_type = 0x10,789.offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,790fw_status),791},792{793.data_type = QMI_EOTI,794.array_type = NO_ARRAY,795.tlv_type = QMI_COMMON_TLV_TYPE,796},797};798799static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = {800{801.data_type = QMI_UNSIGNED_8_BYTE,802.elem_len = 1,803.elem_size = sizeof(u64),804.array_type = NO_ARRAY,805.tlv_type = 0,806.offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset),807},808{809.data_type = QMI_UNSIGNED_4_BYTE,810.elem_len = 1,811.elem_size = sizeof(u32),812.array_type = NO_ARRAY,813.tlv_type = 0,814.offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size),815},816{817.data_type = QMI_UNSIGNED_1_BYTE,818.elem_len = 1,819.elem_size = sizeof(u8),820.array_type = NO_ARRAY,821.tlv_type = 0,822.offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag),823},824{825.data_type = QMI_EOTI,826.array_type = NO_ARRAY,827.tlv_type = QMI_COMMON_TLV_TYPE,828},829};830831static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = {832{833.data_type = QMI_UNSIGNED_4_BYTE,834.elem_len = 1,835.elem_size = sizeof(u32),836.array_type = NO_ARRAY,837.tlv_type = 0,838.offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01,839size),840},841{842.data_type = QMI_SIGNED_4_BYTE_ENUM,843.elem_len = 1,844.elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),845.array_type = NO_ARRAY,846.tlv_type = 0,847.offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type),848},849{850.data_type = QMI_DATA_LEN,851.elem_len = 1,852.elem_size = sizeof(u8),853.array_type = NO_ARRAY,854.tlv_type = 0,855.offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len),856},857{858.data_type = QMI_STRUCT,859.elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01,860.elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01),861.array_type = VAR_LEN_ARRAY,862.tlv_type = 0,863.offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg),864.ei_array = qmi_wlanfw_mem_cfg_s_v01_ei,865},866{867.data_type = QMI_EOTI,868.array_type = NO_ARRAY,869.tlv_type = QMI_COMMON_TLV_TYPE,870},871};872873static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = {874{875.data_type = QMI_DATA_LEN,876.elem_len = 1,877.elem_size = sizeof(u8),878.array_type = NO_ARRAY,879.tlv_type = 0x01,880.offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,881mem_seg_len),882},883{884.data_type = QMI_STRUCT,885.elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,886.elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01),887.array_type = VAR_LEN_ARRAY,888.tlv_type = 0x01,889.offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,890mem_seg),891.ei_array = qmi_wlanfw_mem_seg_s_v01_ei,892},893{894.data_type = QMI_EOTI,895.array_type = NO_ARRAY,896.tlv_type = QMI_COMMON_TLV_TYPE,897},898};899900static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = {901{902.data_type = QMI_UNSIGNED_8_BYTE,903.elem_len = 1,904.elem_size = sizeof(u64),905.array_type = NO_ARRAY,906.tlv_type = 0,907.offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr),908},909{910.data_type = QMI_UNSIGNED_4_BYTE,911.elem_len = 1,912.elem_size = sizeof(u32),913.array_type = NO_ARRAY,914.tlv_type = 0,915.offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size),916},917{918.data_type = QMI_SIGNED_4_BYTE_ENUM,919.elem_len = 1,920.elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),921.array_type = NO_ARRAY,922.tlv_type = 0,923.offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type),924},925{926.data_type = QMI_UNSIGNED_1_BYTE,927.elem_len = 1,928.elem_size = sizeof(u8),929.array_type = NO_ARRAY,930.tlv_type = 0,931.offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore),932},933{934.data_type = QMI_EOTI,935.array_type = NO_ARRAY,936.tlv_type = QMI_COMMON_TLV_TYPE,937},938};939940static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = {941{942.data_type = QMI_DATA_LEN,943.elem_len = 1,944.elem_size = sizeof(u8),945.array_type = NO_ARRAY,946.tlv_type = 0x01,947.offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,948mem_seg_len),949},950{951.data_type = QMI_STRUCT,952.elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,953.elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01),954.array_type = VAR_LEN_ARRAY,955.tlv_type = 0x01,956.offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,957mem_seg),958.ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei,959},960{961.data_type = QMI_EOTI,962.array_type = NO_ARRAY,963.tlv_type = QMI_COMMON_TLV_TYPE,964},965};966967static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = {968{969.data_type = QMI_STRUCT,970.elem_len = 1,971.elem_size = sizeof(struct qmi_response_type_v01),972.array_type = NO_ARRAY,973.tlv_type = 0x02,974.offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01,975resp),976.ei_array = qmi_response_type_v01_ei,977},978{979.data_type = QMI_EOTI,980.array_type = NO_ARRAY,981.tlv_type = QMI_COMMON_TLV_TYPE,982},983};984985static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = {986{987.data_type = QMI_EOTI,988.array_type = NO_ARRAY,989.tlv_type = QMI_COMMON_TLV_TYPE,990},991};992993static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {994{995.data_type = QMI_UNSIGNED_4_BYTE,996.elem_len = 1,997.elem_size = sizeof(u32),998.array_type = NO_ARRAY,999.tlv_type = 0,1000.offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,1001chip_id),1002},1003{1004.data_type = QMI_UNSIGNED_4_BYTE,1005.elem_len = 1,1006.elem_size = sizeof(u32),1007.array_type = NO_ARRAY,1008.tlv_type = 0,1009.offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,1010chip_family),1011},1012{1013.data_type = QMI_EOTI,1014.array_type = NO_ARRAY,1015.tlv_type = QMI_COMMON_TLV_TYPE,1016},1017};10181019static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = {1020{1021.data_type = QMI_UNSIGNED_4_BYTE,1022.elem_len = 1,1023.elem_size = sizeof(u32),1024.array_type = NO_ARRAY,1025.tlv_type = 0,1026.offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01,1027board_id),1028},1029{1030.data_type = QMI_EOTI,1031.array_type = NO_ARRAY,1032.tlv_type = QMI_COMMON_TLV_TYPE,1033},1034};10351036static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = {1037{1038.data_type = QMI_UNSIGNED_4_BYTE,1039.elem_len = 1,1040.elem_size = sizeof(u32),1041.array_type = NO_ARRAY,1042.tlv_type = 0,1043.offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id),1044},1045{1046.data_type = QMI_EOTI,1047.array_type = NO_ARRAY,1048.tlv_type = QMI_COMMON_TLV_TYPE,1049},1050};10511052static struct qmi_elem_info qmi_wlanfw_dev_mem_info_s_v01_ei[] = {1053{1054.data_type = QMI_UNSIGNED_8_BYTE,1055.elem_len = 1,1056.elem_size = sizeof(u64),1057.array_type = NO_ARRAY,1058.tlv_type = 0,1059.offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01,1060start),1061},1062{1063.data_type = QMI_UNSIGNED_8_BYTE,1064.elem_len = 1,1065.elem_size = sizeof(u64),1066.array_type = NO_ARRAY,1067.tlv_type = 0,1068.offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01,1069size),1070},1071{1072.data_type = QMI_EOTI,1073.array_type = NO_ARRAY,1074.tlv_type = QMI_COMMON_TLV_TYPE,1075},1076};10771078static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = {1079{1080.data_type = QMI_UNSIGNED_4_BYTE,1081.elem_len = 1,1082.elem_size = sizeof(u32),1083.array_type = NO_ARRAY,1084.tlv_type = 0,1085.offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,1086fw_version),1087},1088{1089.data_type = QMI_STRING,1090.elem_len = ATH12K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1,1091.elem_size = sizeof(char),1092.array_type = NO_ARRAY,1093.tlv_type = 0,1094.offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,1095fw_build_timestamp),1096},1097{1098.data_type = QMI_EOTI,1099.array_type = NO_ARRAY,1100.tlv_type = QMI_COMMON_TLV_TYPE,1101},1102};11031104static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = {1105{1106.data_type = QMI_STRUCT,1107.elem_len = 1,1108.elem_size = sizeof(struct qmi_response_type_v01),1109.array_type = NO_ARRAY,1110.tlv_type = 0x02,1111.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp),1112.ei_array = qmi_response_type_v01_ei,1113},1114{1115.data_type = QMI_OPT_FLAG,1116.elem_len = 1,1117.elem_size = sizeof(u8),1118.array_type = NO_ARRAY,1119.tlv_type = 0x10,1120.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1121chip_info_valid),1122},1123{1124.data_type = QMI_STRUCT,1125.elem_len = 1,1126.elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01),1127.array_type = NO_ARRAY,1128.tlv_type = 0x10,1129.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1130chip_info),1131.ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei,1132},1133{1134.data_type = QMI_OPT_FLAG,1135.elem_len = 1,1136.elem_size = sizeof(u8),1137.array_type = NO_ARRAY,1138.tlv_type = 0x11,1139.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1140board_info_valid),1141},1142{1143.data_type = QMI_STRUCT,1144.elem_len = 1,1145.elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01),1146.array_type = NO_ARRAY,1147.tlv_type = 0x11,1148.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1149board_info),1150.ei_array = qmi_wlanfw_rf_board_info_s_v01_ei,1151},1152{1153.data_type = QMI_OPT_FLAG,1154.elem_len = 1,1155.elem_size = sizeof(u8),1156.array_type = NO_ARRAY,1157.tlv_type = 0x12,1158.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1159soc_info_valid),1160},1161{1162.data_type = QMI_STRUCT,1163.elem_len = 1,1164.elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01),1165.array_type = NO_ARRAY,1166.tlv_type = 0x12,1167.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1168soc_info),1169.ei_array = qmi_wlanfw_soc_info_s_v01_ei,1170},1171{1172.data_type = QMI_OPT_FLAG,1173.elem_len = 1,1174.elem_size = sizeof(u8),1175.array_type = NO_ARRAY,1176.tlv_type = 0x13,1177.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1178fw_version_info_valid),1179},1180{1181.data_type = QMI_STRUCT,1182.elem_len = 1,1183.elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01),1184.array_type = NO_ARRAY,1185.tlv_type = 0x13,1186.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1187fw_version_info),1188.ei_array = qmi_wlanfw_fw_version_info_s_v01_ei,1189},1190{1191.data_type = QMI_OPT_FLAG,1192.elem_len = 1,1193.elem_size = sizeof(u8),1194.array_type = NO_ARRAY,1195.tlv_type = 0x14,1196.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1197fw_build_id_valid),1198},1199{1200.data_type = QMI_STRING,1201.elem_len = ATH12K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1,1202.elem_size = sizeof(char),1203.array_type = NO_ARRAY,1204.tlv_type = 0x14,1205.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1206fw_build_id),1207},1208{1209.data_type = QMI_OPT_FLAG,1210.elem_len = 1,1211.elem_size = sizeof(u8),1212.array_type = NO_ARRAY,1213.tlv_type = 0x15,1214.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1215num_macs_valid),1216},1217{1218.data_type = QMI_UNSIGNED_1_BYTE,1219.elem_len = 1,1220.elem_size = sizeof(u8),1221.array_type = NO_ARRAY,1222.tlv_type = 0x15,1223.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1224num_macs),1225},1226{1227.data_type = QMI_OPT_FLAG,1228.elem_len = 1,1229.elem_size = sizeof(u8),1230.array_type = NO_ARRAY,1231.tlv_type = 0x16,1232.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1233voltage_mv_valid),1234},1235{1236.data_type = QMI_UNSIGNED_4_BYTE,1237.elem_len = 1,1238.elem_size = sizeof(u32),1239.array_type = NO_ARRAY,1240.tlv_type = 0x16,1241.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1242voltage_mv),1243},1244{1245.data_type = QMI_OPT_FLAG,1246.elem_len = 1,1247.elem_size = sizeof(u8),1248.array_type = NO_ARRAY,1249.tlv_type = 0x17,1250.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1251time_freq_hz_valid),1252},1253{1254.data_type = QMI_UNSIGNED_4_BYTE,1255.elem_len = 1,1256.elem_size = sizeof(u32),1257.array_type = NO_ARRAY,1258.tlv_type = 0x17,1259.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1260time_freq_hz),1261},1262{1263.data_type = QMI_OPT_FLAG,1264.elem_len = 1,1265.elem_size = sizeof(u8),1266.array_type = NO_ARRAY,1267.tlv_type = 0x18,1268.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1269otp_version_valid),1270},1271{1272.data_type = QMI_UNSIGNED_4_BYTE,1273.elem_len = 1,1274.elem_size = sizeof(u32),1275.array_type = NO_ARRAY,1276.tlv_type = 0x18,1277.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1278otp_version),1279},1280{1281.data_type = QMI_OPT_FLAG,1282.elem_len = 1,1283.elem_size = sizeof(u8),1284.array_type = NO_ARRAY,1285.tlv_type = 0x19,1286.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1287eeprom_caldata_read_timeout_valid),1288},1289{1290.data_type = QMI_UNSIGNED_4_BYTE,1291.elem_len = 1,1292.elem_size = sizeof(u32),1293.array_type = NO_ARRAY,1294.tlv_type = 0x19,1295.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1296eeprom_caldata_read_timeout),1297},1298{1299.data_type = QMI_OPT_FLAG,1300.elem_len = 1,1301.elem_size = sizeof(u8),1302.array_type = NO_ARRAY,1303.tlv_type = 0x1A,1304.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1305fw_caps_valid),1306},1307{1308.data_type = QMI_UNSIGNED_8_BYTE,1309.elem_len = 1,1310.elem_size = sizeof(u64),1311.array_type = NO_ARRAY,1312.tlv_type = 0x1A,1313.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, fw_caps),1314},1315{1316.data_type = QMI_OPT_FLAG,1317.elem_len = 1,1318.elem_size = sizeof(u8),1319.array_type = NO_ARRAY,1320.tlv_type = 0x1B,1321.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1322rd_card_chain_cap_valid),1323},1324{1325.data_type = QMI_UNSIGNED_4_BYTE,1326.elem_len = 1,1327.elem_size = sizeof(u32),1328.array_type = NO_ARRAY,1329.tlv_type = 0x1B,1330.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1331rd_card_chain_cap),1332},1333{1334.data_type = QMI_OPT_FLAG,1335.elem_len = 1,1336.elem_size = sizeof(u8),1337.array_type = NO_ARRAY,1338.tlv_type = 0x1C,1339.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,1340dev_mem_info_valid),1341},1342{1343.data_type = QMI_STRUCT,1344.elem_len = ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01,1345.elem_size = sizeof(struct qmi_wlanfw_dev_mem_info_s_v01),1346.array_type = STATIC_ARRAY,1347.tlv_type = 0x1C,1348.offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, dev_mem),1349.ei_array = qmi_wlanfw_dev_mem_info_s_v01_ei,1350},1351{1352.data_type = QMI_EOTI,1353.array_type = NO_ARRAY,1354.tlv_type = QMI_COMMON_TLV_TYPE,1355},1356};13571358static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = {1359{1360.data_type = QMI_UNSIGNED_1_BYTE,1361.elem_len = 1,1362.elem_size = sizeof(u8),1363.array_type = NO_ARRAY,1364.tlv_type = 0x01,1365.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1366valid),1367},1368{1369.data_type = QMI_OPT_FLAG,1370.elem_len = 1,1371.elem_size = sizeof(u8),1372.array_type = NO_ARRAY,1373.tlv_type = 0x10,1374.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1375file_id_valid),1376},1377{1378.data_type = QMI_SIGNED_4_BYTE_ENUM,1379.elem_len = 1,1380.elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01),1381.array_type = NO_ARRAY,1382.tlv_type = 0x10,1383.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1384file_id),1385},1386{1387.data_type = QMI_OPT_FLAG,1388.elem_len = 1,1389.elem_size = sizeof(u8),1390.array_type = NO_ARRAY,1391.tlv_type = 0x11,1392.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1393total_size_valid),1394},1395{1396.data_type = QMI_UNSIGNED_4_BYTE,1397.elem_len = 1,1398.elem_size = sizeof(u32),1399.array_type = NO_ARRAY,1400.tlv_type = 0x11,1401.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1402total_size),1403},1404{1405.data_type = QMI_OPT_FLAG,1406.elem_len = 1,1407.elem_size = sizeof(u8),1408.array_type = NO_ARRAY,1409.tlv_type = 0x12,1410.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1411seg_id_valid),1412},1413{1414.data_type = QMI_UNSIGNED_4_BYTE,1415.elem_len = 1,1416.elem_size = sizeof(u32),1417.array_type = NO_ARRAY,1418.tlv_type = 0x12,1419.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1420seg_id),1421},1422{1423.data_type = QMI_OPT_FLAG,1424.elem_len = 1,1425.elem_size = sizeof(u8),1426.array_type = NO_ARRAY,1427.tlv_type = 0x13,1428.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1429data_valid),1430},1431{1432.data_type = QMI_DATA_LEN,1433.elem_len = 1,1434.elem_size = sizeof(u16),1435.array_type = NO_ARRAY,1436.tlv_type = 0x13,1437.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1438data_len),1439},1440{1441.data_type = QMI_UNSIGNED_1_BYTE,1442.elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01,1443.elem_size = sizeof(u8),1444.array_type = VAR_LEN_ARRAY,1445.tlv_type = 0x13,1446.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1447data),1448},1449{1450.data_type = QMI_OPT_FLAG,1451.elem_len = 1,1452.elem_size = sizeof(u8),1453.array_type = NO_ARRAY,1454.tlv_type = 0x14,1455.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1456end_valid),1457},1458{1459.data_type = QMI_UNSIGNED_1_BYTE,1460.elem_len = 1,1461.elem_size = sizeof(u8),1462.array_type = NO_ARRAY,1463.tlv_type = 0x14,1464.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1465end),1466},1467{1468.data_type = QMI_OPT_FLAG,1469.elem_len = 1,1470.elem_size = sizeof(u8),1471.array_type = NO_ARRAY,1472.tlv_type = 0x15,1473.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1474bdf_type_valid),1475},1476{1477.data_type = QMI_UNSIGNED_1_BYTE,1478.elem_len = 1,1479.elem_size = sizeof(u8),1480.array_type = NO_ARRAY,1481.tlv_type = 0x15,1482.offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,1483bdf_type),1484},14851486{1487.data_type = QMI_EOTI,1488.array_type = NO_ARRAY,1489.tlv_type = QMI_COMMON_TLV_TYPE,1490},1491};14921493static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = {1494{1495.data_type = QMI_STRUCT,1496.elem_len = 1,1497.elem_size = sizeof(struct qmi_response_type_v01),1498.array_type = NO_ARRAY,1499.tlv_type = 0x02,1500.offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01,1501resp),1502.ei_array = qmi_response_type_v01_ei,1503},1504{1505.data_type = QMI_EOTI,1506.array_type = NO_ARRAY,1507.tlv_type = QMI_COMMON_TLV_TYPE,1508},1509};15101511static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = {1512{1513.data_type = QMI_UNSIGNED_8_BYTE,1514.elem_len = 1,1515.elem_size = sizeof(u64),1516.array_type = NO_ARRAY,1517.tlv_type = 0x01,1518.offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr),1519},1520{1521.data_type = QMI_UNSIGNED_4_BYTE,1522.elem_len = 1,1523.elem_size = sizeof(u32),1524.array_type = NO_ARRAY,1525.tlv_type = 0x02,1526.offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size),1527},1528{1529.data_type = QMI_EOTI,1530.array_type = NO_ARRAY,1531.tlv_type = QMI_COMMON_TLV_TYPE,1532},1533};15341535static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = {1536{1537.data_type = QMI_STRUCT,1538.elem_len = 1,1539.elem_size = sizeof(struct qmi_response_type_v01),1540.array_type = NO_ARRAY,1541.tlv_type = 0x02,1542.offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp),1543.ei_array = qmi_response_type_v01_ei,1544},1545{1546.data_type = QMI_EOTI,1547.array_type = NO_ARRAY,1548.tlv_type = QMI_COMMON_TLV_TYPE,1549},1550};15511552static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = {1553{1554.data_type = QMI_UNSIGNED_4_BYTE,1555.elem_len = 1,1556.elem_size = sizeof(u32),1557.array_type = NO_ARRAY,1558.tlv_type = 0,1559.offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,1560pipe_num),1561},1562{1563.data_type = QMI_SIGNED_4_BYTE_ENUM,1564.elem_len = 1,1565.elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),1566.array_type = NO_ARRAY,1567.tlv_type = 0,1568.offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,1569pipe_dir),1570},1571{1572.data_type = QMI_UNSIGNED_4_BYTE,1573.elem_len = 1,1574.elem_size = sizeof(u32),1575.array_type = NO_ARRAY,1576.tlv_type = 0,1577.offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,1578nentries),1579},1580{1581.data_type = QMI_UNSIGNED_4_BYTE,1582.elem_len = 1,1583.elem_size = sizeof(u32),1584.array_type = NO_ARRAY,1585.tlv_type = 0,1586.offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,1587nbytes_max),1588},1589{1590.data_type = QMI_UNSIGNED_4_BYTE,1591.elem_len = 1,1592.elem_size = sizeof(u32),1593.array_type = NO_ARRAY,1594.tlv_type = 0,1595.offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,1596flags),1597},1598{1599.data_type = QMI_EOTI,1600.array_type = NO_ARRAY,1601.tlv_type = QMI_COMMON_TLV_TYPE,1602},1603};16041605static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = {1606{1607.data_type = QMI_UNSIGNED_4_BYTE,1608.elem_len = 1,1609.elem_size = sizeof(u32),1610.array_type = NO_ARRAY,1611.tlv_type = 0,1612.offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,1613service_id),1614},1615{1616.data_type = QMI_SIGNED_4_BYTE_ENUM,1617.elem_len = 1,1618.elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),1619.array_type = NO_ARRAY,1620.tlv_type = 0,1621.offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,1622pipe_dir),1623},1624{1625.data_type = QMI_UNSIGNED_4_BYTE,1626.elem_len = 1,1627.elem_size = sizeof(u32),1628.array_type = NO_ARRAY,1629.tlv_type = 0,1630.offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,1631pipe_num),1632},1633{1634.data_type = QMI_EOTI,1635.array_type = NO_ARRAY,1636.tlv_type = QMI_COMMON_TLV_TYPE,1637},1638};16391640static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = {1641{1642.data_type = QMI_UNSIGNED_2_BYTE,1643.elem_len = 1,1644.elem_size = sizeof(u16),1645.array_type = NO_ARRAY,1646.tlv_type = 0,1647.offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id),1648},1649{1650.data_type = QMI_UNSIGNED_2_BYTE,1651.elem_len = 1,1652.elem_size = sizeof(u16),1653.array_type = NO_ARRAY,1654.tlv_type = 0,1655.offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01,1656offset),1657},1658{1659.data_type = QMI_EOTI,1660.array_type = QMI_COMMON_TLV_TYPE,1661},1662};16631664static struct qmi_elem_info qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei[] = {1665{1666.data_type = QMI_UNSIGNED_4_BYTE,1667.elem_len = 1,1668.elem_size = sizeof(u32),1669.array_type = NO_ARRAY,1670.tlv_type = 0,1671.offset = offsetof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01,1672addr),1673},1674{1675.data_type = QMI_EOTI,1676.array_type = NO_ARRAY,1677.tlv_type = QMI_COMMON_TLV_TYPE,1678},1679};16801681static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = {1682{1683.data_type = QMI_UNSIGNED_4_BYTE,1684.elem_len = 1,1685.elem_size = sizeof(u32),1686.array_type = NO_ARRAY,1687.tlv_type = 0x01,1688.offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,1689mode),1690},1691{1692.data_type = QMI_OPT_FLAG,1693.elem_len = 1,1694.elem_size = sizeof(u8),1695.array_type = NO_ARRAY,1696.tlv_type = 0x10,1697.offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,1698hw_debug_valid),1699},1700{1701.data_type = QMI_UNSIGNED_1_BYTE,1702.elem_len = 1,1703.elem_size = sizeof(u8),1704.array_type = NO_ARRAY,1705.tlv_type = 0x10,1706.offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,1707hw_debug),1708},1709{1710.data_type = QMI_EOTI,1711.array_type = NO_ARRAY,1712.tlv_type = QMI_COMMON_TLV_TYPE,1713},1714};17151716static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = {1717{1718.data_type = QMI_STRUCT,1719.elem_len = 1,1720.elem_size = sizeof(struct qmi_response_type_v01),1721.array_type = NO_ARRAY,1722.tlv_type = 0x02,1723.offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01,1724resp),1725.ei_array = qmi_response_type_v01_ei,1726},1727{1728.data_type = QMI_EOTI,1729.array_type = NO_ARRAY,1730.tlv_type = QMI_COMMON_TLV_TYPE,1731},1732};17331734static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = {1735{1736.data_type = QMI_OPT_FLAG,1737.elem_len = 1,1738.elem_size = sizeof(u8),1739.array_type = NO_ARRAY,1740.tlv_type = 0x10,1741.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1742host_version_valid),1743},1744{1745.data_type = QMI_STRING,1746.elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1,1747.elem_size = sizeof(char),1748.array_type = NO_ARRAY,1749.tlv_type = 0x10,1750.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1751host_version),1752},1753{1754.data_type = QMI_OPT_FLAG,1755.elem_len = 1,1756.elem_size = sizeof(u8),1757.array_type = NO_ARRAY,1758.tlv_type = 0x11,1759.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1760tgt_cfg_valid),1761},1762{1763.data_type = QMI_DATA_LEN,1764.elem_len = 1,1765.elem_size = sizeof(u8),1766.array_type = NO_ARRAY,1767.tlv_type = 0x11,1768.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1769tgt_cfg_len),1770},1771{1772.data_type = QMI_STRUCT,1773.elem_len = QMI_WLANFW_MAX_NUM_CE_V01,1774.elem_size = sizeof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01),1775.array_type = VAR_LEN_ARRAY,1776.tlv_type = 0x11,1777.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1778tgt_cfg),1779.ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei,1780},1781{1782.data_type = QMI_OPT_FLAG,1783.elem_len = 1,1784.elem_size = sizeof(u8),1785.array_type = NO_ARRAY,1786.tlv_type = 0x12,1787.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1788svc_cfg_valid),1789},1790{1791.data_type = QMI_DATA_LEN,1792.elem_len = 1,1793.elem_size = sizeof(u8),1794.array_type = NO_ARRAY,1795.tlv_type = 0x12,1796.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1797svc_cfg_len),1798},1799{1800.data_type = QMI_STRUCT,1801.elem_len = QMI_WLANFW_MAX_NUM_SVC_V01,1802.elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01),1803.array_type = VAR_LEN_ARRAY,1804.tlv_type = 0x12,1805.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1806svc_cfg),1807.ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei,1808},1809{1810.data_type = QMI_OPT_FLAG,1811.elem_len = 1,1812.elem_size = sizeof(u8),1813.array_type = NO_ARRAY,1814.tlv_type = 0x13,1815.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1816shadow_reg_valid),1817},1818{1819.data_type = QMI_DATA_LEN,1820.elem_len = 1,1821.elem_size = sizeof(u8),1822.array_type = NO_ARRAY,1823.tlv_type = 0x13,1824.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1825shadow_reg_len),1826},1827{1828.data_type = QMI_STRUCT,1829.elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01,1830.elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01),1831.array_type = VAR_LEN_ARRAY,1832.tlv_type = 0x13,1833.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1834shadow_reg),1835.ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei,1836},1837{1838.data_type = QMI_OPT_FLAG,1839.elem_len = 1,1840.elem_size = sizeof(u8),1841.array_type = NO_ARRAY,1842.tlv_type = 0x17,1843.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1844shadow_reg_v3_valid),1845},1846{1847.data_type = QMI_DATA_LEN,1848.elem_len = 1,1849.elem_size = sizeof(u8),1850.array_type = NO_ARRAY,1851.tlv_type = 0x17,1852.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1853shadow_reg_v3_len),1854},1855{1856.data_type = QMI_STRUCT,1857.elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01,1858.elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01),1859.array_type = VAR_LEN_ARRAY,1860.tlv_type = 0x17,1861.offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,1862shadow_reg_v3),1863.ei_array = qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei,1864},1865{1866.data_type = QMI_EOTI,1867.array_type = NO_ARRAY,1868.tlv_type = QMI_COMMON_TLV_TYPE,1869},1870};18711872static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = {1873{1874.data_type = QMI_STRUCT,1875.elem_len = 1,1876.elem_size = sizeof(struct qmi_response_type_v01),1877.array_type = NO_ARRAY,1878.tlv_type = 0x02,1879.offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp),1880.ei_array = qmi_response_type_v01_ei,1881},1882{1883.data_type = QMI_EOTI,1884.array_type = NO_ARRAY,1885.tlv_type = QMI_COMMON_TLV_TYPE,1886},1887};18881889static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = {1890{1891.data_type = QMI_EOTI,1892.array_type = NO_ARRAY,1893},1894};18951896static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = {1897{1898.data_type = QMI_EOTI,1899.array_type = NO_ARRAY,1900},1901};19021903static void ath12k_host_cap_parse_mlo(struct qmi_wlanfw_host_cap_req_msg_v01 *req)1904{1905req->mlo_capable_valid = 1;1906req->mlo_capable = 1;1907req->mlo_chip_id_valid = 1;1908req->mlo_chip_id = 0;1909req->mlo_group_id_valid = 1;1910req->mlo_group_id = 0;1911req->max_mlo_peer_valid = 1;1912/* Max peer number generally won't change for the same device1913* but needs to be synced with host driver.1914*/1915req->max_mlo_peer = 32;1916req->mlo_num_chips_valid = 1;1917req->mlo_num_chips = 1;1918req->mlo_chip_info_valid = 1;1919req->mlo_chip_info[0].chip_id = 0;1920req->mlo_chip_info[0].num_local_links = 2;1921req->mlo_chip_info[0].hw_link_id[0] = 0;1922req->mlo_chip_info[0].hw_link_id[1] = 1;1923req->mlo_chip_info[0].valid_mlo_link_id[0] = 1;1924req->mlo_chip_info[0].valid_mlo_link_id[1] = 1;1925}19261927static int ath12k_qmi_host_cap_send(struct ath12k_base *ab)1928{1929struct qmi_wlanfw_host_cap_req_msg_v01 req;1930struct qmi_wlanfw_host_cap_resp_msg_v01 resp;1931struct qmi_txn txn = {};1932int ret = 0;19331934memset(&req, 0, sizeof(req));1935memset(&resp, 0, sizeof(resp));19361937req.num_clients_valid = 1;1938req.num_clients = 1;1939req.mem_cfg_mode = ab->qmi.target_mem_mode;1940req.mem_cfg_mode_valid = 1;1941req.bdf_support_valid = 1;1942req.bdf_support = 1;19431944req.m3_support_valid = 1;1945req.m3_support = 1;1946req.m3_cache_support_valid = 1;1947req.m3_cache_support = 1;19481949req.cal_done_valid = 1;1950req.cal_done = ab->qmi.cal_done;19511952if (ab->hw_params->qmi_cnss_feature_bitmap) {1953req.feature_list_valid = 1;1954req.feature_list = ab->hw_params->qmi_cnss_feature_bitmap;1955}19561957/* BRINGUP: here we are piggybacking a lot of stuff using1958* internal_sleep_clock, should it be split?1959*/1960if (ab->hw_params->internal_sleep_clock) {1961req.nm_modem_valid = 1;19621963/* Notify firmware that this is non-qualcomm platform. */1964req.nm_modem |= HOST_CSTATE_BIT;19651966/* Notify firmware about the sleep clock selection,1967* nm_modem_bit[1] is used for this purpose. Host driver on1968* non-qualcomm platforms should select internal sleep1969* clock.1970*/1971req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT;1972req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET;19731974ath12k_host_cap_parse_mlo(&req);1975}19761977ret = qmi_txn_init(&ab->qmi.handle, &txn,1978qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp);1979if (ret < 0)1980goto out;19811982ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,1983QMI_WLANFW_HOST_CAP_REQ_V01,1984QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN,1985qmi_wlanfw_host_cap_req_msg_v01_ei, &req);1986if (ret < 0) {1987ath12k_warn(ab, "Failed to send host capability request,err = %d\n", ret);1988goto out;1989}19901991ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));1992if (ret < 0)1993goto out;19941995if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {1996ath12k_warn(ab, "Host capability request failed, result: %d, err: %d\n",1997resp.resp.result, resp.resp.error);1998ret = -EINVAL;1999goto out;2000}20012002out:2003return ret;2004}20052006static int ath12k_qmi_fw_ind_register_send(struct ath12k_base *ab)2007{2008struct qmi_wlanfw_ind_register_req_msg_v01 *req;2009struct qmi_wlanfw_ind_register_resp_msg_v01 *resp;2010struct qmi_handle *handle = &ab->qmi.handle;2011struct qmi_txn txn;2012int ret;20132014req = kzalloc(sizeof(*req), GFP_KERNEL);2015if (!req)2016return -ENOMEM;20172018resp = kzalloc(sizeof(*resp), GFP_KERNEL);2019if (!resp) {2020ret = -ENOMEM;2021goto resp_out;2022}20232024req->client_id_valid = 1;2025req->client_id = QMI_WLANFW_CLIENT_ID;2026req->fw_ready_enable_valid = 1;2027req->fw_ready_enable = 1;2028req->request_mem_enable_valid = 1;2029req->request_mem_enable = 1;2030req->fw_mem_ready_enable_valid = 1;2031req->fw_mem_ready_enable = 1;2032req->cal_done_enable_valid = 1;2033req->cal_done_enable = 1;2034req->fw_init_done_enable_valid = 1;2035req->fw_init_done_enable = 1;20362037req->pin_connect_result_enable_valid = 0;2038req->pin_connect_result_enable = 0;20392040ret = qmi_txn_init(handle, &txn,2041qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);2042if (ret < 0)2043goto out;20442045ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2046QMI_WLANFW_IND_REGISTER_REQ_V01,2047QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN,2048qmi_wlanfw_ind_register_req_msg_v01_ei, req);2049if (ret < 0) {2050ath12k_warn(ab, "Failed to send indication register request, err = %d\n",2051ret);2052goto out;2053}20542055ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2056if (ret < 0) {2057ath12k_warn(ab, "failed to register fw indication %d\n", ret);2058goto out;2059}20602061if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {2062ath12k_warn(ab, "FW Ind register request failed, result: %d, err: %d\n",2063resp->resp.result, resp->resp.error);2064ret = -EINVAL;2065goto out;2066}20672068out:2069kfree(resp);2070resp_out:2071kfree(req);2072return ret;2073}20742075static int ath12k_qmi_respond_fw_mem_request(struct ath12k_base *ab)2076{2077struct qmi_wlanfw_respond_mem_req_msg_v01 *req;2078struct qmi_wlanfw_respond_mem_resp_msg_v01 resp;2079struct qmi_txn txn = {};2080int ret = 0, i;2081bool delayed;20822083req = kzalloc(sizeof(*req), GFP_KERNEL);2084if (!req)2085return -ENOMEM;20862087memset(&resp, 0, sizeof(resp));20882089/* Some targets by default request a block of big contiguous2090* DMA memory, it's hard to allocate from kernel. So host returns2091* failure to firmware and firmware then request multiple blocks of2092* small chunk size memory.2093*/2094if (ab->qmi.target_mem_delayed) {2095delayed = true;2096ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi delays mem_request %d\n",2097ab->qmi.mem_seg_count);2098memset(req, 0, sizeof(*req));2099} else {2100delayed = false;2101req->mem_seg_len = ab->qmi.mem_seg_count;2102for (i = 0; i < req->mem_seg_len ; i++) {2103req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;2104req->mem_seg[i].size = ab->qmi.target_mem[i].size;2105req->mem_seg[i].type = ab->qmi.target_mem[i].type;2106ath12k_dbg(ab, ATH12K_DBG_QMI,2107"qmi req mem_seg[%d] %pad %u %u\n", i,2108&ab->qmi.target_mem[i].paddr,2109ab->qmi.target_mem[i].size,2110ab->qmi.target_mem[i].type);2111}2112}21132114ret = qmi_txn_init(&ab->qmi.handle, &txn,2115qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);2116if (ret < 0)2117goto out;21182119ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2120QMI_WLANFW_RESPOND_MEM_REQ_V01,2121QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,2122qmi_wlanfw_respond_mem_req_msg_v01_ei, req);2123if (ret < 0) {2124ath12k_warn(ab, "qmi failed to respond memory request, err = %d\n",2125ret);2126goto out;2127}21282129ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2130if (ret < 0) {2131ath12k_warn(ab, "qmi failed memory request, err = %d\n", ret);2132goto out;2133}21342135if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {2136/* the error response is expected when2137* target_mem_delayed is true.2138*/2139if (delayed && resp.resp.error == 0)2140goto out;21412142ath12k_warn(ab, "Respond mem req failed, result: %d, err: %d\n",2143resp.resp.result, resp.resp.error);2144ret = -EINVAL;2145goto out;2146}2147out:2148kfree(req);2149return ret;2150}21512152static void ath12k_qmi_free_target_mem_chunk(struct ath12k_base *ab)2153{2154int i;21552156for (i = 0; i < ab->qmi.mem_seg_count; i++) {2157if (!ab->qmi.target_mem[i].v.addr)2158continue;2159dma_free_coherent(ab->dev,2160ab->qmi.target_mem[i].size,2161ab->qmi.target_mem[i].v.addr,2162ab->qmi.target_mem[i].paddr);2163ab->qmi.target_mem[i].v.addr = NULL;2164}2165}21662167static int ath12k_qmi_alloc_target_mem_chunk(struct ath12k_base *ab)2168{2169int i;2170struct target_mem_chunk *chunk;21712172ab->qmi.target_mem_delayed = false;21732174for (i = 0; i < ab->qmi.mem_seg_count; i++) {2175chunk = &ab->qmi.target_mem[i];21762177/* Allocate memory for the region and the functionality supported2178* on the host. For the non-supported memory region, host does not2179* allocate memory, assigns NULL and FW will handle this without crashing.2180*/2181switch (chunk->type) {2182case HOST_DDR_REGION_TYPE:2183case M3_DUMP_REGION_TYPE:2184case PAGEABLE_MEM_REGION_TYPE:2185case CALDB_MEM_REGION_TYPE:2186chunk->v.addr = dma_alloc_coherent(ab->dev,2187chunk->size,2188&chunk->paddr,2189GFP_KERNEL | __GFP_NOWARN);2190if (!chunk->v.addr) {2191if (chunk->size > ATH12K_QMI_MAX_CHUNK_SIZE) {2192ab->qmi.target_mem_delayed = true;2193ath12k_warn(ab,2194"qmi dma allocation failed (%d B type %u), will try later with small size\n",2195chunk->size,2196chunk->type);2197ath12k_qmi_free_target_mem_chunk(ab);2198return 0;2199}2200ath12k_warn(ab, "memory allocation failure for %u size: %d\n",2201chunk->type, chunk->size);2202return -ENOMEM;2203}2204break;2205default:2206ath12k_warn(ab, "memory type %u not supported\n",2207chunk->type);2208chunk->paddr = 0;2209chunk->v.addr = NULL;2210break;2211}2212}2213return 0;2214}22152216static int ath12k_qmi_request_target_cap(struct ath12k_base *ab)2217{2218struct qmi_wlanfw_cap_req_msg_v01 req;2219struct qmi_wlanfw_cap_resp_msg_v01 resp;2220struct qmi_txn txn = {};2221unsigned int board_id = ATH12K_BOARD_ID_DEFAULT;2222int ret = 0;2223int i;22242225memset(&req, 0, sizeof(req));2226memset(&resp, 0, sizeof(resp));22272228ret = qmi_txn_init(&ab->qmi.handle, &txn,2229qmi_wlanfw_cap_resp_msg_v01_ei, &resp);2230if (ret < 0)2231goto out;22322233ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2234QMI_WLANFW_CAP_REQ_V01,2235QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN,2236qmi_wlanfw_cap_req_msg_v01_ei, &req);2237if (ret < 0) {2238ath12k_warn(ab, "qmi failed to send target cap request, err = %d\n",2239ret);2240goto out;2241}22422243ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2244if (ret < 0) {2245ath12k_warn(ab, "qmi failed target cap request %d\n", ret);2246goto out;2247}22482249if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {2250ath12k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n",2251resp.resp.result, resp.resp.error);2252ret = -EINVAL;2253goto out;2254}22552256if (resp.chip_info_valid) {2257ab->qmi.target.chip_id = resp.chip_info.chip_id;2258ab->qmi.target.chip_family = resp.chip_info.chip_family;2259}22602261if (resp.board_info_valid)2262ab->qmi.target.board_id = resp.board_info.board_id;2263else2264ab->qmi.target.board_id = board_id;22652266if (resp.soc_info_valid)2267ab->qmi.target.soc_id = resp.soc_info.soc_id;22682269if (resp.fw_version_info_valid) {2270ab->qmi.target.fw_version = resp.fw_version_info.fw_version;2271strscpy(ab->qmi.target.fw_build_timestamp,2272resp.fw_version_info.fw_build_timestamp,2273sizeof(ab->qmi.target.fw_build_timestamp));2274}22752276if (resp.fw_build_id_valid)2277strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id,2278sizeof(ab->qmi.target.fw_build_id));22792280if (resp.dev_mem_info_valid) {2281for (i = 0; i < ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01; i++) {2282ab->qmi.dev_mem[i].start =2283resp.dev_mem[i].start;2284ab->qmi.dev_mem[i].size =2285resp.dev_mem[i].size;2286ath12k_dbg(ab, ATH12K_DBG_QMI,2287#if defined(__linux__)2288"devmem [%d] start ox%llx size %llu\n", i,2289ab->qmi.dev_mem[i].start,2290ab->qmi.dev_mem[i].size);2291#elif defined(__FreeBSD__)2292"devmem [%d] start ox%jx size %ju\n", i,2293(uintmax_t)ab->qmi.dev_mem[i].start,2294(uintmax_t)ab->qmi.dev_mem[i].size);2295#endif2296}2297}22982299if (resp.eeprom_caldata_read_timeout_valid) {2300ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout;2301ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n");2302}23032304ath12k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n",2305ab->qmi.target.chip_id, ab->qmi.target.chip_family,2306ab->qmi.target.board_id, ab->qmi.target.soc_id);23072308ath12k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s",2309ab->qmi.target.fw_version,2310ab->qmi.target.fw_build_timestamp,2311ab->qmi.target.fw_build_id);23122313out:2314return ret;2315}23162317static int ath12k_qmi_load_file_target_mem(struct ath12k_base *ab,2318const u8 *data, u32 len, u8 type)2319{2320struct qmi_wlanfw_bdf_download_req_msg_v01 *req;2321struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;2322struct qmi_txn txn = {};2323const u8 *temp = data;2324int ret;2325u32 remaining = len;23262327req = kzalloc(sizeof(*req), GFP_KERNEL);2328if (!req)2329return -ENOMEM;2330memset(&resp, 0, sizeof(resp));23312332while (remaining) {2333req->valid = 1;2334req->file_id_valid = 1;2335req->file_id = ab->qmi.target.board_id;2336req->total_size_valid = 1;2337req->total_size = remaining;2338req->seg_id_valid = 1;2339req->data_valid = 1;2340req->bdf_type = type;2341req->bdf_type_valid = 1;2342req->end_valid = 1;2343req->end = 0;23442345if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) {2346req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01;2347} else {2348req->data_len = remaining;2349req->end = 1;2350}23512352if (type == ATH12K_QMI_FILE_TYPE_EEPROM) {2353req->data_valid = 0;2354req->end = 1;2355req->data_len = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE;2356} else {2357memcpy(req->data, temp, req->data_len);2358}23592360ret = qmi_txn_init(&ab->qmi.handle, &txn,2361qmi_wlanfw_bdf_download_resp_msg_v01_ei,2362&resp);2363if (ret < 0)2364goto out;23652366ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf download req fixed addr type %d\n",2367type);23682369ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2370QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,2371QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,2372qmi_wlanfw_bdf_download_req_msg_v01_ei, req);2373if (ret < 0) {2374qmi_txn_cancel(&txn);2375goto out;2376}23772378ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2379if (ret < 0)2380goto out;23812382if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {2383ath12k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n",2384resp.resp.result, resp.resp.error);2385ret = -EINVAL;2386goto out;2387}23882389if (type == ATH12K_QMI_FILE_TYPE_EEPROM) {2390remaining = 0;2391} else {2392remaining -= req->data_len;2393temp += req->data_len;2394req->seg_id++;2395ath12k_dbg(ab, ATH12K_DBG_QMI,2396"qmi bdf download request remaining %i\n",2397remaining);2398}2399}24002401out:2402kfree(req);2403return ret;2404}24052406static int ath12k_qmi_load_bdf_qmi(struct ath12k_base *ab,2407enum ath12k_qmi_bdf_type type)2408{2409struct device *dev = ab->dev;2410char filename[ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE];2411const struct firmware *fw_entry;2412struct ath12k_board_data bd;2413u32 fw_size, file_type;2414int ret = 0;2415const u8 *tmp;24162417memset(&bd, 0, sizeof(bd));24182419switch (type) {2420case ATH12K_QMI_BDF_TYPE_ELF:2421ret = ath12k_core_fetch_bdf(ab, &bd);2422if (ret) {2423ath12k_warn(ab, "qmi failed to load bdf:\n");2424goto out;2425}24262427if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0)2428type = ATH12K_QMI_BDF_TYPE_ELF;2429else2430type = ATH12K_QMI_BDF_TYPE_BIN;24312432break;2433case ATH12K_QMI_BDF_TYPE_REGDB:2434ret = ath12k_core_fetch_board_data_api_1(ab, &bd,2435ATH12K_REGDB_FILE_NAME);2436if (ret) {2437ath12k_warn(ab, "qmi failed to load regdb bin:\n");2438goto out;2439}2440break;2441case ATH12K_QMI_BDF_TYPE_CALIBRATION:24422443if (ab->qmi.target.eeprom_caldata) {2444file_type = ATH12K_QMI_FILE_TYPE_EEPROM;2445tmp = filename;2446fw_size = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE;2447} else {2448file_type = ATH12K_QMI_FILE_TYPE_CALDATA;24492450/* cal-<bus>-<id>.bin */2451snprintf(filename, sizeof(filename), "cal-%s-%s.bin",2452ath12k_bus_str(ab->hif.bus), dev_name(dev));2453fw_entry = ath12k_core_firmware_request(ab, filename);2454if (!IS_ERR(fw_entry))2455goto success;24562457fw_entry = ath12k_core_firmware_request(ab,2458ATH12K_DEFAULT_CAL_FILE);2459if (IS_ERR(fw_entry)) {2460ret = PTR_ERR(fw_entry);2461ath12k_warn(ab,2462"qmi failed to load CAL data file:%s\n",2463filename);2464goto out;2465}24662467success:2468fw_size = min_t(u32, ab->hw_params->fw.board_size,2469fw_entry->size);2470tmp = fw_entry->data;2471}2472ret = ath12k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type);2473if (ret < 0) {2474ath12k_warn(ab, "qmi failed to load caldata\n");2475goto out_qmi_cal;2476}24772478ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi caldata downloaded: type: %u\n",2479file_type);24802481out_qmi_cal:2482if (!ab->qmi.target.eeprom_caldata)2483release_firmware(fw_entry);2484return ret;2485default:2486ath12k_warn(ab, "unknown file type for load %d", type);2487goto out;2488}24892490ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf_type %d\n", type);24912492fw_size = min_t(u32, ab->hw_params->fw.board_size, bd.len);24932494ret = ath12k_qmi_load_file_target_mem(ab, bd.data, fw_size, type);2495if (ret < 0)2496ath12k_warn(ab, "qmi failed to load bdf file\n");24972498out:2499ath12k_core_free_bdf(ab, &bd);2500ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi BDF download sequence completed\n");25012502return ret;2503}25042505static int ath12k_qmi_m3_load(struct ath12k_base *ab)2506{2507struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;2508const struct firmware *fw;2509char path[100];2510int ret;25112512if (m3_mem->vaddr || m3_mem->size)2513return 0;25142515fw = ath12k_core_firmware_request(ab, ATH12K_M3_FILE);2516if (IS_ERR(fw)) {2517ret = PTR_ERR(fw);2518ath12k_core_create_firmware_path(ab, ATH12K_M3_FILE,2519path, sizeof(path));2520ath12k_err(ab, "failed to load %s: %d\n", path, ret);2521return ret;2522}25232524m3_mem->vaddr = dma_alloc_coherent(ab->dev,2525fw->size, &m3_mem->paddr,2526GFP_KERNEL);2527if (!m3_mem->vaddr) {2528ath12k_err(ab, "failed to allocate memory for M3 with size %zu\n",2529fw->size);2530release_firmware(fw);2531return -ENOMEM;2532}25332534memcpy(m3_mem->vaddr, fw->data, fw->size);2535m3_mem->size = fw->size;2536release_firmware(fw);25372538return 0;2539}25402541static void ath12k_qmi_m3_free(struct ath12k_base *ab)2542{2543struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;25442545if (!m3_mem->vaddr)2546return;25472548dma_free_coherent(ab->dev, m3_mem->size,2549m3_mem->vaddr, m3_mem->paddr);2550m3_mem->vaddr = NULL;2551}25522553static int ath12k_qmi_wlanfw_m3_info_send(struct ath12k_base *ab)2554{2555struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;2556struct qmi_wlanfw_m3_info_req_msg_v01 req;2557struct qmi_wlanfw_m3_info_resp_msg_v01 resp;2558struct qmi_txn txn = {};2559int ret = 0;25602561memset(&req, 0, sizeof(req));2562memset(&resp, 0, sizeof(resp));25632564ret = ath12k_qmi_m3_load(ab);2565if (ret) {2566ath12k_err(ab, "failed to load m3 firmware: %d", ret);2567return ret;2568}25692570req.addr = m3_mem->paddr;2571req.size = m3_mem->size;25722573ret = qmi_txn_init(&ab->qmi.handle, &txn,2574qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp);2575if (ret < 0)2576goto out;25772578ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2579QMI_WLANFW_M3_INFO_REQ_V01,2580QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN,2581qmi_wlanfw_m3_info_req_msg_v01_ei, &req);2582if (ret < 0) {2583ath12k_warn(ab, "qmi failed to send M3 information request, err = %d\n",2584ret);2585goto out;2586}25872588ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2589if (ret < 0) {2590ath12k_warn(ab, "qmi failed M3 information request %d\n", ret);2591goto out;2592}25932594if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {2595ath12k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n",2596resp.resp.result, resp.resp.error);2597ret = -EINVAL;2598goto out;2599}2600out:2601return ret;2602}26032604static int ath12k_qmi_wlanfw_mode_send(struct ath12k_base *ab,2605u32 mode)2606{2607struct qmi_wlanfw_wlan_mode_req_msg_v01 req;2608struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp;2609struct qmi_txn txn = {};2610int ret = 0;26112612memset(&req, 0, sizeof(req));2613memset(&resp, 0, sizeof(resp));26142615req.mode = mode;2616req.hw_debug_valid = 1;2617req.hw_debug = 0;26182619ret = qmi_txn_init(&ab->qmi.handle, &txn,2620qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp);2621if (ret < 0)2622goto out;26232624ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2625QMI_WLANFW_WLAN_MODE_REQ_V01,2626QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN,2627qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req);2628if (ret < 0) {2629ath12k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n",2630mode, ret);2631goto out;2632}26332634ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2635if (ret < 0) {2636if (mode == ATH12K_FIRMWARE_MODE_OFF && ret == -ENETRESET) {2637ath12k_warn(ab, "WLFW service is dis-connected\n");2638return 0;2639}2640ath12k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n",2641mode, ret);2642goto out;2643}26442645if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {2646ath12k_warn(ab, "Mode request failed, mode: %d, result: %d err: %d\n",2647mode, resp.resp.result, resp.resp.error);2648ret = -EINVAL;2649goto out;2650}26512652out:2653return ret;2654}26552656static int ath12k_qmi_wlanfw_wlan_cfg_send(struct ath12k_base *ab)2657{2658struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req;2659struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp;2660#if defined(__linux__)2661struct ce_pipe_config *ce_cfg;2662struct service_to_pipe *svc_cfg;2663#elif defined(__FreeBSD__)2664const struct ce_pipe_config *ce_cfg;2665const struct service_to_pipe *svc_cfg;2666#endif2667struct qmi_txn txn = {};2668int ret = 0, pipe_num;26692670#if defined(__linux__)2671ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce;2672svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map;2673#elif defined(__FreeBSD__)2674ce_cfg = ab->qmi.ce_cfg.tgt_ce;2675svc_cfg = ab->qmi.ce_cfg.svc_to_ce_map;2676#endif26772678req = kzalloc(sizeof(*req), GFP_KERNEL);2679if (!req)2680return -ENOMEM;26812682memset(&resp, 0, sizeof(resp));26832684req->host_version_valid = 1;2685strscpy(req->host_version, ATH12K_HOST_VERSION_STRING,2686sizeof(req->host_version));26872688req->tgt_cfg_valid = 1;2689/* This is number of CE configs */2690req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;2691for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) {2692req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;2693req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;2694req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;2695req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;2696req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;2697}26982699req->svc_cfg_valid = 1;2700/* This is number of Service/CE configs */2701req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;2702for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {2703req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;2704req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;2705req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;2706}27072708/* set shadow v3 configuration */2709if (ab->hw_params->supports_shadow_regs) {2710req->shadow_reg_v3_valid = 1;2711req->shadow_reg_v3_len = min_t(u32,2712ab->qmi.ce_cfg.shadow_reg_v3_len,2713QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01);2714memcpy(&req->shadow_reg_v3, ab->qmi.ce_cfg.shadow_reg_v3,2715sizeof(u32) * req->shadow_reg_v3_len);2716} else {2717req->shadow_reg_v3_valid = 0;2718}27192720ret = qmi_txn_init(&ab->qmi.handle, &txn,2721qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp);2722if (ret < 0)2723goto out;27242725ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,2726QMI_WLANFW_WLAN_CFG_REQ_V01,2727QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN,2728qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req);2729if (ret < 0) {2730ath12k_warn(ab, "qmi failed to send wlan config request, err = %d\n",2731ret);2732goto out;2733}27342735ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));2736if (ret < 0) {2737ath12k_warn(ab, "qmi failed wlan config request, err = %d\n", ret);2738goto out;2739}27402741if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {2742ath12k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n",2743resp.resp.result, resp.resp.error);2744ret = -EINVAL;2745goto out;2746}27472748out:2749kfree(req);2750return ret;2751}27522753void ath12k_qmi_firmware_stop(struct ath12k_base *ab)2754{2755int ret;27562757ret = ath12k_qmi_wlanfw_mode_send(ab, ATH12K_FIRMWARE_MODE_OFF);2758if (ret < 0) {2759ath12k_warn(ab, "qmi failed to send wlan mode off\n");2760return;2761}2762}27632764int ath12k_qmi_firmware_start(struct ath12k_base *ab,2765u32 mode)2766{2767int ret;27682769ret = ath12k_qmi_wlanfw_wlan_cfg_send(ab);2770if (ret < 0) {2771ath12k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret);2772return ret;2773}27742775ret = ath12k_qmi_wlanfw_mode_send(ab, mode);2776if (ret < 0) {2777ath12k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret);2778return ret;2779}27802781return 0;2782}27832784static int2785ath12k_qmi_driver_event_post(struct ath12k_qmi *qmi,2786enum ath12k_qmi_event_type type,2787void *data)2788{2789struct ath12k_qmi_driver_event *event;27902791event = kzalloc(sizeof(*event), GFP_ATOMIC);2792if (!event)2793return -ENOMEM;27942795event->type = type;2796event->data = data;27972798spin_lock(&qmi->event_lock);2799list_add_tail(&event->list, &qmi->event_list);2800spin_unlock(&qmi->event_lock);28012802queue_work(qmi->event_wq, &qmi->event_work);28032804return 0;2805}28062807static int ath12k_qmi_event_server_arrive(struct ath12k_qmi *qmi)2808{2809struct ath12k_base *ab = qmi->ab;2810int ret;28112812ret = ath12k_qmi_fw_ind_register_send(ab);2813if (ret < 0) {2814ath12k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret);2815return ret;2816}28172818ret = ath12k_qmi_host_cap_send(ab);2819if (ret < 0) {2820ath12k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret);2821return ret;2822}28232824return ret;2825}28262827static int ath12k_qmi_event_mem_request(struct ath12k_qmi *qmi)2828{2829struct ath12k_base *ab = qmi->ab;2830int ret;28312832ret = ath12k_qmi_respond_fw_mem_request(ab);2833if (ret < 0) {2834ath12k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret);2835return ret;2836}28372838return ret;2839}28402841static int ath12k_qmi_event_load_bdf(struct ath12k_qmi *qmi)2842{2843struct ath12k_base *ab = qmi->ab;2844int ret;28452846ret = ath12k_qmi_request_target_cap(ab);2847if (ret < 0) {2848ath12k_warn(ab, "qmi failed to req target capabilities:%d\n", ret);2849return ret;2850}28512852ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_REGDB);2853if (ret < 0) {2854ath12k_warn(ab, "qmi failed to load regdb file:%d\n", ret);2855return ret;2856}28572858ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_ELF);2859if (ret < 0) {2860ath12k_warn(ab, "qmi failed to load board data file:%d\n", ret);2861return ret;2862}28632864if (ab->hw_params->download_calib) {2865ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_CALIBRATION);2866if (ret < 0)2867ath12k_warn(ab, "qmi failed to load calibrated data :%d\n", ret);2868}28692870ret = ath12k_qmi_wlanfw_m3_info_send(ab);2871if (ret < 0) {2872ath12k_warn(ab, "qmi failed to send m3 info req:%d\n", ret);2873return ret;2874}28752876return ret;2877}28782879static void ath12k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,2880struct sockaddr_qrtr *sq,2881struct qmi_txn *txn,2882const void *data)2883{2884struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);2885struct ath12k_base *ab = qmi->ab;2886const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data;2887int i, ret;28882889ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware request memory request\n");28902891if (msg->mem_seg_len == 0 ||2892msg->mem_seg_len > ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01)2893ath12k_warn(ab, "Invalid memory segment length: %u\n",2894msg->mem_seg_len);28952896ab->qmi.mem_seg_count = msg->mem_seg_len;28972898for (i = 0; i < qmi->mem_seg_count ; i++) {2899ab->qmi.target_mem[i].type = msg->mem_seg[i].type;2900ab->qmi.target_mem[i].size = msg->mem_seg[i].size;2901ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi mem seg type %d size %d\n",2902msg->mem_seg[i].type, msg->mem_seg[i].size);2903}29042905ret = ath12k_qmi_alloc_target_mem_chunk(ab);2906if (ret) {2907ath12k_warn(ab, "qmi failed to alloc target memory: %d\n",2908ret);2909return;2910}29112912ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_REQUEST_MEM, NULL);2913}29142915static void ath12k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl,2916struct sockaddr_qrtr *sq,2917struct qmi_txn *txn,2918const void *decoded)2919{2920struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);2921struct ath12k_base *ab = qmi->ab;29222923ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware memory ready indication\n");2924ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_MEM_READY, NULL);2925}29262927static void ath12k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl,2928struct sockaddr_qrtr *sq,2929struct qmi_txn *txn,2930const void *decoded)2931{2932struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);2933struct ath12k_base *ab = qmi->ab;29342935ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware ready\n");2936ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_READY, NULL);2937}29382939static const struct qmi_msg_handler ath12k_qmi_msg_handlers[] = {2940{2941.type = QMI_INDICATION,2942.msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,2943.ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,2944.decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01),2945.fn = ath12k_qmi_msg_mem_request_cb,2946},2947{2948.type = QMI_INDICATION,2949.msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,2950.ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,2951.decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01),2952.fn = ath12k_qmi_msg_mem_ready_cb,2953},2954{2955.type = QMI_INDICATION,2956.msg_id = QMI_WLFW_FW_READY_IND_V01,2957.ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,2958.decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01),2959.fn = ath12k_qmi_msg_fw_ready_cb,2960},2961};29622963static int ath12k_qmi_ops_new_server(struct qmi_handle *qmi_hdl,2964struct qmi_service *service)2965{2966struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);2967struct ath12k_base *ab = qmi->ab;2968struct sockaddr_qrtr *sq = &qmi->sq;2969int ret;29702971sq->sq_family = AF_QIPCRTR;2972sq->sq_node = service->node;2973sq->sq_port = service->port;29742975ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq,2976sizeof(*sq), 0);2977if (ret) {2978ath12k_warn(ab, "qmi failed to connect to remote service %d\n", ret);2979return ret;2980}29812982ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw qmi service connected\n");2983ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_ARRIVE, NULL);29842985return ret;2986}29872988static void ath12k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,2989struct qmi_service *service)2990{2991struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);2992struct ath12k_base *ab = qmi->ab;29932994ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw del server\n");2995ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_EXIT, NULL);2996}29972998static const struct qmi_ops ath12k_qmi_ops = {2999.new_server = ath12k_qmi_ops_new_server,3000.del_server = ath12k_qmi_ops_del_server,3001};30023003static void ath12k_qmi_driver_event_work(struct work_struct *work)3004{3005struct ath12k_qmi *qmi = container_of(work, struct ath12k_qmi,3006event_work);3007struct ath12k_qmi_driver_event *event;3008struct ath12k_base *ab = qmi->ab;3009int ret;30103011spin_lock(&qmi->event_lock);3012while (!list_empty(&qmi->event_list)) {3013event = list_first_entry(&qmi->event_list,3014struct ath12k_qmi_driver_event, list);3015list_del(&event->list);3016spin_unlock(&qmi->event_lock);30173018if (test_bit(ATH12K_FLAG_UNREGISTERING, &ab->dev_flags))3019goto skip;30203021switch (event->type) {3022case ATH12K_QMI_EVENT_SERVER_ARRIVE:3023ret = ath12k_qmi_event_server_arrive(qmi);3024if (ret < 0)3025set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);3026break;3027case ATH12K_QMI_EVENT_SERVER_EXIT:3028set_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags);3029set_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags);3030break;3031case ATH12K_QMI_EVENT_REQUEST_MEM:3032ret = ath12k_qmi_event_mem_request(qmi);3033if (ret < 0)3034set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);3035break;3036case ATH12K_QMI_EVENT_FW_MEM_READY:3037ret = ath12k_qmi_event_load_bdf(qmi);3038if (ret < 0)3039set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);3040break;3041case ATH12K_QMI_EVENT_FW_READY:3042clear_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);3043if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) {3044ath12k_hal_dump_srng_stats(ab);3045queue_work(ab->workqueue, &ab->restart_work);3046break;3047}30483049clear_bit(ATH12K_FLAG_CRASH_FLUSH,3050&ab->dev_flags);3051clear_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags);3052ath12k_core_qmi_firmware_ready(ab);3053set_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags);30543055break;3056default:3057ath12k_warn(ab, "invalid event type: %d", event->type);3058break;3059}30603061skip:3062kfree(event);3063spin_lock(&qmi->event_lock);3064}3065spin_unlock(&qmi->event_lock);3066}30673068int ath12k_qmi_init_service(struct ath12k_base *ab)3069{3070int ret;30713072memset(&ab->qmi.target, 0, sizeof(struct target_info));3073memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk));3074ab->qmi.ab = ab;30753076ab->qmi.target_mem_mode = ATH12K_QMI_TARGET_MEM_MODE_DEFAULT;3077ret = qmi_handle_init(&ab->qmi.handle, ATH12K_QMI_RESP_LEN_MAX,3078&ath12k_qmi_ops, ath12k_qmi_msg_handlers);3079if (ret < 0) {3080ath12k_warn(ab, "failed to initialize qmi handle\n");3081return ret;3082}30833084ab->qmi.event_wq = alloc_ordered_workqueue("ath12k_qmi_driver_event", 0);3085if (!ab->qmi.event_wq) {3086ath12k_err(ab, "failed to allocate workqueue\n");3087return -EFAULT;3088}30893090INIT_LIST_HEAD(&ab->qmi.event_list);3091spin_lock_init(&ab->qmi.event_lock);3092INIT_WORK(&ab->qmi.event_work, ath12k_qmi_driver_event_work);30933094ret = qmi_add_lookup(&ab->qmi.handle, ATH12K_QMI_WLFW_SERVICE_ID_V01,3095ATH12K_QMI_WLFW_SERVICE_VERS_V01,3096ab->qmi.service_ins_id);3097if (ret < 0) {3098ath12k_warn(ab, "failed to add qmi lookup\n");3099destroy_workqueue(ab->qmi.event_wq);3100return ret;3101}31023103return ret;3104}31053106void ath12k_qmi_deinit_service(struct ath12k_base *ab)3107{3108qmi_handle_release(&ab->qmi.handle);3109cancel_work_sync(&ab->qmi.event_work);3110destroy_workqueue(ab->qmi.event_wq);3111ath12k_qmi_m3_free(ab);3112ath12k_qmi_free_target_mem_chunk(ab);3113}311431153116