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