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