treewide: remove redundant IS_ERR() before error code check
[linux/fpc-iii.git] / drivers / net / wireless / ath / ath11k / qmi.c
blob2377895a58ecf2cb8c643f63214cb8c1a969ca91
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 */
6 #include "qmi.h"
7 #include "core.h"
8 #include "debug.h"
9 #include <linux/of.h>
10 #include <linux/firmware.h>
12 static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = {
14 .data_type = QMI_OPT_FLAG,
15 .elem_len = 1,
16 .elem_size = sizeof(u8),
17 .array_type = NO_ARRAY,
18 .tlv_type = 0x10,
19 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
20 num_clients_valid),
23 .data_type = QMI_UNSIGNED_4_BYTE,
24 .elem_len = 1,
25 .elem_size = sizeof(u32),
26 .array_type = NO_ARRAY,
27 .tlv_type = 0x10,
28 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
29 num_clients),
32 .data_type = QMI_OPT_FLAG,
33 .elem_len = 1,
34 .elem_size = sizeof(u8),
35 .array_type = NO_ARRAY,
36 .tlv_type = 0x11,
37 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
38 wake_msi_valid),
41 .data_type = QMI_UNSIGNED_4_BYTE,
42 .elem_len = 1,
43 .elem_size = sizeof(u32),
44 .array_type = NO_ARRAY,
45 .tlv_type = 0x11,
46 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
47 wake_msi),
50 .data_type = QMI_OPT_FLAG,
51 .elem_len = 1,
52 .elem_size = sizeof(u8),
53 .array_type = NO_ARRAY,
54 .tlv_type = 0x12,
55 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
56 gpios_valid),
59 .data_type = QMI_DATA_LEN,
60 .elem_len = 1,
61 .elem_size = sizeof(u8),
62 .array_type = NO_ARRAY,
63 .tlv_type = 0x12,
64 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
65 gpios_len),
68 .data_type = QMI_UNSIGNED_4_BYTE,
69 .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,
70 .elem_size = sizeof(u32),
71 .array_type = VAR_LEN_ARRAY,
72 .tlv_type = 0x12,
73 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
74 gpios),
77 .data_type = QMI_OPT_FLAG,
78 .elem_len = 1,
79 .elem_size = sizeof(u8),
80 .array_type = NO_ARRAY,
81 .tlv_type = 0x13,
82 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
83 nm_modem_valid),
86 .data_type = QMI_UNSIGNED_1_BYTE,
87 .elem_len = 1,
88 .elem_size = sizeof(u8),
89 .array_type = NO_ARRAY,
90 .tlv_type = 0x13,
91 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
92 nm_modem),
95 .data_type = QMI_OPT_FLAG,
96 .elem_len = 1,
97 .elem_size = sizeof(u8),
98 .array_type = NO_ARRAY,
99 .tlv_type = 0x14,
100 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
101 bdf_support_valid),
104 .data_type = QMI_UNSIGNED_1_BYTE,
105 .elem_len = 1,
106 .elem_size = sizeof(u8),
107 .array_type = NO_ARRAY,
108 .tlv_type = 0x14,
109 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
110 bdf_support),
113 .data_type = QMI_OPT_FLAG,
114 .elem_len = 1,
115 .elem_size = sizeof(u8),
116 .array_type = NO_ARRAY,
117 .tlv_type = 0x15,
118 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
119 bdf_cache_support_valid),
122 .data_type = QMI_UNSIGNED_1_BYTE,
123 .elem_len = 1,
124 .elem_size = sizeof(u8),
125 .array_type = NO_ARRAY,
126 .tlv_type = 0x15,
127 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
128 bdf_cache_support),
131 .data_type = QMI_OPT_FLAG,
132 .elem_len = 1,
133 .elem_size = sizeof(u8),
134 .array_type = NO_ARRAY,
135 .tlv_type = 0x16,
136 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
137 m3_support_valid),
140 .data_type = QMI_UNSIGNED_1_BYTE,
141 .elem_len = 1,
142 .elem_size = sizeof(u8),
143 .array_type = NO_ARRAY,
144 .tlv_type = 0x16,
145 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
146 m3_support),
149 .data_type = QMI_OPT_FLAG,
150 .elem_len = 1,
151 .elem_size = sizeof(u8),
152 .array_type = NO_ARRAY,
153 .tlv_type = 0x17,
154 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
155 m3_cache_support_valid),
158 .data_type = QMI_UNSIGNED_1_BYTE,
159 .elem_len = 1,
160 .elem_size = sizeof(u8),
161 .array_type = NO_ARRAY,
162 .tlv_type = 0x17,
163 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
164 m3_cache_support),
167 .data_type = QMI_OPT_FLAG,
168 .elem_len = 1,
169 .elem_size = sizeof(u8),
170 .array_type = NO_ARRAY,
171 .tlv_type = 0x18,
172 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
173 cal_filesys_support_valid),
176 .data_type = QMI_UNSIGNED_1_BYTE,
177 .elem_len = 1,
178 .elem_size = sizeof(u8),
179 .array_type = NO_ARRAY,
180 .tlv_type = 0x18,
181 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
182 cal_filesys_support),
185 .data_type = QMI_OPT_FLAG,
186 .elem_len = 1,
187 .elem_size = sizeof(u8),
188 .array_type = NO_ARRAY,
189 .tlv_type = 0x19,
190 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
191 cal_cache_support_valid),
194 .data_type = QMI_UNSIGNED_1_BYTE,
195 .elem_len = 1,
196 .elem_size = sizeof(u8),
197 .array_type = NO_ARRAY,
198 .tlv_type = 0x19,
199 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
200 cal_cache_support),
203 .data_type = QMI_OPT_FLAG,
204 .elem_len = 1,
205 .elem_size = sizeof(u8),
206 .array_type = NO_ARRAY,
207 .tlv_type = 0x1A,
208 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
209 cal_done_valid),
212 .data_type = QMI_UNSIGNED_1_BYTE,
213 .elem_len = 1,
214 .elem_size = sizeof(u8),
215 .array_type = NO_ARRAY,
216 .tlv_type = 0x1A,
217 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
218 cal_done),
221 .data_type = QMI_OPT_FLAG,
222 .elem_len = 1,
223 .elem_size = sizeof(u8),
224 .array_type = NO_ARRAY,
225 .tlv_type = 0x1B,
226 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
227 mem_bucket_valid),
230 .data_type = QMI_UNSIGNED_4_BYTE,
231 .elem_len = 1,
232 .elem_size = sizeof(u32),
233 .array_type = NO_ARRAY,
234 .tlv_type = 0x1B,
235 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
236 mem_bucket),
239 .data_type = QMI_OPT_FLAG,
240 .elem_len = 1,
241 .elem_size = sizeof(u8),
242 .array_type = NO_ARRAY,
243 .tlv_type = 0x1C,
244 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
245 mem_cfg_mode_valid),
248 .data_type = QMI_UNSIGNED_1_BYTE,
249 .elem_len = 1,
250 .elem_size = sizeof(u8),
251 .array_type = NO_ARRAY,
252 .tlv_type = 0x1C,
253 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
254 mem_cfg_mode),
257 .data_type = QMI_EOTI,
258 .array_type = NO_ARRAY,
259 .tlv_type = QMI_COMMON_TLV_TYPE,
263 static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = {
265 .data_type = QMI_STRUCT,
266 .elem_len = 1,
267 .elem_size = sizeof(struct qmi_response_type_v01),
268 .array_type = NO_ARRAY,
269 .tlv_type = 0x02,
270 .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp),
271 .ei_array = qmi_response_type_v01_ei,
274 .data_type = QMI_EOTI,
275 .array_type = NO_ARRAY,
276 .tlv_type = QMI_COMMON_TLV_TYPE,
280 static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = {
282 .data_type = QMI_OPT_FLAG,
283 .elem_len = 1,
284 .elem_size = sizeof(u8),
285 .array_type = NO_ARRAY,
286 .tlv_type = 0x10,
287 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
288 fw_ready_enable_valid),
291 .data_type = QMI_UNSIGNED_1_BYTE,
292 .elem_len = 1,
293 .elem_size = sizeof(u8),
294 .array_type = NO_ARRAY,
295 .tlv_type = 0x10,
296 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
297 fw_ready_enable),
300 .data_type = QMI_OPT_FLAG,
301 .elem_len = 1,
302 .elem_size = sizeof(u8),
303 .array_type = NO_ARRAY,
304 .tlv_type = 0x11,
305 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
306 initiate_cal_download_enable_valid),
309 .data_type = QMI_UNSIGNED_1_BYTE,
310 .elem_len = 1,
311 .elem_size = sizeof(u8),
312 .array_type = NO_ARRAY,
313 .tlv_type = 0x11,
314 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
315 initiate_cal_download_enable),
318 .data_type = QMI_OPT_FLAG,
319 .elem_len = 1,
320 .elem_size = sizeof(u8),
321 .array_type = NO_ARRAY,
322 .tlv_type = 0x12,
323 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
324 initiate_cal_update_enable_valid),
327 .data_type = QMI_UNSIGNED_1_BYTE,
328 .elem_len = 1,
329 .elem_size = sizeof(u8),
330 .array_type = NO_ARRAY,
331 .tlv_type = 0x12,
332 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
333 initiate_cal_update_enable),
336 .data_type = QMI_OPT_FLAG,
337 .elem_len = 1,
338 .elem_size = sizeof(u8),
339 .array_type = NO_ARRAY,
340 .tlv_type = 0x13,
341 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
342 msa_ready_enable_valid),
345 .data_type = QMI_UNSIGNED_1_BYTE,
346 .elem_len = 1,
347 .elem_size = sizeof(u8),
348 .array_type = NO_ARRAY,
349 .tlv_type = 0x13,
350 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
351 msa_ready_enable),
354 .data_type = QMI_OPT_FLAG,
355 .elem_len = 1,
356 .elem_size = sizeof(u8),
357 .array_type = NO_ARRAY,
358 .tlv_type = 0x14,
359 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
360 pin_connect_result_enable_valid),
363 .data_type = QMI_UNSIGNED_1_BYTE,
364 .elem_len = 1,
365 .elem_size = sizeof(u8),
366 .array_type = NO_ARRAY,
367 .tlv_type = 0x14,
368 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
369 pin_connect_result_enable),
372 .data_type = QMI_OPT_FLAG,
373 .elem_len = 1,
374 .elem_size = sizeof(u8),
375 .array_type = NO_ARRAY,
376 .tlv_type = 0x15,
377 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
378 client_id_valid),
381 .data_type = QMI_UNSIGNED_4_BYTE,
382 .elem_len = 1,
383 .elem_size = sizeof(u32),
384 .array_type = NO_ARRAY,
385 .tlv_type = 0x15,
386 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
387 client_id),
390 .data_type = QMI_OPT_FLAG,
391 .elem_len = 1,
392 .elem_size = sizeof(u8),
393 .array_type = NO_ARRAY,
394 .tlv_type = 0x16,
395 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
396 request_mem_enable_valid),
399 .data_type = QMI_UNSIGNED_1_BYTE,
400 .elem_len = 1,
401 .elem_size = sizeof(u8),
402 .array_type = NO_ARRAY,
403 .tlv_type = 0x16,
404 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
405 request_mem_enable),
408 .data_type = QMI_OPT_FLAG,
409 .elem_len = 1,
410 .elem_size = sizeof(u8),
411 .array_type = NO_ARRAY,
412 .tlv_type = 0x17,
413 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
414 fw_mem_ready_enable_valid),
417 .data_type = QMI_UNSIGNED_1_BYTE,
418 .elem_len = 1,
419 .elem_size = sizeof(u8),
420 .array_type = NO_ARRAY,
421 .tlv_type = 0x17,
422 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
423 fw_mem_ready_enable),
426 .data_type = QMI_OPT_FLAG,
427 .elem_len = 1,
428 .elem_size = sizeof(u8),
429 .array_type = NO_ARRAY,
430 .tlv_type = 0x18,
431 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
432 fw_init_done_enable_valid),
435 .data_type = QMI_UNSIGNED_1_BYTE,
436 .elem_len = 1,
437 .elem_size = sizeof(u8),
438 .array_type = NO_ARRAY,
439 .tlv_type = 0x18,
440 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
441 fw_init_done_enable),
445 .data_type = QMI_OPT_FLAG,
446 .elem_len = 1,
447 .elem_size = sizeof(u8),
448 .array_type = NO_ARRAY,
449 .tlv_type = 0x19,
450 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
451 rejuvenate_enable_valid),
454 .data_type = QMI_UNSIGNED_1_BYTE,
455 .elem_len = 1,
456 .elem_size = sizeof(u8),
457 .array_type = NO_ARRAY,
458 .tlv_type = 0x19,
459 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
460 rejuvenate_enable),
463 .data_type = QMI_OPT_FLAG,
464 .elem_len = 1,
465 .elem_size = sizeof(u8),
466 .array_type = NO_ARRAY,
467 .tlv_type = 0x1A,
468 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
469 xo_cal_enable_valid),
472 .data_type = QMI_UNSIGNED_1_BYTE,
473 .elem_len = 1,
474 .elem_size = sizeof(u8),
475 .array_type = NO_ARRAY,
476 .tlv_type = 0x1A,
477 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
478 xo_cal_enable),
481 .data_type = QMI_OPT_FLAG,
482 .elem_len = 1,
483 .elem_size = sizeof(u8),
484 .array_type = NO_ARRAY,
485 .tlv_type = 0x1B,
486 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
487 cal_done_enable_valid),
490 .data_type = QMI_UNSIGNED_1_BYTE,
491 .elem_len = 1,
492 .elem_size = sizeof(u8),
493 .array_type = NO_ARRAY,
494 .tlv_type = 0x1B,
495 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
496 cal_done_enable),
499 .data_type = QMI_EOTI,
500 .array_type = NO_ARRAY,
501 .tlv_type = QMI_COMMON_TLV_TYPE,
505 static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = {
507 .data_type = QMI_STRUCT,
508 .elem_len = 1,
509 .elem_size = sizeof(struct qmi_response_type_v01),
510 .array_type = NO_ARRAY,
511 .tlv_type = 0x02,
512 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
513 resp),
514 .ei_array = qmi_response_type_v01_ei,
517 .data_type = QMI_OPT_FLAG,
518 .elem_len = 1,
519 .elem_size = sizeof(u8),
520 .array_type = NO_ARRAY,
521 .tlv_type = 0x10,
522 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
523 fw_status_valid),
526 .data_type = QMI_UNSIGNED_8_BYTE,
527 .elem_len = 1,
528 .elem_size = sizeof(u64),
529 .array_type = NO_ARRAY,
530 .tlv_type = 0x10,
531 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
532 fw_status),
535 .data_type = QMI_EOTI,
536 .array_type = NO_ARRAY,
537 .tlv_type = QMI_COMMON_TLV_TYPE,
541 static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = {
543 .data_type = QMI_UNSIGNED_8_BYTE,
544 .elem_len = 1,
545 .elem_size = sizeof(u64),
546 .array_type = NO_ARRAY,
547 .tlv_type = 0,
548 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset),
551 .data_type = QMI_UNSIGNED_4_BYTE,
552 .elem_len = 1,
553 .elem_size = sizeof(u32),
554 .array_type = NO_ARRAY,
555 .tlv_type = 0,
556 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size),
559 .data_type = QMI_UNSIGNED_1_BYTE,
560 .elem_len = 1,
561 .elem_size = sizeof(u8),
562 .array_type = NO_ARRAY,
563 .tlv_type = 0,
564 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag),
567 .data_type = QMI_EOTI,
568 .array_type = NO_ARRAY,
569 .tlv_type = QMI_COMMON_TLV_TYPE,
573 static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = {
575 .data_type = QMI_UNSIGNED_4_BYTE,
576 .elem_len = 1,
577 .elem_size = sizeof(u32),
578 .array_type = NO_ARRAY,
579 .tlv_type = 0,
580 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01,
581 size),
584 .data_type = QMI_SIGNED_4_BYTE_ENUM,
585 .elem_len = 1,
586 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
587 .array_type = NO_ARRAY,
588 .tlv_type = 0,
589 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type),
592 .data_type = QMI_DATA_LEN,
593 .elem_len = 1,
594 .elem_size = sizeof(u8),
595 .array_type = NO_ARRAY,
596 .tlv_type = 0,
597 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len),
600 .data_type = QMI_STRUCT,
601 .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01,
602 .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01),
603 .array_type = VAR_LEN_ARRAY,
604 .tlv_type = 0,
605 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg),
606 .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei,
609 .data_type = QMI_EOTI,
610 .array_type = NO_ARRAY,
611 .tlv_type = QMI_COMMON_TLV_TYPE,
615 static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = {
617 .data_type = QMI_DATA_LEN,
618 .elem_len = 1,
619 .elem_size = sizeof(u8),
620 .array_type = NO_ARRAY,
621 .tlv_type = 0x01,
622 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
623 mem_seg_len),
626 .data_type = QMI_STRUCT,
627 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
628 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01),
629 .array_type = VAR_LEN_ARRAY,
630 .tlv_type = 0x01,
631 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
632 mem_seg),
633 .ei_array = qmi_wlanfw_mem_seg_s_v01_ei,
636 .data_type = QMI_EOTI,
637 .array_type = NO_ARRAY,
638 .tlv_type = QMI_COMMON_TLV_TYPE,
642 static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = {
644 .data_type = QMI_UNSIGNED_8_BYTE,
645 .elem_len = 1,
646 .elem_size = sizeof(u64),
647 .array_type = NO_ARRAY,
648 .tlv_type = 0,
649 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr),
652 .data_type = QMI_UNSIGNED_4_BYTE,
653 .elem_len = 1,
654 .elem_size = sizeof(u32),
655 .array_type = NO_ARRAY,
656 .tlv_type = 0,
657 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size),
660 .data_type = QMI_SIGNED_4_BYTE_ENUM,
661 .elem_len = 1,
662 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
663 .array_type = NO_ARRAY,
664 .tlv_type = 0,
665 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type),
668 .data_type = QMI_UNSIGNED_1_BYTE,
669 .elem_len = 1,
670 .elem_size = sizeof(u8),
671 .array_type = NO_ARRAY,
672 .tlv_type = 0,
673 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore),
676 .data_type = QMI_EOTI,
677 .array_type = NO_ARRAY,
678 .tlv_type = QMI_COMMON_TLV_TYPE,
682 static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = {
684 .data_type = QMI_DATA_LEN,
685 .elem_len = 1,
686 .elem_size = sizeof(u8),
687 .array_type = NO_ARRAY,
688 .tlv_type = 0x01,
689 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
690 mem_seg_len),
693 .data_type = QMI_STRUCT,
694 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
695 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01),
696 .array_type = VAR_LEN_ARRAY,
697 .tlv_type = 0x01,
698 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
699 mem_seg),
700 .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei,
703 .data_type = QMI_EOTI,
704 .array_type = NO_ARRAY,
705 .tlv_type = QMI_COMMON_TLV_TYPE,
709 static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = {
711 .data_type = QMI_STRUCT,
712 .elem_len = 1,
713 .elem_size = sizeof(struct qmi_response_type_v01),
714 .array_type = NO_ARRAY,
715 .tlv_type = 0x02,
716 .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01,
717 resp),
718 .ei_array = qmi_response_type_v01_ei,
721 .data_type = QMI_EOTI,
722 .array_type = NO_ARRAY,
723 .tlv_type = QMI_COMMON_TLV_TYPE,
727 static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = {
729 .data_type = QMI_EOTI,
730 .array_type = NO_ARRAY,
731 .tlv_type = QMI_COMMON_TLV_TYPE,
735 static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
737 .data_type = QMI_UNSIGNED_4_BYTE,
738 .elem_len = 1,
739 .elem_size = sizeof(u32),
740 .array_type = NO_ARRAY,
741 .tlv_type = 0,
742 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
743 chip_id),
746 .data_type = QMI_UNSIGNED_4_BYTE,
747 .elem_len = 1,
748 .elem_size = sizeof(u32),
749 .array_type = NO_ARRAY,
750 .tlv_type = 0,
751 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
752 chip_family),
755 .data_type = QMI_EOTI,
756 .array_type = NO_ARRAY,
757 .tlv_type = QMI_COMMON_TLV_TYPE,
761 static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = {
763 .data_type = QMI_UNSIGNED_4_BYTE,
764 .elem_len = 1,
765 .elem_size = sizeof(u32),
766 .array_type = NO_ARRAY,
767 .tlv_type = 0,
768 .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01,
769 board_id),
772 .data_type = QMI_EOTI,
773 .array_type = NO_ARRAY,
774 .tlv_type = QMI_COMMON_TLV_TYPE,
778 static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = {
780 .data_type = QMI_UNSIGNED_4_BYTE,
781 .elem_len = 1,
782 .elem_size = sizeof(u32),
783 .array_type = NO_ARRAY,
784 .tlv_type = 0,
785 .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id),
788 .data_type = QMI_EOTI,
789 .array_type = NO_ARRAY,
790 .tlv_type = QMI_COMMON_TLV_TYPE,
794 static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = {
796 .data_type = QMI_UNSIGNED_4_BYTE,
797 .elem_len = 1,
798 .elem_size = sizeof(u32),
799 .array_type = NO_ARRAY,
800 .tlv_type = 0,
801 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
802 fw_version),
805 .data_type = QMI_STRING,
806 .elem_len = ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1,
807 .elem_size = sizeof(char),
808 .array_type = NO_ARRAY,
809 .tlv_type = 0,
810 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
811 fw_build_timestamp),
814 .data_type = QMI_EOTI,
815 .array_type = NO_ARRAY,
816 .tlv_type = QMI_COMMON_TLV_TYPE,
820 static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = {
822 .data_type = QMI_STRUCT,
823 .elem_len = 1,
824 .elem_size = sizeof(struct qmi_response_type_v01),
825 .array_type = NO_ARRAY,
826 .tlv_type = 0x02,
827 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp),
828 .ei_array = qmi_response_type_v01_ei,
831 .data_type = QMI_OPT_FLAG,
832 .elem_len = 1,
833 .elem_size = sizeof(u8),
834 .array_type = NO_ARRAY,
835 .tlv_type = 0x10,
836 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
837 chip_info_valid),
840 .data_type = QMI_STRUCT,
841 .elem_len = 1,
842 .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01),
843 .array_type = NO_ARRAY,
844 .tlv_type = 0x10,
845 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
846 chip_info),
847 .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei,
850 .data_type = QMI_OPT_FLAG,
851 .elem_len = 1,
852 .elem_size = sizeof(u8),
853 .array_type = NO_ARRAY,
854 .tlv_type = 0x11,
855 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
856 board_info_valid),
859 .data_type = QMI_STRUCT,
860 .elem_len = 1,
861 .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01),
862 .array_type = NO_ARRAY,
863 .tlv_type = 0x11,
864 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
865 board_info),
866 .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei,
869 .data_type = QMI_OPT_FLAG,
870 .elem_len = 1,
871 .elem_size = sizeof(u8),
872 .array_type = NO_ARRAY,
873 .tlv_type = 0x12,
874 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
875 soc_info_valid),
878 .data_type = QMI_STRUCT,
879 .elem_len = 1,
880 .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01),
881 .array_type = NO_ARRAY,
882 .tlv_type = 0x12,
883 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
884 soc_info),
885 .ei_array = qmi_wlanfw_soc_info_s_v01_ei,
888 .data_type = QMI_OPT_FLAG,
889 .elem_len = 1,
890 .elem_size = sizeof(u8),
891 .array_type = NO_ARRAY,
892 .tlv_type = 0x13,
893 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
894 fw_version_info_valid),
897 .data_type = QMI_STRUCT,
898 .elem_len = 1,
899 .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01),
900 .array_type = NO_ARRAY,
901 .tlv_type = 0x13,
902 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
903 fw_version_info),
904 .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei,
907 .data_type = QMI_OPT_FLAG,
908 .elem_len = 1,
909 .elem_size = sizeof(u8),
910 .array_type = NO_ARRAY,
911 .tlv_type = 0x14,
912 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
913 fw_build_id_valid),
916 .data_type = QMI_STRING,
917 .elem_len = ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1,
918 .elem_size = sizeof(char),
919 .array_type = NO_ARRAY,
920 .tlv_type = 0x14,
921 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
922 fw_build_id),
925 .data_type = QMI_OPT_FLAG,
926 .elem_len = 1,
927 .elem_size = sizeof(u8),
928 .array_type = NO_ARRAY,
929 .tlv_type = 0x15,
930 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
931 num_macs_valid),
934 .data_type = QMI_UNSIGNED_1_BYTE,
935 .elem_len = 1,
936 .elem_size = sizeof(u8),
937 .array_type = NO_ARRAY,
938 .tlv_type = 0x15,
939 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
940 num_macs),
943 .data_type = QMI_EOTI,
944 .array_type = NO_ARRAY,
945 .tlv_type = QMI_COMMON_TLV_TYPE,
949 static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = {
951 .data_type = QMI_UNSIGNED_1_BYTE,
952 .elem_len = 1,
953 .elem_size = sizeof(u8),
954 .array_type = NO_ARRAY,
955 .tlv_type = 0x01,
956 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
957 valid),
960 .data_type = QMI_OPT_FLAG,
961 .elem_len = 1,
962 .elem_size = sizeof(u8),
963 .array_type = NO_ARRAY,
964 .tlv_type = 0x10,
965 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
966 file_id_valid),
969 .data_type = QMI_SIGNED_4_BYTE_ENUM,
970 .elem_len = 1,
971 .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01),
972 .array_type = NO_ARRAY,
973 .tlv_type = 0x10,
974 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
975 file_id),
978 .data_type = QMI_OPT_FLAG,
979 .elem_len = 1,
980 .elem_size = sizeof(u8),
981 .array_type = NO_ARRAY,
982 .tlv_type = 0x11,
983 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
984 total_size_valid),
987 .data_type = QMI_UNSIGNED_4_BYTE,
988 .elem_len = 1,
989 .elem_size = sizeof(u32),
990 .array_type = NO_ARRAY,
991 .tlv_type = 0x11,
992 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
993 total_size),
996 .data_type = QMI_OPT_FLAG,
997 .elem_len = 1,
998 .elem_size = sizeof(u8),
999 .array_type = NO_ARRAY,
1000 .tlv_type = 0x12,
1001 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1002 seg_id_valid),
1005 .data_type = QMI_UNSIGNED_4_BYTE,
1006 .elem_len = 1,
1007 .elem_size = sizeof(u32),
1008 .array_type = NO_ARRAY,
1009 .tlv_type = 0x12,
1010 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1011 seg_id),
1014 .data_type = QMI_OPT_FLAG,
1015 .elem_len = 1,
1016 .elem_size = sizeof(u8),
1017 .array_type = NO_ARRAY,
1018 .tlv_type = 0x13,
1019 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1020 data_valid),
1023 .data_type = QMI_DATA_LEN,
1024 .elem_len = 1,
1025 .elem_size = sizeof(u16),
1026 .array_type = NO_ARRAY,
1027 .tlv_type = 0x13,
1028 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1029 data_len),
1032 .data_type = QMI_UNSIGNED_1_BYTE,
1033 .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01,
1034 .elem_size = sizeof(u8),
1035 .array_type = VAR_LEN_ARRAY,
1036 .tlv_type = 0x13,
1037 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1038 data),
1041 .data_type = QMI_OPT_FLAG,
1042 .elem_len = 1,
1043 .elem_size = sizeof(u8),
1044 .array_type = NO_ARRAY,
1045 .tlv_type = 0x14,
1046 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1047 end_valid),
1050 .data_type = QMI_UNSIGNED_1_BYTE,
1051 .elem_len = 1,
1052 .elem_size = sizeof(u8),
1053 .array_type = NO_ARRAY,
1054 .tlv_type = 0x14,
1055 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1056 end),
1059 .data_type = QMI_OPT_FLAG,
1060 .elem_len = 1,
1061 .elem_size = sizeof(u8),
1062 .array_type = NO_ARRAY,
1063 .tlv_type = 0x15,
1064 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1065 bdf_type_valid),
1068 .data_type = QMI_UNSIGNED_1_BYTE,
1069 .elem_len = 1,
1070 .elem_size = sizeof(u8),
1071 .array_type = NO_ARRAY,
1072 .tlv_type = 0x15,
1073 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1074 bdf_type),
1078 .data_type = QMI_EOTI,
1079 .array_type = NO_ARRAY,
1080 .tlv_type = QMI_COMMON_TLV_TYPE,
1084 static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = {
1086 .data_type = QMI_STRUCT,
1087 .elem_len = 1,
1088 .elem_size = sizeof(struct qmi_response_type_v01),
1089 .array_type = NO_ARRAY,
1090 .tlv_type = 0x02,
1091 .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01,
1092 resp),
1093 .ei_array = qmi_response_type_v01_ei,
1096 .data_type = QMI_EOTI,
1097 .array_type = NO_ARRAY,
1098 .tlv_type = QMI_COMMON_TLV_TYPE,
1102 static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = {
1104 .data_type = QMI_UNSIGNED_8_BYTE,
1105 .elem_len = 1,
1106 .elem_size = sizeof(u64),
1107 .array_type = NO_ARRAY,
1108 .tlv_type = 0x01,
1109 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr),
1112 .data_type = QMI_UNSIGNED_4_BYTE,
1113 .elem_len = 1,
1114 .elem_size = sizeof(u32),
1115 .array_type = NO_ARRAY,
1116 .tlv_type = 0x02,
1117 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size),
1120 .data_type = QMI_EOTI,
1121 .array_type = NO_ARRAY,
1122 .tlv_type = QMI_COMMON_TLV_TYPE,
1126 static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = {
1128 .data_type = QMI_STRUCT,
1129 .elem_len = 1,
1130 .elem_size = sizeof(struct qmi_response_type_v01),
1131 .array_type = NO_ARRAY,
1132 .tlv_type = 0x02,
1133 .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp),
1134 .ei_array = qmi_response_type_v01_ei,
1137 .data_type = QMI_EOTI,
1138 .array_type = NO_ARRAY,
1139 .tlv_type = QMI_COMMON_TLV_TYPE,
1143 static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = {
1145 .data_type = QMI_UNSIGNED_4_BYTE,
1146 .elem_len = 1,
1147 .elem_size = sizeof(u32),
1148 .array_type = NO_ARRAY,
1149 .tlv_type = 0,
1150 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1151 pipe_num),
1154 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1155 .elem_len = 1,
1156 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1157 .array_type = NO_ARRAY,
1158 .tlv_type = 0,
1159 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1160 pipe_dir),
1163 .data_type = QMI_UNSIGNED_4_BYTE,
1164 .elem_len = 1,
1165 .elem_size = sizeof(u32),
1166 .array_type = NO_ARRAY,
1167 .tlv_type = 0,
1168 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1169 nentries),
1172 .data_type = QMI_UNSIGNED_4_BYTE,
1173 .elem_len = 1,
1174 .elem_size = sizeof(u32),
1175 .array_type = NO_ARRAY,
1176 .tlv_type = 0,
1177 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1178 nbytes_max),
1181 .data_type = QMI_UNSIGNED_4_BYTE,
1182 .elem_len = 1,
1183 .elem_size = sizeof(u32),
1184 .array_type = NO_ARRAY,
1185 .tlv_type = 0,
1186 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1187 flags),
1190 .data_type = QMI_EOTI,
1191 .array_type = NO_ARRAY,
1192 .tlv_type = QMI_COMMON_TLV_TYPE,
1196 static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = {
1198 .data_type = QMI_UNSIGNED_4_BYTE,
1199 .elem_len = 1,
1200 .elem_size = sizeof(u32),
1201 .array_type = NO_ARRAY,
1202 .tlv_type = 0,
1203 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1204 service_id),
1207 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1208 .elem_len = 1,
1209 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1210 .array_type = NO_ARRAY,
1211 .tlv_type = 0,
1212 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1213 pipe_dir),
1216 .data_type = QMI_UNSIGNED_4_BYTE,
1217 .elem_len = 1,
1218 .elem_size = sizeof(u32),
1219 .array_type = NO_ARRAY,
1220 .tlv_type = 0,
1221 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1222 pipe_num),
1225 .data_type = QMI_EOTI,
1226 .array_type = NO_ARRAY,
1227 .tlv_type = QMI_COMMON_TLV_TYPE,
1231 static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = {
1233 .data_type = QMI_UNSIGNED_2_BYTE,
1234 .elem_len = 1,
1235 .elem_size = sizeof(u16),
1236 .array_type = NO_ARRAY,
1237 .tlv_type = 0,
1238 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id),
1241 .data_type = QMI_UNSIGNED_2_BYTE,
1242 .elem_len = 1,
1243 .elem_size = sizeof(u16),
1244 .array_type = NO_ARRAY,
1245 .tlv_type = 0,
1246 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01,
1247 offset),
1250 .data_type = QMI_EOTI,
1251 .array_type = QMI_COMMON_TLV_TYPE,
1255 static struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = {
1257 .data_type = QMI_UNSIGNED_4_BYTE,
1258 .elem_len = 1,
1259 .elem_size = sizeof(u32),
1260 .array_type = NO_ARRAY,
1261 .tlv_type = 0,
1262 .offset = offsetof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01,
1263 addr),
1266 .data_type = QMI_EOTI,
1267 .array_type = NO_ARRAY,
1268 .tlv_type = QMI_COMMON_TLV_TYPE,
1272 static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = {
1274 .data_type = QMI_UNSIGNED_4_BYTE,
1275 .elem_len = 1,
1276 .elem_size = sizeof(u32),
1277 .array_type = NO_ARRAY,
1278 .tlv_type = 0x01,
1279 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1280 mode),
1283 .data_type = QMI_OPT_FLAG,
1284 .elem_len = 1,
1285 .elem_size = sizeof(u8),
1286 .array_type = NO_ARRAY,
1287 .tlv_type = 0x10,
1288 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1289 hw_debug_valid),
1292 .data_type = QMI_UNSIGNED_1_BYTE,
1293 .elem_len = 1,
1294 .elem_size = sizeof(u8),
1295 .array_type = NO_ARRAY,
1296 .tlv_type = 0x10,
1297 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1298 hw_debug),
1301 .data_type = QMI_EOTI,
1302 .array_type = NO_ARRAY,
1303 .tlv_type = QMI_COMMON_TLV_TYPE,
1307 static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = {
1309 .data_type = QMI_STRUCT,
1310 .elem_len = 1,
1311 .elem_size = sizeof(struct qmi_response_type_v01),
1312 .array_type = NO_ARRAY,
1313 .tlv_type = 0x02,
1314 .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01,
1315 resp),
1316 .ei_array = qmi_response_type_v01_ei,
1319 .data_type = QMI_EOTI,
1320 .array_type = NO_ARRAY,
1321 .tlv_type = QMI_COMMON_TLV_TYPE,
1325 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = {
1327 .data_type = QMI_OPT_FLAG,
1328 .elem_len = 1,
1329 .elem_size = sizeof(u8),
1330 .array_type = NO_ARRAY,
1331 .tlv_type = 0x10,
1332 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1333 host_version_valid),
1336 .data_type = QMI_STRING,
1337 .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1,
1338 .elem_size = sizeof(char),
1339 .array_type = NO_ARRAY,
1340 .tlv_type = 0x10,
1341 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1342 host_version),
1345 .data_type = QMI_OPT_FLAG,
1346 .elem_len = 1,
1347 .elem_size = sizeof(u8),
1348 .array_type = NO_ARRAY,
1349 .tlv_type = 0x11,
1350 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1351 tgt_cfg_valid),
1354 .data_type = QMI_DATA_LEN,
1355 .elem_len = 1,
1356 .elem_size = sizeof(u8),
1357 .array_type = NO_ARRAY,
1358 .tlv_type = 0x11,
1359 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1360 tgt_cfg_len),
1363 .data_type = QMI_STRUCT,
1364 .elem_len = QMI_WLANFW_MAX_NUM_CE_V01,
1365 .elem_size = sizeof(
1366 struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01),
1367 .array_type = VAR_LEN_ARRAY,
1368 .tlv_type = 0x11,
1369 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1370 tgt_cfg),
1371 .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei,
1374 .data_type = QMI_OPT_FLAG,
1375 .elem_len = 1,
1376 .elem_size = sizeof(u8),
1377 .array_type = NO_ARRAY,
1378 .tlv_type = 0x12,
1379 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1380 svc_cfg_valid),
1383 .data_type = QMI_DATA_LEN,
1384 .elem_len = 1,
1385 .elem_size = sizeof(u8),
1386 .array_type = NO_ARRAY,
1387 .tlv_type = 0x12,
1388 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1389 svc_cfg_len),
1392 .data_type = QMI_STRUCT,
1393 .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01,
1394 .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01),
1395 .array_type = VAR_LEN_ARRAY,
1396 .tlv_type = 0x12,
1397 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1398 svc_cfg),
1399 .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei,
1402 .data_type = QMI_OPT_FLAG,
1403 .elem_len = 1,
1404 .elem_size = sizeof(u8),
1405 .array_type = NO_ARRAY,
1406 .tlv_type = 0x13,
1407 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1408 shadow_reg_valid),
1411 .data_type = QMI_DATA_LEN,
1412 .elem_len = 1,
1413 .elem_size = sizeof(u8),
1414 .array_type = NO_ARRAY,
1415 .tlv_type = 0x13,
1416 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1417 shadow_reg_len),
1420 .data_type = QMI_STRUCT,
1421 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01,
1422 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01),
1423 .array_type = VAR_LEN_ARRAY,
1424 .tlv_type = 0x13,
1425 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1426 shadow_reg),
1427 .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei,
1430 .data_type = QMI_OPT_FLAG,
1431 .elem_len = 1,
1432 .elem_size = sizeof(u8),
1433 .array_type = NO_ARRAY,
1434 .tlv_type = 0x14,
1435 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1436 shadow_reg_v2_valid),
1439 .data_type = QMI_DATA_LEN,
1440 .elem_len = 1,
1441 .elem_size = sizeof(u8),
1442 .array_type = NO_ARRAY,
1443 .tlv_type = 0x14,
1444 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1445 shadow_reg_v2_len),
1448 .data_type = QMI_STRUCT,
1449 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01,
1450 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01),
1451 .array_type = VAR_LEN_ARRAY,
1452 .tlv_type = 0x14,
1453 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1454 shadow_reg_v2),
1455 .ei_array = qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei,
1458 .data_type = QMI_EOTI,
1459 .array_type = NO_ARRAY,
1460 .tlv_type = QMI_COMMON_TLV_TYPE,
1464 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = {
1466 .data_type = QMI_STRUCT,
1467 .elem_len = 1,
1468 .elem_size = sizeof(struct qmi_response_type_v01),
1469 .array_type = NO_ARRAY,
1470 .tlv_type = 0x02,
1471 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp),
1472 .ei_array = qmi_response_type_v01_ei,
1475 .data_type = QMI_EOTI,
1476 .array_type = NO_ARRAY,
1477 .tlv_type = QMI_COMMON_TLV_TYPE,
1481 static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = {
1483 .data_type = QMI_EOTI,
1484 .array_type = NO_ARRAY,
1488 static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = {
1490 .data_type = QMI_EOTI,
1491 .array_type = NO_ARRAY,
1495 static struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = {
1497 .data_type = QMI_EOTI,
1498 .array_type = NO_ARRAY,
1502 static int ath11k_qmi_host_cap_send(struct ath11k_base *ab)
1504 struct qmi_wlanfw_host_cap_req_msg_v01 req;
1505 struct qmi_wlanfw_host_cap_resp_msg_v01 resp;
1506 struct qmi_txn txn = {};
1507 int ret = 0;
1509 memset(&req, 0, sizeof(req));
1510 memset(&resp, 0, sizeof(resp));
1512 req.num_clients_valid = 1;
1513 req.num_clients = 1;
1514 req.mem_cfg_mode = ab->qmi.target_mem_mode;
1515 req.mem_cfg_mode_valid = 1;
1516 req.bdf_support_valid = 1;
1517 req.bdf_support = 1;
1519 req.m3_support_valid = 0;
1520 req.m3_support = 0;
1522 req.m3_cache_support_valid = 0;
1523 req.m3_cache_support = 0;
1525 req.cal_done_valid = 1;
1526 req.cal_done = ab->qmi.cal_done;
1528 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1529 qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp);
1530 if (ret < 0)
1531 goto out;
1533 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1534 QMI_WLANFW_HOST_CAP_REQ_V01,
1535 QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN,
1536 qmi_wlanfw_host_cap_req_msg_v01_ei, &req);
1537 if (ret < 0) {
1538 ath11k_warn(ab, "Failed to send host capability request,err = %d\n", ret);
1539 goto out;
1542 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1543 if (ret < 0)
1544 goto out;
1546 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1547 ath11k_warn(ab, "Host capability request failed, result: %d, err: %d\n",
1548 resp.resp.result, resp.resp.error);
1549 ret = -EINVAL;
1550 goto out;
1553 out:
1554 return ret;
1557 static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
1559 struct qmi_wlanfw_ind_register_req_msg_v01 *req;
1560 struct qmi_wlanfw_ind_register_resp_msg_v01 *resp;
1561 struct qmi_handle *handle = &ab->qmi.handle;
1562 struct qmi_txn txn;
1563 int ret = 0;
1565 req = kzalloc(sizeof(*req), GFP_KERNEL);
1566 if (!req)
1567 return -ENOMEM;
1569 resp = kzalloc(sizeof(*resp), GFP_KERNEL);
1570 if (!resp)
1571 goto resp_out;
1573 req->client_id_valid = 1;
1574 req->client_id = QMI_WLANFW_CLIENT_ID;
1575 req->fw_ready_enable_valid = 1;
1576 req->fw_ready_enable = 1;
1577 req->request_mem_enable_valid = 1;
1578 req->request_mem_enable = 1;
1579 req->fw_mem_ready_enable_valid = 1;
1580 req->fw_mem_ready_enable = 1;
1581 req->cal_done_enable_valid = 1;
1582 req->cal_done_enable = 1;
1583 req->fw_init_done_enable_valid = 1;
1584 req->fw_init_done_enable = 1;
1586 req->pin_connect_result_enable_valid = 0;
1587 req->pin_connect_result_enable = 0;
1589 ret = qmi_txn_init(handle, &txn,
1590 qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
1591 if (ret < 0)
1592 goto out;
1594 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1595 QMI_WLANFW_IND_REGISTER_REQ_V01,
1596 QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN,
1597 qmi_wlanfw_ind_register_req_msg_v01_ei, req);
1598 if (ret < 0) {
1599 ath11k_warn(ab, "Failed to send indication register request, err = %d\n",
1600 ret);
1601 goto out;
1604 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1605 if (ret < 0) {
1606 ath11k_warn(ab, "failed to register fw indication %d\n", ret);
1607 goto out;
1610 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
1611 ath11k_warn(ab, "FW Ind register request failed, result: %d, err: %d\n",
1612 resp->resp.result, resp->resp.error);
1613 ret = -EINVAL;
1614 goto out;
1617 out:
1618 kfree(resp);
1619 resp_out:
1620 kfree(req);
1621 return ret;
1624 static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)
1626 struct qmi_wlanfw_respond_mem_req_msg_v01 *req;
1627 struct qmi_wlanfw_respond_mem_resp_msg_v01 resp;
1628 struct qmi_txn txn = {};
1629 int ret = 0, i;
1631 req = kzalloc(sizeof(*req), GFP_KERNEL);
1632 if (!req)
1633 return -ENOMEM;
1635 memset(&resp, 0, sizeof(resp));
1637 req->mem_seg_len = ab->qmi.mem_seg_count;
1639 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1640 qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);
1641 if (ret < 0)
1642 goto out;
1644 for (i = 0; i < req->mem_seg_len ; i++) {
1645 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
1646 req->mem_seg[i].size = ab->qmi.target_mem[i].size;
1647 req->mem_seg[i].type = ab->qmi.target_mem[i].type;
1650 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1651 QMI_WLANFW_RESPOND_MEM_REQ_V01,
1652 QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,
1653 qmi_wlanfw_respond_mem_req_msg_v01_ei, req);
1654 if (ret < 0) {
1655 ath11k_warn(ab, "qmi failed to respond memory request, err = %d\n",
1656 ret);
1657 goto out;
1660 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1661 if (ret < 0) {
1662 ath11k_warn(ab, "qmi failed memory request, err = %d\n", ret);
1663 goto out;
1666 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1667 ath11k_warn(ab, "Respond mem req failed, result: %d, err: %d\n",
1668 resp.resp.result, resp.resp.error);
1669 ret = -EINVAL;
1670 goto out;
1672 out:
1673 kfree(req);
1674 return ret;
1677 static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab)
1679 int i, idx;
1681 for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
1682 switch (ab->qmi.target_mem[i].type) {
1683 case BDF_MEM_REGION_TYPE:
1684 ab->qmi.target_mem[idx].paddr = ATH11K_QMI_BDF_ADDRESS;
1685 ab->qmi.target_mem[idx].vaddr = ATH11K_QMI_BDF_ADDRESS;
1686 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
1687 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
1688 idx++;
1689 break;
1690 case CALDB_MEM_REGION_TYPE:
1691 if (ab->qmi.target_mem[i].size > ATH11K_QMI_CALDB_SIZE) {
1692 ath11k_warn(ab, "qmi mem size is low to load caldata\n");
1693 return -EINVAL;
1695 /* TODO ath11k does not support cold boot calibration */
1696 ab->qmi.target_mem[idx].paddr = 0;
1697 ab->qmi.target_mem[idx].vaddr = 0;
1698 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
1699 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
1700 idx++;
1701 break;
1702 default:
1703 ath11k_warn(ab, "qmi ignore invalid mem req type %d\n",
1704 ab->qmi.target_mem[i].type);
1705 break;
1708 ab->qmi.mem_seg_count = idx;
1710 return 0;
1713 static int ath11k_qmi_request_target_cap(struct ath11k_base *ab)
1715 struct qmi_wlanfw_cap_req_msg_v01 req;
1716 struct qmi_wlanfw_cap_resp_msg_v01 resp;
1717 struct qmi_txn txn = {};
1718 int ret = 0;
1720 memset(&req, 0, sizeof(req));
1721 memset(&resp, 0, sizeof(resp));
1723 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1724 qmi_wlanfw_cap_resp_msg_v01_ei, &resp);
1725 if (ret < 0)
1726 goto out;
1728 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1729 QMI_WLANFW_CAP_REQ_V01,
1730 QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN,
1731 qmi_wlanfw_cap_req_msg_v01_ei, &req);
1732 if (ret < 0) {
1733 ath11k_warn(ab, "qmi failed to send target cap request, err = %d\n",
1734 ret);
1735 goto out;
1738 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1739 if (ret < 0) {
1740 ath11k_warn(ab, "qmi failed target cap request %d\n", ret);
1741 goto out;
1744 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1745 ath11k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n",
1746 resp.resp.result, resp.resp.error);
1747 ret = -EINVAL;
1748 goto out;
1751 if (resp.chip_info_valid) {
1752 ab->qmi.target.chip_id = resp.chip_info.chip_id;
1753 ab->qmi.target.chip_family = resp.chip_info.chip_family;
1756 if (resp.board_info_valid)
1757 ab->qmi.target.board_id = resp.board_info.board_id;
1758 else
1759 ab->qmi.target.board_id = 0xFF;
1761 if (resp.soc_info_valid)
1762 ab->qmi.target.soc_id = resp.soc_info.soc_id;
1764 if (resp.fw_version_info_valid) {
1765 ab->qmi.target.fw_version = resp.fw_version_info.fw_version;
1766 strlcpy(ab->qmi.target.fw_build_timestamp,
1767 resp.fw_version_info.fw_build_timestamp,
1768 sizeof(ab->qmi.target.fw_build_timestamp));
1771 if (resp.fw_build_id_valid)
1772 strlcpy(ab->qmi.target.fw_build_id, resp.fw_build_id,
1773 sizeof(ab->qmi.target.fw_build_id));
1775 ath11k_info(ab, "qmi target: chip_id: 0x%x, chip_family: 0x%x, board_id: 0x%x, soc_id: 0x%x\n",
1776 ab->qmi.target.chip_id, ab->qmi.target.chip_family,
1777 ab->qmi.target.board_id, ab->qmi.target.soc_id);
1779 ath11k_info(ab, "qmi fw_version: 0x%x fw_build_timestamp: %s fw_build_id: %s",
1780 ab->qmi.target.fw_version,
1781 ab->qmi.target.fw_build_timestamp,
1782 ab->qmi.target.fw_build_id);
1784 out:
1785 return ret;
1788 static int
1789 ath11k_qmi_prepare_bdf_download(struct ath11k_base *ab, int type,
1790 struct qmi_wlanfw_bdf_download_req_msg_v01 *req,
1791 void __iomem *bdf_addr)
1793 struct device *dev = ab->dev;
1794 char filename[ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE];
1795 const struct firmware *fw_entry;
1796 struct ath11k_board_data bd;
1797 u32 fw_size;
1798 int ret = 0;
1800 memset(&bd, 0, sizeof(bd));
1802 switch (type) {
1803 case ATH11K_QMI_FILE_TYPE_BDF_GOLDEN:
1804 ret = ath11k_core_fetch_bdf(ab, &bd);
1805 if (ret) {
1806 ath11k_warn(ab, "qmi failed to load BDF\n");
1807 goto out;
1810 fw_size = min_t(u32, ab->hw_params.fw.board_size, bd.len);
1811 memcpy_toio(bdf_addr, bd.data, fw_size);
1812 ath11k_core_free_bdf(ab, &bd);
1813 break;
1814 case ATH11K_QMI_FILE_TYPE_CALDATA:
1815 snprintf(filename, sizeof(filename),
1816 "%s/%s", ab->hw_params.fw.dir, ATH11K_QMI_DEFAULT_CAL_FILE_NAME);
1817 ret = request_firmware(&fw_entry, filename, dev);
1818 if (ret) {
1819 ath11k_warn(ab, "qmi failed to load CAL: %s\n", filename);
1820 goto out;
1823 fw_size = min_t(u32, ab->hw_params.fw.board_size,
1824 fw_entry->size);
1826 memcpy_toio(bdf_addr + ATH11K_QMI_CALDATA_OFFSET,
1827 fw_entry->data, fw_size);
1828 ath11k_info(ab, "qmi downloading BDF: %s, size: %zu\n",
1829 filename, fw_entry->size);
1831 release_firmware(fw_entry);
1832 break;
1833 default:
1834 ret = -EINVAL;
1835 goto out;
1838 req->total_size = fw_size;
1840 out:
1841 return ret;
1844 static int ath11k_qmi_load_bdf(struct ath11k_base *ab)
1846 struct qmi_wlanfw_bdf_download_req_msg_v01 *req;
1847 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
1848 struct qmi_txn txn = {};
1849 void __iomem *bdf_addr = NULL;
1850 int type, ret;
1852 req = kzalloc(sizeof(*req), GFP_KERNEL);
1853 if (!req)
1854 return -ENOMEM;
1855 memset(&resp, 0, sizeof(resp));
1857 bdf_addr = ioremap(ATH11K_QMI_BDF_ADDRESS, ATH11K_QMI_BDF_MAX_SIZE);
1858 if (!bdf_addr) {
1859 ath11k_warn(ab, "qmi ioremap error for BDF\n");
1860 ret = -EIO;
1861 goto out;
1864 for (type = 0; type < ATH11K_QMI_MAX_FILE_TYPE; type++) {
1865 req->valid = 1;
1866 req->file_id_valid = 1;
1867 req->file_id = ab->qmi.target.board_id;
1868 req->total_size_valid = 1;
1869 req->seg_id_valid = 1;
1870 req->seg_id = type;
1871 req->data_valid = 0;
1872 req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
1873 req->bdf_type = 0;
1874 req->bdf_type_valid = 0;
1875 req->end_valid = 1;
1876 req->end = 1;
1878 ret = ath11k_qmi_prepare_bdf_download(ab, type, req, bdf_addr);
1879 if (ret < 0)
1880 goto out_qmi_bdf;
1882 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1883 qmi_wlanfw_bdf_download_resp_msg_v01_ei,
1884 &resp);
1885 if (ret < 0)
1886 goto out_qmi_bdf;
1888 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1889 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,
1890 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,
1891 qmi_wlanfw_bdf_download_req_msg_v01_ei, req);
1892 if (ret < 0) {
1893 qmi_txn_cancel(&txn);
1894 goto out_qmi_bdf;
1897 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1898 if (ret < 0)
1899 goto out_qmi_bdf;
1901 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1902 ath11k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n",
1903 resp.resp.result, resp.resp.error);
1904 ret = -EINVAL;
1905 goto out_qmi_bdf;
1908 ath11k_info(ab, "qmi BDF downloaded\n");
1910 out_qmi_bdf:
1911 iounmap(bdf_addr);
1912 out:
1913 kfree(req);
1914 return ret;
1917 static int ath11k_qmi_wlanfw_m3_info_send(struct ath11k_base *ab)
1919 struct qmi_wlanfw_m3_info_req_msg_v01 req;
1920 struct qmi_wlanfw_m3_info_resp_msg_v01 resp;
1921 struct qmi_txn txn = {};
1922 int ret = 0;
1924 memset(&req, 0, sizeof(req));
1925 memset(&resp, 0, sizeof(resp));
1926 req.addr = 0;
1927 req.size = 0;
1929 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1930 qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp);
1931 if (ret < 0)
1932 goto out;
1934 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1935 QMI_WLANFW_M3_INFO_REQ_V01,
1936 QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN,
1937 qmi_wlanfw_m3_info_req_msg_v01_ei, &req);
1938 if (ret < 0) {
1939 ath11k_warn(ab, "qmi failed to send M3 information request, err = %d\n",
1940 ret);
1941 goto out;
1944 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1945 if (ret < 0) {
1946 ath11k_warn(ab, "qmi failed M3 information request %d\n", ret);
1947 goto out;
1950 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1951 ath11k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n",
1952 resp.resp.result, resp.resp.error);
1953 ret = -EINVAL;
1954 goto out;
1956 out:
1957 return ret;
1960 static int ath11k_qmi_wlanfw_mode_send(struct ath11k_base *ab,
1961 u32 mode)
1963 struct qmi_wlanfw_wlan_mode_req_msg_v01 req;
1964 struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp;
1965 struct qmi_txn txn = {};
1966 int ret = 0;
1968 memset(&req, 0, sizeof(req));
1969 memset(&resp, 0, sizeof(resp));
1971 req.mode = mode;
1972 req.hw_debug_valid = 1;
1973 req.hw_debug = 0;
1975 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1976 qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp);
1977 if (ret < 0)
1978 goto out;
1980 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1981 QMI_WLANFW_WLAN_MODE_REQ_V01,
1982 QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN,
1983 qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req);
1984 if (ret < 0) {
1985 ath11k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n",
1986 mode, ret);
1987 goto out;
1990 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1991 if (ret < 0) {
1992 if (mode == ATH11K_FIRMWARE_MODE_OFF && ret == -ENETRESET) {
1993 ath11k_warn(ab, "WLFW service is dis-connected\n");
1994 return 0;
1996 ath11k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n",
1997 mode, ret);
1998 goto out;
2001 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2002 ath11k_warn(ab, "Mode request failed, mode: %d, result: %d err: %d\n",
2003 mode, resp.resp.result, resp.resp.error);
2004 ret = -EINVAL;
2005 goto out;
2008 out:
2009 return ret;
2012 static int ath11k_qmi_wlanfw_wlan_cfg_send(struct ath11k_base *ab)
2014 struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req;
2015 struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp;
2016 struct ce_pipe_config *ce_cfg;
2017 struct service_to_pipe *svc_cfg;
2018 struct qmi_txn txn = {};
2019 int ret = 0, pipe_num;
2021 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce;
2022 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map;
2024 req = kzalloc(sizeof(*req), GFP_KERNEL);
2025 if (!req)
2026 return -ENOMEM;
2028 memset(&resp, 0, sizeof(resp));
2030 req->host_version_valid = 1;
2031 strlcpy(req->host_version, ATH11K_HOST_VERSION_STRING,
2032 sizeof(req->host_version));
2034 req->tgt_cfg_valid = 1;
2035 /* This is number of CE configs */
2036 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;
2037 for (pipe_num = 0; pipe_num <= req->tgt_cfg_len ; pipe_num++) {
2038 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;
2039 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;
2040 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;
2041 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;
2042 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;
2045 req->svc_cfg_valid = 1;
2046 /* This is number of Service/CE configs */
2047 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;
2048 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {
2049 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;
2050 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;
2051 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;
2053 req->shadow_reg_valid = 0;
2054 req->shadow_reg_v2_valid = 0;
2056 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2057 qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp);
2058 if (ret < 0)
2059 goto out;
2061 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2062 QMI_WLANFW_WLAN_CFG_REQ_V01,
2063 QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN,
2064 qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req);
2065 if (ret < 0) {
2066 ath11k_warn(ab, "qmi failed to send wlan config request, err = %d\n",
2067 ret);
2068 goto out;
2071 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2072 if (ret < 0) {
2073 ath11k_warn(ab, "qmi failed wlan config request, err = %d\n", ret);
2074 goto out;
2077 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2078 ath11k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n",
2079 resp.resp.result, resp.resp.error);
2080 ret = -EINVAL;
2081 goto out;
2084 out:
2085 kfree(req);
2086 return ret;
2089 void ath11k_qmi_firmware_stop(struct ath11k_base *ab)
2091 int ret;
2093 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_OFF);
2094 if (ret < 0) {
2095 ath11k_warn(ab, "qmi failed to send wlan mode off\n");
2096 return;
2100 int ath11k_qmi_firmware_start(struct ath11k_base *ab,
2101 u32 mode)
2103 int ret;
2105 ret = ath11k_qmi_wlanfw_wlan_cfg_send(ab);
2106 if (ret < 0) {
2107 ath11k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret);
2108 return ret;
2111 ret = ath11k_qmi_wlanfw_mode_send(ab, mode);
2112 if (ret < 0) {
2113 ath11k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret);
2114 return ret;
2117 return 0;
2120 static int
2121 ath11k_qmi_driver_event_post(struct ath11k_qmi *qmi,
2122 enum ath11k_qmi_event_type type,
2123 void *data)
2125 struct ath11k_qmi_driver_event *event;
2127 event = kzalloc(sizeof(*event), GFP_ATOMIC);
2128 if (!event)
2129 return -ENOMEM;
2131 event->type = type;
2132 event->data = data;
2134 spin_lock(&qmi->event_lock);
2135 list_add_tail(&event->list, &qmi->event_list);
2136 spin_unlock(&qmi->event_lock);
2138 queue_work(qmi->event_wq, &qmi->event_work);
2140 return 0;
2143 static void ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
2145 struct ath11k_base *ab = qmi->ab;
2146 int ret;
2148 ret = ath11k_qmi_fw_ind_register_send(ab);
2149 if (ret < 0) {
2150 ath11k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret);
2151 return;
2154 ret = ath11k_qmi_host_cap_send(ab);
2155 if (ret < 0) {
2156 ath11k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret);
2157 return;
2161 static void ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
2163 struct ath11k_base *ab = qmi->ab;
2164 int ret;
2166 ret = ath11k_qmi_respond_fw_mem_request(ab);
2167 if (ret < 0) {
2168 ath11k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret);
2169 return;
2173 static void ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
2175 struct ath11k_base *ab = qmi->ab;
2176 int ret;
2178 ret = ath11k_qmi_request_target_cap(ab);
2179 if (ret < 0) {
2180 ath11k_warn(ab, "qmi failed to req target capabilities:%d\n", ret);
2181 return;
2184 ret = ath11k_qmi_load_bdf(ab);
2185 if (ret < 0) {
2186 ath11k_warn(ab, "qmi failed to load board data file:%d\n", ret);
2187 return;
2190 ret = ath11k_qmi_wlanfw_m3_info_send(ab);
2191 if (ret < 0) {
2192 ath11k_warn(ab, "qmi failed to send m3 info req:%d\n", ret);
2193 return;
2197 static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
2198 struct sockaddr_qrtr *sq,
2199 struct qmi_txn *txn,
2200 const void *data)
2202 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2203 struct ath11k_base *ab = qmi->ab;
2204 const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data;
2205 int i, ret;
2207 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware request memory request\n");
2209 if (msg->mem_seg_len == 0 ||
2210 msg->mem_seg_len > ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01)
2211 ath11k_warn(ab, "Invalid memory segment length: %u\n",
2212 msg->mem_seg_len);
2214 ab->qmi.mem_seg_count = msg->mem_seg_len;
2216 for (i = 0; i < qmi->mem_seg_count ; i++) {
2217 ab->qmi.target_mem[i].type = msg->mem_seg[i].type;
2218 ab->qmi.target_mem[i].size = msg->mem_seg[i].size;
2219 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi mem seg type %d size %d\n",
2220 msg->mem_seg[i].type, msg->mem_seg[i].size);
2223 ret = ath11k_qmi_alloc_target_mem_chunk(ab);
2224 if (ret < 0) {
2225 ath11k_warn(ab, "qmi failed to alloc target memory:%d\n", ret);
2226 return;
2229 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_REQUEST_MEM, NULL);
2232 static void ath11k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl,
2233 struct sockaddr_qrtr *sq,
2234 struct qmi_txn *txn,
2235 const void *decoded)
2237 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2238 struct ath11k_base *ab = qmi->ab;
2240 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware memory ready indication\n");
2241 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_MEM_READY, NULL);
2244 static void ath11k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl,
2245 struct sockaddr_qrtr *sq,
2246 struct qmi_txn *txn,
2247 const void *decoded)
2249 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2250 struct ath11k_base *ab = qmi->ab;
2252 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware ready\n");
2253 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_READY, NULL);
2256 static void ath11k_qmi_msg_cold_boot_cal_done_cb(struct qmi_handle *qmi,
2257 struct sockaddr_qrtr *sq,
2258 struct qmi_txn *txn,
2259 const void *decoded)
2263 static const struct qmi_msg_handler ath11k_qmi_msg_handlers[] = {
2265 .type = QMI_INDICATION,
2266 .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
2267 .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
2268 .decoded_size = sizeof(qmi_wlanfw_request_mem_ind_msg_v01_ei),
2269 .fn = ath11k_qmi_msg_mem_request_cb,
2272 .type = QMI_INDICATION,
2273 .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
2274 .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
2275 .decoded_size = sizeof(qmi_wlanfw_mem_ready_ind_msg_v01_ei),
2276 .fn = ath11k_qmi_msg_mem_ready_cb,
2279 .type = QMI_INDICATION,
2280 .msg_id = QMI_WLFW_FW_READY_IND_V01,
2281 .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
2282 .decoded_size = sizeof(qmi_wlanfw_fw_ready_ind_msg_v01_ei),
2283 .fn = ath11k_qmi_msg_fw_ready_cb,
2286 .type = QMI_INDICATION,
2287 .msg_id = QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01,
2288 .ei = qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei,
2289 .decoded_size =
2290 sizeof(qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei),
2291 .fn = ath11k_qmi_msg_cold_boot_cal_done_cb,
2295 static int ath11k_qmi_ops_new_server(struct qmi_handle *qmi_hdl,
2296 struct qmi_service *service)
2298 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2299 struct ath11k_base *ab = qmi->ab;
2300 struct sockaddr_qrtr *sq = &qmi->sq;
2301 int ret;
2303 sq->sq_family = AF_QIPCRTR;
2304 sq->sq_node = service->node;
2305 sq->sq_port = service->port;
2307 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq,
2308 sizeof(*sq), 0);
2309 if (ret) {
2310 ath11k_warn(ab, "qmi failed to connect to remote service %d\n", ret);
2311 return ret;
2314 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw qmi service connected\n");
2315 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_ARRIVE, NULL);
2317 return 0;
2320 static void ath11k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,
2321 struct qmi_service *service)
2323 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2324 struct ath11k_base *ab = qmi->ab;
2326 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw del server\n");
2327 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_EXIT, NULL);
2330 static const struct qmi_ops ath11k_qmi_ops = {
2331 .new_server = ath11k_qmi_ops_new_server,
2332 .del_server = ath11k_qmi_ops_del_server,
2335 static void ath11k_qmi_driver_event_work(struct work_struct *work)
2337 struct ath11k_qmi *qmi = container_of(work, struct ath11k_qmi,
2338 event_work);
2339 struct ath11k_qmi_driver_event *event;
2340 struct ath11k_base *ab = qmi->ab;
2342 spin_lock(&qmi->event_lock);
2343 while (!list_empty(&qmi->event_list)) {
2344 event = list_first_entry(&qmi->event_list,
2345 struct ath11k_qmi_driver_event, list);
2346 list_del(&event->list);
2347 spin_unlock(&qmi->event_lock);
2349 if (test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags))
2350 return;
2352 switch (event->type) {
2353 case ATH11K_QMI_EVENT_SERVER_ARRIVE:
2354 ath11k_qmi_event_server_arrive(qmi);
2355 break;
2356 case ATH11K_QMI_EVENT_SERVER_EXIT:
2357 set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
2358 set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
2359 break;
2360 case ATH11K_QMI_EVENT_REQUEST_MEM:
2361 ath11k_qmi_event_mem_request(qmi);
2362 break;
2363 case ATH11K_QMI_EVENT_FW_MEM_READY:
2364 ath11k_qmi_event_load_bdf(qmi);
2365 break;
2366 case ATH11K_QMI_EVENT_FW_READY:
2367 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
2368 queue_work(ab->workqueue, &ab->restart_work);
2369 break;
2372 ath11k_core_qmi_firmware_ready(ab);
2373 ab->qmi.cal_done = 1;
2374 set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
2376 break;
2377 case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
2378 break;
2379 default:
2380 ath11k_warn(ab, "invalid event type: %d", event->type);
2381 break;
2383 kfree(event);
2384 spin_lock(&qmi->event_lock);
2386 spin_unlock(&qmi->event_lock);
2389 int ath11k_qmi_init_service(struct ath11k_base *ab)
2391 int ret;
2393 memset(&ab->qmi.target, 0, sizeof(struct target_info));
2394 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk));
2395 ab->qmi.ab = ab;
2397 ab->qmi.target_mem_mode = ATH11K_QMI_TARGET_MEM_MODE_DEFAULT;
2398 ret = qmi_handle_init(&ab->qmi.handle, ATH11K_QMI_RESP_LEN_MAX,
2399 &ath11k_qmi_ops, ath11k_qmi_msg_handlers);
2400 if (ret < 0) {
2401 ath11k_warn(ab, "failed to initialize qmi handle\n");
2402 return ret;
2405 ab->qmi.event_wq = alloc_workqueue("ath11k_qmi_driver_event",
2406 WQ_UNBOUND, 1);
2407 if (!ab->qmi.event_wq) {
2408 ath11k_err(ab, "failed to allocate workqueue\n");
2409 return -EFAULT;
2412 INIT_LIST_HEAD(&ab->qmi.event_list);
2413 spin_lock_init(&ab->qmi.event_lock);
2414 INIT_WORK(&ab->qmi.event_work, ath11k_qmi_driver_event_work);
2416 ret = qmi_add_lookup(&ab->qmi.handle, ATH11K_QMI_WLFW_SERVICE_ID_V01,
2417 ATH11K_QMI_WLFW_SERVICE_VERS_V01,
2418 ATH11K_QMI_WLFW_SERVICE_INS_ID_V01);
2419 if (ret < 0) {
2420 ath11k_warn(ab, "failed to add qmi lookup\n");
2421 return ret;
2424 return ret;
2427 void ath11k_qmi_deinit_service(struct ath11k_base *ab)
2429 qmi_handle_release(&ab->qmi.handle);
2430 cancel_work_sync(&ab->qmi.event_work);
2431 destroy_workqueue(ab->qmi.event_wq);