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