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