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