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