1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
13 #include <linux/firmware.h>
15 #define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02
16 #define HOST_CSTATE_BIT 0x04
17 #define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x08
18 #define ATH12K_QMI_MAX_CHUNK_SIZE 2097152
20 static const struct qmi_elem_info wlfw_host_mlo_chip_info_s_v01_ei[] = {
22 .data_type = QMI_UNSIGNED_1_BYTE,
24 .elem_size = sizeof(u8),
25 .array_type = NO_ARRAY,
27 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,
31 .data_type = QMI_UNSIGNED_1_BYTE,
33 .elem_size = sizeof(u8),
34 .array_type = NO_ARRAY,
36 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,
40 .data_type = QMI_UNSIGNED_1_BYTE,
41 .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01,
42 .elem_size = sizeof(u8),
43 .array_type = STATIC_ARRAY,
45 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,
49 .data_type = QMI_UNSIGNED_1_BYTE,
50 .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01,
51 .elem_size = sizeof(u8),
52 .array_type = STATIC_ARRAY,
54 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01,
58 .data_type = QMI_EOTI,
59 .array_type = NO_ARRAY,
60 .tlv_type = QMI_COMMON_TLV_TYPE,
64 static const struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = {
66 .data_type = QMI_OPT_FLAG,
68 .elem_size = sizeof(u8),
69 .array_type = NO_ARRAY,
71 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
75 .data_type = QMI_UNSIGNED_4_BYTE,
77 .elem_size = sizeof(u32),
78 .array_type = NO_ARRAY,
80 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
84 .data_type = QMI_OPT_FLAG,
86 .elem_size = sizeof(u8),
87 .array_type = NO_ARRAY,
89 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
93 .data_type = QMI_UNSIGNED_4_BYTE,
95 .elem_size = sizeof(u32),
96 .array_type = NO_ARRAY,
98 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
102 .data_type = QMI_OPT_FLAG,
104 .elem_size = sizeof(u8),
105 .array_type = NO_ARRAY,
107 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
111 .data_type = QMI_DATA_LEN,
113 .elem_size = sizeof(u8),
114 .array_type = NO_ARRAY,
116 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
120 .data_type = QMI_UNSIGNED_4_BYTE,
121 .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,
122 .elem_size = sizeof(u32),
123 .array_type = VAR_LEN_ARRAY,
125 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
129 .data_type = QMI_OPT_FLAG,
131 .elem_size = sizeof(u8),
132 .array_type = NO_ARRAY,
134 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
138 .data_type = QMI_UNSIGNED_1_BYTE,
140 .elem_size = sizeof(u8),
141 .array_type = NO_ARRAY,
143 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
147 .data_type = QMI_OPT_FLAG,
149 .elem_size = sizeof(u8),
150 .array_type = NO_ARRAY,
152 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
156 .data_type = QMI_UNSIGNED_1_BYTE,
158 .elem_size = sizeof(u8),
159 .array_type = NO_ARRAY,
161 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
165 .data_type = QMI_OPT_FLAG,
167 .elem_size = sizeof(u8),
168 .array_type = NO_ARRAY,
170 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
171 bdf_cache_support_valid),
174 .data_type = QMI_UNSIGNED_1_BYTE,
176 .elem_size = sizeof(u8),
177 .array_type = NO_ARRAY,
179 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
183 .data_type = QMI_OPT_FLAG,
185 .elem_size = sizeof(u8),
186 .array_type = NO_ARRAY,
188 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
192 .data_type = QMI_UNSIGNED_1_BYTE,
194 .elem_size = sizeof(u8),
195 .array_type = NO_ARRAY,
197 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
201 .data_type = QMI_OPT_FLAG,
203 .elem_size = sizeof(u8),
204 .array_type = NO_ARRAY,
206 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
207 m3_cache_support_valid),
210 .data_type = QMI_UNSIGNED_1_BYTE,
212 .elem_size = sizeof(u8),
213 .array_type = NO_ARRAY,
215 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
219 .data_type = QMI_OPT_FLAG,
221 .elem_size = sizeof(u8),
222 .array_type = NO_ARRAY,
224 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
225 cal_filesys_support_valid),
228 .data_type = QMI_UNSIGNED_1_BYTE,
230 .elem_size = sizeof(u8),
231 .array_type = NO_ARRAY,
233 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
234 cal_filesys_support),
237 .data_type = QMI_OPT_FLAG,
239 .elem_size = sizeof(u8),
240 .array_type = NO_ARRAY,
242 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
243 cal_cache_support_valid),
246 .data_type = QMI_UNSIGNED_1_BYTE,
248 .elem_size = sizeof(u8),
249 .array_type = NO_ARRAY,
251 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
255 .data_type = QMI_OPT_FLAG,
257 .elem_size = sizeof(u8),
258 .array_type = NO_ARRAY,
260 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
264 .data_type = QMI_UNSIGNED_1_BYTE,
266 .elem_size = sizeof(u8),
267 .array_type = NO_ARRAY,
269 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
273 .data_type = QMI_OPT_FLAG,
275 .elem_size = sizeof(u8),
276 .array_type = NO_ARRAY,
278 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
282 .data_type = QMI_UNSIGNED_4_BYTE,
284 .elem_size = sizeof(u32),
285 .array_type = NO_ARRAY,
287 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
291 .data_type = QMI_OPT_FLAG,
293 .elem_size = sizeof(u8),
294 .array_type = NO_ARRAY,
296 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
300 .data_type = QMI_UNSIGNED_1_BYTE,
302 .elem_size = sizeof(u8),
303 .array_type = NO_ARRAY,
305 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
309 .data_type = QMI_OPT_FLAG,
311 .elem_size = sizeof(u8),
312 .array_type = NO_ARRAY,
314 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
318 .data_type = QMI_UNSIGNED_2_BYTE,
320 .elem_size = sizeof(u16),
321 .array_type = NO_ARRAY,
323 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
327 .data_type = QMI_OPT_FLAG,
329 .elem_size = sizeof(u8),
330 .array_type = NO_ARRAY,
332 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
333 platform_name_valid),
336 .data_type = QMI_STRING,
337 .elem_len = QMI_WLANFW_MAX_PLATFORM_NAME_LEN_V01 + 1,
338 .elem_size = sizeof(char),
339 .array_type = NO_ARRAY,
341 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
345 .data_type = QMI_OPT_FLAG,
347 .elem_size = sizeof(u8),
348 .array_type = NO_ARRAY,
350 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
354 .data_type = QMI_STRUCT,
355 .elem_len = QMI_WLANFW_MAX_HOST_DDR_RANGE_SIZE_V01,
356 .elem_size = sizeof(struct qmi_wlanfw_host_ddr_range),
357 .array_type = STATIC_ARRAY,
359 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
363 .data_type = QMI_OPT_FLAG,
365 .elem_size = sizeof(u8),
366 .array_type = NO_ARRAY,
368 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
369 host_build_type_valid),
372 .data_type = QMI_SIGNED_4_BYTE_ENUM,
374 .elem_size = sizeof(enum qmi_wlanfw_host_build_type),
375 .array_type = NO_ARRAY,
377 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
381 .data_type = QMI_OPT_FLAG,
383 .elem_size = sizeof(u8),
384 .array_type = NO_ARRAY,
386 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
390 .data_type = QMI_UNSIGNED_1_BYTE,
392 .elem_size = sizeof(u8),
393 .array_type = NO_ARRAY,
395 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
399 .data_type = QMI_OPT_FLAG,
401 .elem_size = sizeof(u8),
402 .array_type = NO_ARRAY,
404 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
408 .data_type = QMI_UNSIGNED_2_BYTE,
410 .elem_size = sizeof(u16),
411 .array_type = NO_ARRAY,
413 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
417 .data_type = QMI_OPT_FLAG,
419 .elem_size = sizeof(u8),
420 .array_type = NO_ARRAY,
422 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
426 .data_type = QMI_UNSIGNED_1_BYTE,
428 .elem_size = sizeof(u8),
429 .array_type = NO_ARRAY,
431 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
435 .data_type = QMI_OPT_FLAG,
437 .elem_size = sizeof(u8),
438 .array_type = NO_ARRAY,
440 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
444 .data_type = QMI_UNSIGNED_2_BYTE,
446 .elem_size = sizeof(u16),
447 .array_type = NO_ARRAY,
449 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
453 .data_type = QMI_OPT_FLAG,
455 .elem_size = sizeof(u8),
456 .array_type = NO_ARRAY,
458 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
459 mlo_num_chips_valid),
462 .data_type = QMI_UNSIGNED_1_BYTE,
464 .elem_size = sizeof(u8),
465 .array_type = NO_ARRAY,
467 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
471 .data_type = QMI_OPT_FLAG,
473 .elem_size = sizeof(u8),
474 .array_type = NO_ARRAY,
476 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
477 mlo_chip_info_valid),
480 .data_type = QMI_STRUCT,
481 .elem_len = QMI_WLFW_MAX_NUM_MLO_CHIPS_V01,
482 .elem_size = sizeof(struct wlfw_host_mlo_chip_info_s_v01),
483 .array_type = STATIC_ARRAY,
485 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
487 .ei_array = wlfw_host_mlo_chip_info_s_v01_ei,
490 .data_type = QMI_OPT_FLAG,
492 .elem_size = sizeof(u8),
493 .array_type = NO_ARRAY,
495 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
499 .data_type = QMI_UNSIGNED_8_BYTE,
501 .elem_size = sizeof(u64),
502 .array_type = NO_ARRAY,
504 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
508 .data_type = QMI_EOTI,
509 .array_type = NO_ARRAY,
510 .tlv_type = QMI_COMMON_TLV_TYPE,
514 static const struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = {
516 .data_type = QMI_STRUCT,
518 .elem_size = sizeof(struct qmi_response_type_v01),
519 .array_type = NO_ARRAY,
521 .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp),
522 .ei_array = qmi_response_type_v01_ei,
525 .data_type = QMI_EOTI,
526 .array_type = NO_ARRAY,
527 .tlv_type = QMI_COMMON_TLV_TYPE,
531 static const struct qmi_elem_info qmi_wlanfw_phy_cap_req_msg_v01_ei[] = {
533 .data_type = QMI_EOTI,
534 .array_type = NO_ARRAY,
535 .tlv_type = QMI_COMMON_TLV_TYPE,
539 static const struct qmi_elem_info qmi_wlanfw_phy_cap_resp_msg_v01_ei[] = {
541 .data_type = QMI_STRUCT,
543 .elem_size = sizeof(struct qmi_response_type_v01),
544 .array_type = NO_ARRAY,
546 .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, resp),
547 .ei_array = qmi_response_type_v01_ei,
550 .data_type = QMI_OPT_FLAG,
552 .elem_size = sizeof(u8),
553 .array_type = NO_ARRAY,
555 .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01,
559 .data_type = QMI_UNSIGNED_1_BYTE,
561 .elem_size = sizeof(u8),
562 .array_type = NO_ARRAY,
564 .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01,
568 .data_type = QMI_OPT_FLAG,
570 .elem_size = sizeof(u8),
571 .array_type = NO_ARRAY,
573 .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01,
577 .data_type = QMI_UNSIGNED_4_BYTE,
579 .elem_size = sizeof(u32),
580 .array_type = NO_ARRAY,
582 .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01,
586 .data_type = QMI_EOTI,
587 .array_type = NO_ARRAY,
588 .tlv_type = QMI_COMMON_TLV_TYPE,
592 static const struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = {
594 .data_type = QMI_OPT_FLAG,
596 .elem_size = sizeof(u8),
597 .array_type = NO_ARRAY,
599 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
600 fw_ready_enable_valid),
603 .data_type = QMI_UNSIGNED_1_BYTE,
605 .elem_size = sizeof(u8),
606 .array_type = NO_ARRAY,
608 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
612 .data_type = QMI_OPT_FLAG,
614 .elem_size = sizeof(u8),
615 .array_type = NO_ARRAY,
617 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
618 initiate_cal_download_enable_valid),
621 .data_type = QMI_UNSIGNED_1_BYTE,
623 .elem_size = sizeof(u8),
624 .array_type = NO_ARRAY,
626 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
627 initiate_cal_download_enable),
630 .data_type = QMI_OPT_FLAG,
632 .elem_size = sizeof(u8),
633 .array_type = NO_ARRAY,
635 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
636 initiate_cal_update_enable_valid),
639 .data_type = QMI_UNSIGNED_1_BYTE,
641 .elem_size = sizeof(u8),
642 .array_type = NO_ARRAY,
644 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
645 initiate_cal_update_enable),
648 .data_type = QMI_OPT_FLAG,
650 .elem_size = sizeof(u8),
651 .array_type = NO_ARRAY,
653 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
654 msa_ready_enable_valid),
657 .data_type = QMI_UNSIGNED_1_BYTE,
659 .elem_size = sizeof(u8),
660 .array_type = NO_ARRAY,
662 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
666 .data_type = QMI_OPT_FLAG,
668 .elem_size = sizeof(u8),
669 .array_type = NO_ARRAY,
671 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
672 pin_connect_result_enable_valid),
675 .data_type = QMI_UNSIGNED_1_BYTE,
677 .elem_size = sizeof(u8),
678 .array_type = NO_ARRAY,
680 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
681 pin_connect_result_enable),
684 .data_type = QMI_OPT_FLAG,
686 .elem_size = sizeof(u8),
687 .array_type = NO_ARRAY,
689 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
693 .data_type = QMI_UNSIGNED_4_BYTE,
695 .elem_size = sizeof(u32),
696 .array_type = NO_ARRAY,
698 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
702 .data_type = QMI_OPT_FLAG,
704 .elem_size = sizeof(u8),
705 .array_type = NO_ARRAY,
707 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
708 request_mem_enable_valid),
711 .data_type = QMI_UNSIGNED_1_BYTE,
713 .elem_size = sizeof(u8),
714 .array_type = NO_ARRAY,
716 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
720 .data_type = QMI_OPT_FLAG,
722 .elem_size = sizeof(u8),
723 .array_type = NO_ARRAY,
725 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
726 fw_mem_ready_enable_valid),
729 .data_type = QMI_UNSIGNED_1_BYTE,
731 .elem_size = sizeof(u8),
732 .array_type = NO_ARRAY,
734 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
735 fw_mem_ready_enable),
738 .data_type = QMI_OPT_FLAG,
740 .elem_size = sizeof(u8),
741 .array_type = NO_ARRAY,
743 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
744 fw_init_done_enable_valid),
747 .data_type = QMI_UNSIGNED_1_BYTE,
749 .elem_size = sizeof(u8),
750 .array_type = NO_ARRAY,
752 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
753 fw_init_done_enable),
757 .data_type = QMI_OPT_FLAG,
759 .elem_size = sizeof(u8),
760 .array_type = NO_ARRAY,
762 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
763 rejuvenate_enable_valid),
766 .data_type = QMI_UNSIGNED_1_BYTE,
768 .elem_size = sizeof(u8),
769 .array_type = NO_ARRAY,
771 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
775 .data_type = QMI_OPT_FLAG,
777 .elem_size = sizeof(u8),
778 .array_type = NO_ARRAY,
780 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
781 xo_cal_enable_valid),
784 .data_type = QMI_UNSIGNED_1_BYTE,
786 .elem_size = sizeof(u8),
787 .array_type = NO_ARRAY,
789 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
793 .data_type = QMI_OPT_FLAG,
795 .elem_size = sizeof(u8),
796 .array_type = NO_ARRAY,
798 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
799 cal_done_enable_valid),
802 .data_type = QMI_UNSIGNED_1_BYTE,
804 .elem_size = sizeof(u8),
805 .array_type = NO_ARRAY,
807 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
811 .data_type = QMI_EOTI,
812 .array_type = NO_ARRAY,
813 .tlv_type = QMI_COMMON_TLV_TYPE,
817 static const struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = {
819 .data_type = QMI_STRUCT,
821 .elem_size = sizeof(struct qmi_response_type_v01),
822 .array_type = NO_ARRAY,
824 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
826 .ei_array = qmi_response_type_v01_ei,
829 .data_type = QMI_OPT_FLAG,
831 .elem_size = sizeof(u8),
832 .array_type = NO_ARRAY,
834 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
838 .data_type = QMI_UNSIGNED_8_BYTE,
840 .elem_size = sizeof(u64),
841 .array_type = NO_ARRAY,
843 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
847 .data_type = QMI_EOTI,
848 .array_type = NO_ARRAY,
849 .tlv_type = QMI_COMMON_TLV_TYPE,
853 static const struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = {
855 .data_type = QMI_UNSIGNED_8_BYTE,
857 .elem_size = sizeof(u64),
858 .array_type = NO_ARRAY,
860 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset),
863 .data_type = QMI_UNSIGNED_4_BYTE,
865 .elem_size = sizeof(u32),
866 .array_type = NO_ARRAY,
868 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size),
871 .data_type = QMI_UNSIGNED_1_BYTE,
873 .elem_size = sizeof(u8),
874 .array_type = NO_ARRAY,
876 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag),
879 .data_type = QMI_EOTI,
880 .array_type = NO_ARRAY,
881 .tlv_type = QMI_COMMON_TLV_TYPE,
885 static const struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = {
887 .data_type = QMI_UNSIGNED_4_BYTE,
889 .elem_size = sizeof(u32),
890 .array_type = NO_ARRAY,
892 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01,
896 .data_type = QMI_SIGNED_4_BYTE_ENUM,
898 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
899 .array_type = NO_ARRAY,
901 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type),
904 .data_type = QMI_DATA_LEN,
906 .elem_size = sizeof(u8),
907 .array_type = NO_ARRAY,
909 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len),
912 .data_type = QMI_STRUCT,
913 .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01,
914 .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01),
915 .array_type = VAR_LEN_ARRAY,
917 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg),
918 .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei,
921 .data_type = QMI_EOTI,
922 .array_type = NO_ARRAY,
923 .tlv_type = QMI_COMMON_TLV_TYPE,
927 static const struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = {
929 .data_type = QMI_DATA_LEN,
931 .elem_size = sizeof(u8),
932 .array_type = NO_ARRAY,
934 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
938 .data_type = QMI_STRUCT,
939 .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
940 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01),
941 .array_type = VAR_LEN_ARRAY,
943 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
945 .ei_array = qmi_wlanfw_mem_seg_s_v01_ei,
948 .data_type = QMI_EOTI,
949 .array_type = NO_ARRAY,
950 .tlv_type = QMI_COMMON_TLV_TYPE,
954 static const struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = {
956 .data_type = QMI_UNSIGNED_8_BYTE,
958 .elem_size = sizeof(u64),
959 .array_type = NO_ARRAY,
961 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr),
964 .data_type = QMI_UNSIGNED_4_BYTE,
966 .elem_size = sizeof(u32),
967 .array_type = NO_ARRAY,
969 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size),
972 .data_type = QMI_SIGNED_4_BYTE_ENUM,
974 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
975 .array_type = NO_ARRAY,
977 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type),
980 .data_type = QMI_UNSIGNED_1_BYTE,
982 .elem_size = sizeof(u8),
983 .array_type = NO_ARRAY,
985 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore),
988 .data_type = QMI_EOTI,
989 .array_type = NO_ARRAY,
990 .tlv_type = QMI_COMMON_TLV_TYPE,
994 static const struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = {
996 .data_type = QMI_DATA_LEN,
998 .elem_size = sizeof(u8),
999 .array_type = NO_ARRAY,
1001 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
1005 .data_type = QMI_STRUCT,
1006 .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
1007 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01),
1008 .array_type = VAR_LEN_ARRAY,
1010 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
1012 .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei,
1015 .data_type = QMI_EOTI,
1016 .array_type = NO_ARRAY,
1017 .tlv_type = QMI_COMMON_TLV_TYPE,
1021 static const struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = {
1023 .data_type = QMI_STRUCT,
1025 .elem_size = sizeof(struct qmi_response_type_v01),
1026 .array_type = NO_ARRAY,
1028 .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01,
1030 .ei_array = qmi_response_type_v01_ei,
1033 .data_type = QMI_EOTI,
1034 .array_type = NO_ARRAY,
1035 .tlv_type = QMI_COMMON_TLV_TYPE,
1039 static const struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = {
1041 .data_type = QMI_EOTI,
1042 .array_type = NO_ARRAY,
1043 .tlv_type = QMI_COMMON_TLV_TYPE,
1047 static const struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
1049 .data_type = QMI_UNSIGNED_4_BYTE,
1051 .elem_size = sizeof(u32),
1052 .array_type = NO_ARRAY,
1054 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
1058 .data_type = QMI_UNSIGNED_4_BYTE,
1060 .elem_size = sizeof(u32),
1061 .array_type = NO_ARRAY,
1063 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
1067 .data_type = QMI_EOTI,
1068 .array_type = NO_ARRAY,
1069 .tlv_type = QMI_COMMON_TLV_TYPE,
1073 static const struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = {
1075 .data_type = QMI_UNSIGNED_4_BYTE,
1077 .elem_size = sizeof(u32),
1078 .array_type = NO_ARRAY,
1080 .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01,
1084 .data_type = QMI_EOTI,
1085 .array_type = NO_ARRAY,
1086 .tlv_type = QMI_COMMON_TLV_TYPE,
1090 static const struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = {
1092 .data_type = QMI_UNSIGNED_4_BYTE,
1094 .elem_size = sizeof(u32),
1095 .array_type = NO_ARRAY,
1097 .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id),
1100 .data_type = QMI_EOTI,
1101 .array_type = NO_ARRAY,
1102 .tlv_type = QMI_COMMON_TLV_TYPE,
1106 static const struct qmi_elem_info qmi_wlanfw_dev_mem_info_s_v01_ei[] = {
1108 .data_type = QMI_UNSIGNED_8_BYTE,
1110 .elem_size = sizeof(u64),
1111 .array_type = NO_ARRAY,
1113 .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01,
1117 .data_type = QMI_UNSIGNED_8_BYTE,
1119 .elem_size = sizeof(u64),
1120 .array_type = NO_ARRAY,
1122 .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01,
1126 .data_type = QMI_EOTI,
1127 .array_type = NO_ARRAY,
1128 .tlv_type = QMI_COMMON_TLV_TYPE,
1132 static const struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = {
1134 .data_type = QMI_UNSIGNED_4_BYTE,
1136 .elem_size = sizeof(u32),
1137 .array_type = NO_ARRAY,
1139 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
1143 .data_type = QMI_STRING,
1144 .elem_len = ATH12K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1,
1145 .elem_size = sizeof(char),
1146 .array_type = NO_ARRAY,
1148 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
1149 fw_build_timestamp),
1152 .data_type = QMI_EOTI,
1153 .array_type = NO_ARRAY,
1154 .tlv_type = QMI_COMMON_TLV_TYPE,
1158 static const struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = {
1160 .data_type = QMI_STRUCT,
1162 .elem_size = sizeof(struct qmi_response_type_v01),
1163 .array_type = NO_ARRAY,
1165 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp),
1166 .ei_array = qmi_response_type_v01_ei,
1169 .data_type = QMI_OPT_FLAG,
1171 .elem_size = sizeof(u8),
1172 .array_type = NO_ARRAY,
1174 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1178 .data_type = QMI_STRUCT,
1180 .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01),
1181 .array_type = NO_ARRAY,
1183 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1185 .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei,
1188 .data_type = QMI_OPT_FLAG,
1190 .elem_size = sizeof(u8),
1191 .array_type = NO_ARRAY,
1193 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1197 .data_type = QMI_STRUCT,
1199 .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01),
1200 .array_type = NO_ARRAY,
1202 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1204 .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei,
1207 .data_type = QMI_OPT_FLAG,
1209 .elem_size = sizeof(u8),
1210 .array_type = NO_ARRAY,
1212 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1216 .data_type = QMI_STRUCT,
1218 .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01),
1219 .array_type = NO_ARRAY,
1221 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1223 .ei_array = qmi_wlanfw_soc_info_s_v01_ei,
1226 .data_type = QMI_OPT_FLAG,
1228 .elem_size = sizeof(u8),
1229 .array_type = NO_ARRAY,
1231 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1232 fw_version_info_valid),
1235 .data_type = QMI_STRUCT,
1237 .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01),
1238 .array_type = NO_ARRAY,
1240 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1242 .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei,
1245 .data_type = QMI_OPT_FLAG,
1247 .elem_size = sizeof(u8),
1248 .array_type = NO_ARRAY,
1250 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1254 .data_type = QMI_STRING,
1255 .elem_len = ATH12K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1,
1256 .elem_size = sizeof(char),
1257 .array_type = NO_ARRAY,
1259 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1263 .data_type = QMI_OPT_FLAG,
1265 .elem_size = sizeof(u8),
1266 .array_type = NO_ARRAY,
1268 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1272 .data_type = QMI_UNSIGNED_1_BYTE,
1274 .elem_size = sizeof(u8),
1275 .array_type = NO_ARRAY,
1277 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1281 .data_type = QMI_OPT_FLAG,
1283 .elem_size = sizeof(u8),
1284 .array_type = NO_ARRAY,
1286 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1290 .data_type = QMI_UNSIGNED_4_BYTE,
1292 .elem_size = sizeof(u32),
1293 .array_type = NO_ARRAY,
1295 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1299 .data_type = QMI_OPT_FLAG,
1301 .elem_size = sizeof(u8),
1302 .array_type = NO_ARRAY,
1304 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1305 time_freq_hz_valid),
1308 .data_type = QMI_UNSIGNED_4_BYTE,
1310 .elem_size = sizeof(u32),
1311 .array_type = NO_ARRAY,
1313 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1317 .data_type = QMI_OPT_FLAG,
1319 .elem_size = sizeof(u8),
1320 .array_type = NO_ARRAY,
1322 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1326 .data_type = QMI_UNSIGNED_4_BYTE,
1328 .elem_size = sizeof(u32),
1329 .array_type = NO_ARRAY,
1331 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1335 .data_type = QMI_OPT_FLAG,
1337 .elem_size = sizeof(u8),
1338 .array_type = NO_ARRAY,
1340 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1341 eeprom_caldata_read_timeout_valid),
1344 .data_type = QMI_UNSIGNED_4_BYTE,
1346 .elem_size = sizeof(u32),
1347 .array_type = NO_ARRAY,
1349 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1350 eeprom_caldata_read_timeout),
1353 .data_type = QMI_OPT_FLAG,
1355 .elem_size = sizeof(u8),
1356 .array_type = NO_ARRAY,
1358 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1362 .data_type = QMI_UNSIGNED_8_BYTE,
1364 .elem_size = sizeof(u64),
1365 .array_type = NO_ARRAY,
1367 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, fw_caps),
1370 .data_type = QMI_OPT_FLAG,
1372 .elem_size = sizeof(u8),
1373 .array_type = NO_ARRAY,
1375 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1376 rd_card_chain_cap_valid),
1379 .data_type = QMI_UNSIGNED_4_BYTE,
1381 .elem_size = sizeof(u32),
1382 .array_type = NO_ARRAY,
1384 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1388 .data_type = QMI_OPT_FLAG,
1390 .elem_size = sizeof(u8),
1391 .array_type = NO_ARRAY,
1393 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1394 dev_mem_info_valid),
1397 .data_type = QMI_STRUCT,
1398 .elem_len = ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01,
1399 .elem_size = sizeof(struct qmi_wlanfw_dev_mem_info_s_v01),
1400 .array_type = STATIC_ARRAY,
1402 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, dev_mem),
1403 .ei_array = qmi_wlanfw_dev_mem_info_s_v01_ei,
1406 .data_type = QMI_EOTI,
1407 .array_type = NO_ARRAY,
1408 .tlv_type = QMI_COMMON_TLV_TYPE,
1412 static const struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = {
1414 .data_type = QMI_UNSIGNED_1_BYTE,
1416 .elem_size = sizeof(u8),
1417 .array_type = NO_ARRAY,
1419 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1423 .data_type = QMI_OPT_FLAG,
1425 .elem_size = sizeof(u8),
1426 .array_type = NO_ARRAY,
1428 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1432 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1434 .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01),
1435 .array_type = NO_ARRAY,
1437 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1441 .data_type = QMI_OPT_FLAG,
1443 .elem_size = sizeof(u8),
1444 .array_type = NO_ARRAY,
1446 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1450 .data_type = QMI_UNSIGNED_4_BYTE,
1452 .elem_size = sizeof(u32),
1453 .array_type = NO_ARRAY,
1455 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1459 .data_type = QMI_OPT_FLAG,
1461 .elem_size = sizeof(u8),
1462 .array_type = NO_ARRAY,
1464 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1468 .data_type = QMI_UNSIGNED_4_BYTE,
1470 .elem_size = sizeof(u32),
1471 .array_type = NO_ARRAY,
1473 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1477 .data_type = QMI_OPT_FLAG,
1479 .elem_size = sizeof(u8),
1480 .array_type = NO_ARRAY,
1482 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1486 .data_type = QMI_DATA_LEN,
1488 .elem_size = sizeof(u16),
1489 .array_type = NO_ARRAY,
1491 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1495 .data_type = QMI_UNSIGNED_1_BYTE,
1496 .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01,
1497 .elem_size = sizeof(u8),
1498 .array_type = VAR_LEN_ARRAY,
1500 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1504 .data_type = QMI_OPT_FLAG,
1506 .elem_size = sizeof(u8),
1507 .array_type = NO_ARRAY,
1509 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1513 .data_type = QMI_UNSIGNED_1_BYTE,
1515 .elem_size = sizeof(u8),
1516 .array_type = NO_ARRAY,
1518 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1522 .data_type = QMI_OPT_FLAG,
1524 .elem_size = sizeof(u8),
1525 .array_type = NO_ARRAY,
1527 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1531 .data_type = QMI_UNSIGNED_1_BYTE,
1533 .elem_size = sizeof(u8),
1534 .array_type = NO_ARRAY,
1536 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1541 .data_type = QMI_EOTI,
1542 .array_type = NO_ARRAY,
1543 .tlv_type = QMI_COMMON_TLV_TYPE,
1547 static const struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = {
1549 .data_type = QMI_STRUCT,
1551 .elem_size = sizeof(struct qmi_response_type_v01),
1552 .array_type = NO_ARRAY,
1554 .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01,
1556 .ei_array = qmi_response_type_v01_ei,
1559 .data_type = QMI_EOTI,
1560 .array_type = NO_ARRAY,
1561 .tlv_type = QMI_COMMON_TLV_TYPE,
1565 static const struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = {
1567 .data_type = QMI_UNSIGNED_8_BYTE,
1569 .elem_size = sizeof(u64),
1570 .array_type = NO_ARRAY,
1572 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr),
1575 .data_type = QMI_UNSIGNED_4_BYTE,
1577 .elem_size = sizeof(u32),
1578 .array_type = NO_ARRAY,
1580 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size),
1583 .data_type = QMI_EOTI,
1584 .array_type = NO_ARRAY,
1585 .tlv_type = QMI_COMMON_TLV_TYPE,
1589 static const struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = {
1591 .data_type = QMI_STRUCT,
1593 .elem_size = sizeof(struct qmi_response_type_v01),
1594 .array_type = NO_ARRAY,
1596 .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp),
1597 .ei_array = qmi_response_type_v01_ei,
1600 .data_type = QMI_EOTI,
1601 .array_type = NO_ARRAY,
1602 .tlv_type = QMI_COMMON_TLV_TYPE,
1606 static const struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = {
1608 .data_type = QMI_UNSIGNED_4_BYTE,
1610 .elem_size = sizeof(u32),
1611 .array_type = NO_ARRAY,
1613 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1617 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1619 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1620 .array_type = NO_ARRAY,
1622 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1626 .data_type = QMI_UNSIGNED_4_BYTE,
1628 .elem_size = sizeof(u32),
1629 .array_type = NO_ARRAY,
1631 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1635 .data_type = QMI_UNSIGNED_4_BYTE,
1637 .elem_size = sizeof(u32),
1638 .array_type = NO_ARRAY,
1640 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1644 .data_type = QMI_UNSIGNED_4_BYTE,
1646 .elem_size = sizeof(u32),
1647 .array_type = NO_ARRAY,
1649 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1653 .data_type = QMI_EOTI,
1654 .array_type = NO_ARRAY,
1655 .tlv_type = QMI_COMMON_TLV_TYPE,
1659 static const struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = {
1661 .data_type = QMI_UNSIGNED_4_BYTE,
1663 .elem_size = sizeof(u32),
1664 .array_type = NO_ARRAY,
1666 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1670 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1672 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1673 .array_type = NO_ARRAY,
1675 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1679 .data_type = QMI_UNSIGNED_4_BYTE,
1681 .elem_size = sizeof(u32),
1682 .array_type = NO_ARRAY,
1684 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1688 .data_type = QMI_EOTI,
1689 .array_type = NO_ARRAY,
1690 .tlv_type = QMI_COMMON_TLV_TYPE,
1694 static const struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = {
1696 .data_type = QMI_UNSIGNED_2_BYTE,
1698 .elem_size = sizeof(u16),
1699 .array_type = NO_ARRAY,
1701 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id),
1704 .data_type = QMI_UNSIGNED_2_BYTE,
1706 .elem_size = sizeof(u16),
1707 .array_type = NO_ARRAY,
1709 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01,
1713 .data_type = QMI_EOTI,
1714 .array_type = QMI_COMMON_TLV_TYPE,
1718 static const struct qmi_elem_info qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei[] = {
1720 .data_type = QMI_UNSIGNED_4_BYTE,
1722 .elem_size = sizeof(u32),
1723 .array_type = NO_ARRAY,
1725 .offset = offsetof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01,
1729 .data_type = QMI_EOTI,
1730 .array_type = NO_ARRAY,
1731 .tlv_type = QMI_COMMON_TLV_TYPE,
1735 static const struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = {
1737 .data_type = QMI_UNSIGNED_4_BYTE,
1739 .elem_size = sizeof(u32),
1740 .array_type = NO_ARRAY,
1742 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1746 .data_type = QMI_OPT_FLAG,
1748 .elem_size = sizeof(u8),
1749 .array_type = NO_ARRAY,
1751 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1755 .data_type = QMI_UNSIGNED_1_BYTE,
1757 .elem_size = sizeof(u8),
1758 .array_type = NO_ARRAY,
1760 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1764 .data_type = QMI_EOTI,
1765 .array_type = NO_ARRAY,
1766 .tlv_type = QMI_COMMON_TLV_TYPE,
1770 static const struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = {
1772 .data_type = QMI_STRUCT,
1774 .elem_size = sizeof(struct qmi_response_type_v01),
1775 .array_type = NO_ARRAY,
1777 .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01,
1779 .ei_array = qmi_response_type_v01_ei,
1782 .data_type = QMI_EOTI,
1783 .array_type = NO_ARRAY,
1784 .tlv_type = QMI_COMMON_TLV_TYPE,
1788 static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = {
1790 .data_type = QMI_OPT_FLAG,
1792 .elem_size = sizeof(u8),
1793 .array_type = NO_ARRAY,
1795 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1796 host_version_valid),
1799 .data_type = QMI_STRING,
1800 .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1,
1801 .elem_size = sizeof(char),
1802 .array_type = NO_ARRAY,
1804 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1808 .data_type = QMI_OPT_FLAG,
1810 .elem_size = sizeof(u8),
1811 .array_type = NO_ARRAY,
1813 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1817 .data_type = QMI_DATA_LEN,
1819 .elem_size = sizeof(u8),
1820 .array_type = NO_ARRAY,
1822 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1826 .data_type = QMI_STRUCT,
1827 .elem_len = QMI_WLANFW_MAX_NUM_CE_V01,
1828 .elem_size = sizeof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01),
1829 .array_type = VAR_LEN_ARRAY,
1831 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1833 .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei,
1836 .data_type = QMI_OPT_FLAG,
1838 .elem_size = sizeof(u8),
1839 .array_type = NO_ARRAY,
1841 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1845 .data_type = QMI_DATA_LEN,
1847 .elem_size = sizeof(u8),
1848 .array_type = NO_ARRAY,
1850 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1854 .data_type = QMI_STRUCT,
1855 .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01,
1856 .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01),
1857 .array_type = VAR_LEN_ARRAY,
1859 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1861 .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei,
1864 .data_type = QMI_OPT_FLAG,
1866 .elem_size = sizeof(u8),
1867 .array_type = NO_ARRAY,
1869 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1873 .data_type = QMI_DATA_LEN,
1875 .elem_size = sizeof(u8),
1876 .array_type = NO_ARRAY,
1878 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1882 .data_type = QMI_STRUCT,
1883 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01,
1884 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01),
1885 .array_type = VAR_LEN_ARRAY,
1887 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1889 .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei,
1892 .data_type = QMI_OPT_FLAG,
1894 .elem_size = sizeof(u8),
1895 .array_type = NO_ARRAY,
1897 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1898 shadow_reg_v3_valid),
1901 .data_type = QMI_DATA_LEN,
1903 .elem_size = sizeof(u8),
1904 .array_type = NO_ARRAY,
1906 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1910 .data_type = QMI_STRUCT,
1911 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01,
1912 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01),
1913 .array_type = VAR_LEN_ARRAY,
1915 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1917 .ei_array = qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei,
1920 .data_type = QMI_EOTI,
1921 .array_type = NO_ARRAY,
1922 .tlv_type = QMI_COMMON_TLV_TYPE,
1926 static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = {
1928 .data_type = QMI_STRUCT,
1930 .elem_size = sizeof(struct qmi_response_type_v01),
1931 .array_type = NO_ARRAY,
1933 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp),
1934 .ei_array = qmi_response_type_v01_ei,
1937 .data_type = QMI_EOTI,
1938 .array_type = NO_ARRAY,
1939 .tlv_type = QMI_COMMON_TLV_TYPE,
1943 static const struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = {
1945 .data_type = QMI_EOTI,
1946 .array_type = NO_ARRAY,
1950 static const struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = {
1952 .data_type = QMI_EOTI,
1953 .array_type = NO_ARRAY,
1957 static const struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = {
1959 .data_type = QMI_OPT_FLAG,
1961 .elem_size = sizeof(u8),
1962 .array_type = NO_ARRAY,
1964 .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01,
1965 enable_fwlog_valid),
1968 .data_type = QMI_UNSIGNED_1_BYTE,
1970 .elem_size = sizeof(u8),
1971 .array_type = NO_ARRAY,
1973 .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01,
1977 .data_type = QMI_EOTI,
1978 .array_type = NO_ARRAY,
1979 .tlv_type = QMI_COMMON_TLV_TYPE,
1983 static const struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = {
1985 .data_type = QMI_STRUCT,
1987 .elem_size = sizeof(struct qmi_response_type_v01),
1988 .array_type = NO_ARRAY,
1990 .offset = offsetof(struct qmi_wlanfw_wlan_ini_resp_msg_v01,
1992 .ei_array = qmi_response_type_v01_ei,
1995 .data_type = QMI_EOTI,
1996 .array_type = NO_ARRAY,
1997 .tlv_type = QMI_COMMON_TLV_TYPE,
2001 static void ath12k_host_cap_parse_mlo(struct ath12k_base *ab,
2002 struct qmi_wlanfw_host_cap_req_msg_v01 *req)
2004 struct wlfw_host_mlo_chip_info_s_v01 *info;
2008 if (!ab->qmi.num_radios || ab->qmi.num_radios == U8_MAX) {
2009 ath12k_dbg(ab, ATH12K_DBG_QMI,
2010 "skip QMI MLO cap due to invalid num_radio %d\n",
2011 ab->qmi.num_radios);
2015 req->mlo_capable_valid = 1;
2016 req->mlo_capable = 1;
2017 req->mlo_chip_id_valid = 1;
2018 req->mlo_chip_id = 0;
2019 req->mlo_group_id_valid = 1;
2020 req->mlo_group_id = 0;
2021 req->max_mlo_peer_valid = 1;
2022 /* Max peer number generally won't change for the same device
2023 * but needs to be synced with host driver.
2025 req->max_mlo_peer = ab->hw_params->max_mlo_peer;
2026 req->mlo_num_chips_valid = 1;
2027 req->mlo_num_chips = 1;
2029 info = &req->mlo_chip_info[0];
2031 info->num_local_links = ab->qmi.num_radios;
2033 for (i = 0; i < info->num_local_links; i++) {
2034 info->hw_link_id[i] = hw_link_id;
2035 info->valid_mlo_link_id[i] = 1;
2040 req->mlo_chip_info_valid = 1;
2043 static int ath12k_qmi_host_cap_send(struct ath12k_base *ab)
2045 struct qmi_wlanfw_host_cap_req_msg_v01 req = {};
2046 struct qmi_wlanfw_host_cap_resp_msg_v01 resp = {};
2050 req.num_clients_valid = 1;
2051 req.num_clients = 1;
2052 req.mem_cfg_mode = ab->qmi.target_mem_mode;
2053 req.mem_cfg_mode_valid = 1;
2054 req.bdf_support_valid = 1;
2055 req.bdf_support = 1;
2057 req.m3_support_valid = 1;
2059 req.m3_cache_support_valid = 1;
2060 req.m3_cache_support = 1;
2062 req.cal_done_valid = 1;
2063 req.cal_done = ab->qmi.cal_done;
2065 if (ab->hw_params->qmi_cnss_feature_bitmap) {
2066 req.feature_list_valid = 1;
2067 req.feature_list = ab->hw_params->qmi_cnss_feature_bitmap;
2070 /* BRINGUP: here we are piggybacking a lot of stuff using
2071 * internal_sleep_clock, should it be split?
2073 if (ab->hw_params->internal_sleep_clock) {
2074 req.nm_modem_valid = 1;
2076 /* Notify firmware that this is non-qualcomm platform. */
2077 req.nm_modem |= HOST_CSTATE_BIT;
2079 /* Notify firmware about the sleep clock selection,
2080 * nm_modem_bit[1] is used for this purpose. Host driver on
2081 * non-qualcomm platforms should select internal sleep
2084 req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT;
2085 req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET;
2088 ath12k_host_cap_parse_mlo(ab, &req);
2090 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2091 qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp);
2095 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2096 QMI_WLANFW_HOST_CAP_REQ_V01,
2097 QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN,
2098 qmi_wlanfw_host_cap_req_msg_v01_ei, &req);
2100 qmi_txn_cancel(&txn);
2101 ath12k_warn(ab, "Failed to send host capability request,err = %d\n", ret);
2105 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2109 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2110 ath12k_warn(ab, "Host capability request failed, result: %d, err: %d\n",
2111 resp.resp.result, resp.resp.error);
2120 static void ath12k_qmi_phy_cap_send(struct ath12k_base *ab)
2122 struct qmi_wlanfw_phy_cap_req_msg_v01 req = {};
2123 struct qmi_wlanfw_phy_cap_resp_msg_v01 resp = {};
2127 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2128 qmi_wlanfw_phy_cap_resp_msg_v01_ei, &resp);
2132 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2133 QMI_WLANFW_PHY_CAP_REQ_V01,
2134 QMI_WLANFW_PHY_CAP_REQ_MSG_V01_MAX_LEN,
2135 qmi_wlanfw_phy_cap_req_msg_v01_ei, &req);
2137 qmi_txn_cancel(&txn);
2138 ath12k_warn(ab, "failed to send phy capability request: %d\n", ret);
2142 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2146 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2151 if (!resp.num_phy_valid) {
2156 ab->qmi.num_radios = resp.num_phy;
2158 ath12k_dbg(ab, ATH12K_DBG_QMI, "phy capability resp valid %d num_phy %d valid %d board_id %d\n",
2159 resp.num_phy_valid, resp.num_phy,
2160 resp.board_id_valid, resp.board_id);
2165 /* If PHY capability not advertised then rely on default num link */
2166 ab->qmi.num_radios = ab->hw_params->def_num_link;
2168 ath12k_dbg(ab, ATH12K_DBG_QMI,
2169 "no valid response from PHY capability, choose default num_phy %d\n",
2170 ab->qmi.num_radios);
2173 static int ath12k_qmi_fw_ind_register_send(struct ath12k_base *ab)
2175 struct qmi_wlanfw_ind_register_req_msg_v01 *req;
2176 struct qmi_wlanfw_ind_register_resp_msg_v01 *resp;
2177 struct qmi_handle *handle = &ab->qmi.handle;
2181 req = kzalloc(sizeof(*req), GFP_KERNEL);
2185 resp = kzalloc(sizeof(*resp), GFP_KERNEL);
2191 req->client_id_valid = 1;
2192 req->client_id = QMI_WLANFW_CLIENT_ID;
2193 req->fw_ready_enable_valid = 1;
2194 req->fw_ready_enable = 1;
2195 req->request_mem_enable_valid = 1;
2196 req->request_mem_enable = 1;
2197 req->fw_mem_ready_enable_valid = 1;
2198 req->fw_mem_ready_enable = 1;
2199 req->cal_done_enable_valid = 1;
2200 req->cal_done_enable = 1;
2201 req->fw_init_done_enable_valid = 1;
2202 req->fw_init_done_enable = 1;
2204 req->pin_connect_result_enable_valid = 0;
2205 req->pin_connect_result_enable = 0;
2207 ret = qmi_txn_init(handle, &txn,
2208 qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
2212 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2213 QMI_WLANFW_IND_REGISTER_REQ_V01,
2214 QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN,
2215 qmi_wlanfw_ind_register_req_msg_v01_ei, req);
2217 qmi_txn_cancel(&txn);
2218 ath12k_warn(ab, "Failed to send indication register request, err = %d\n",
2223 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2225 ath12k_warn(ab, "failed to register fw indication %d\n", ret);
2229 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
2230 ath12k_warn(ab, "FW Ind register request failed, result: %d, err: %d\n",
2231 resp->resp.result, resp->resp.error);
2243 static int ath12k_qmi_respond_fw_mem_request(struct ath12k_base *ab)
2245 struct qmi_wlanfw_respond_mem_req_msg_v01 *req;
2246 struct qmi_wlanfw_respond_mem_resp_msg_v01 resp = {};
2251 req = kzalloc(sizeof(*req), GFP_KERNEL);
2255 /* Some targets by default request a block of big contiguous
2256 * DMA memory, it's hard to allocate from kernel. So host returns
2257 * failure to firmware and firmware then request multiple blocks of
2258 * small chunk size memory.
2260 if (ab->qmi.target_mem_delayed) {
2262 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi delays mem_request %d\n",
2263 ab->qmi.mem_seg_count);
2266 req->mem_seg_len = ab->qmi.mem_seg_count;
2267 for (i = 0; i < req->mem_seg_len ; i++) {
2268 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
2269 req->mem_seg[i].size = ab->qmi.target_mem[i].size;
2270 req->mem_seg[i].type = ab->qmi.target_mem[i].type;
2271 ath12k_dbg(ab, ATH12K_DBG_QMI,
2272 "qmi req mem_seg[%d] %pad %u %u\n", i,
2273 &ab->qmi.target_mem[i].paddr,
2274 ab->qmi.target_mem[i].size,
2275 ab->qmi.target_mem[i].type);
2279 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2280 qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);
2284 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2285 QMI_WLANFW_RESPOND_MEM_REQ_V01,
2286 QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,
2287 qmi_wlanfw_respond_mem_req_msg_v01_ei, req);
2289 qmi_txn_cancel(&txn);
2290 ath12k_warn(ab, "qmi failed to respond memory request, err = %d\n",
2295 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2297 ath12k_warn(ab, "qmi failed memory request, err = %d\n", ret);
2301 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2302 /* the error response is expected when
2303 * target_mem_delayed is true.
2305 if (delayed && resp.resp.error == 0)
2308 ath12k_warn(ab, "Respond mem req failed, result: %d, err: %d\n",
2309 resp.resp.result, resp.resp.error);
2318 static void ath12k_qmi_free_target_mem_chunk(struct ath12k_base *ab)
2322 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
2323 if (!ab->qmi.target_mem[i].v.addr)
2325 dma_free_coherent(ab->dev,
2326 ab->qmi.target_mem[i].size,
2327 ab->qmi.target_mem[i].v.addr,
2328 ab->qmi.target_mem[i].paddr);
2329 ab->qmi.target_mem[i].v.addr = NULL;
2333 static int ath12k_qmi_alloc_target_mem_chunk(struct ath12k_base *ab)
2336 struct target_mem_chunk *chunk;
2338 ab->qmi.target_mem_delayed = false;
2340 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
2341 chunk = &ab->qmi.target_mem[i];
2343 /* Allocate memory for the region and the functionality supported
2344 * on the host. For the non-supported memory region, host does not
2345 * allocate memory, assigns NULL and FW will handle this without crashing.
2347 switch (chunk->type) {
2348 case HOST_DDR_REGION_TYPE:
2349 case M3_DUMP_REGION_TYPE:
2350 case PAGEABLE_MEM_REGION_TYPE:
2351 case CALDB_MEM_REGION_TYPE:
2352 chunk->v.addr = dma_alloc_coherent(ab->dev,
2355 GFP_KERNEL | __GFP_NOWARN);
2356 if (!chunk->v.addr) {
2357 if (chunk->size > ATH12K_QMI_MAX_CHUNK_SIZE) {
2358 ab->qmi.target_mem_delayed = true;
2360 "qmi dma allocation failed (%d B type %u), will try later with small size\n",
2363 ath12k_qmi_free_target_mem_chunk(ab);
2366 ath12k_warn(ab, "memory allocation failure for %u size: %d\n",
2367 chunk->type, chunk->size);
2372 ath12k_warn(ab, "memory type %u not supported\n",
2375 chunk->v.addr = NULL;
2382 static int ath12k_qmi_request_target_cap(struct ath12k_base *ab)
2384 struct qmi_wlanfw_cap_req_msg_v01 req = {};
2385 struct qmi_wlanfw_cap_resp_msg_v01 resp = {};
2387 unsigned int board_id = ATH12K_BOARD_ID_DEFAULT;
2392 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2393 qmi_wlanfw_cap_resp_msg_v01_ei, &resp);
2397 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2398 QMI_WLANFW_CAP_REQ_V01,
2399 QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN,
2400 qmi_wlanfw_cap_req_msg_v01_ei, &req);
2402 qmi_txn_cancel(&txn);
2403 ath12k_warn(ab, "qmi failed to send target cap request, err = %d\n",
2408 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2410 ath12k_warn(ab, "qmi failed target cap request %d\n", ret);
2414 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2415 ath12k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n",
2416 resp.resp.result, resp.resp.error);
2421 if (resp.chip_info_valid) {
2422 ab->qmi.target.chip_id = resp.chip_info.chip_id;
2423 ab->qmi.target.chip_family = resp.chip_info.chip_family;
2426 if (resp.board_info_valid)
2427 ab->qmi.target.board_id = resp.board_info.board_id;
2429 ab->qmi.target.board_id = board_id;
2431 if (resp.soc_info_valid)
2432 ab->qmi.target.soc_id = resp.soc_info.soc_id;
2434 if (resp.fw_version_info_valid) {
2435 ab->qmi.target.fw_version = resp.fw_version_info.fw_version;
2436 strscpy(ab->qmi.target.fw_build_timestamp,
2437 resp.fw_version_info.fw_build_timestamp,
2438 sizeof(ab->qmi.target.fw_build_timestamp));
2441 if (resp.fw_build_id_valid)
2442 strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id,
2443 sizeof(ab->qmi.target.fw_build_id));
2445 if (resp.dev_mem_info_valid) {
2446 for (i = 0; i < ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01; i++) {
2447 ab->qmi.dev_mem[i].start =
2448 resp.dev_mem[i].start;
2449 ab->qmi.dev_mem[i].size =
2450 resp.dev_mem[i].size;
2451 ath12k_dbg(ab, ATH12K_DBG_QMI,
2452 "devmem [%d] start ox%llx size %llu\n", i,
2453 ab->qmi.dev_mem[i].start,
2454 ab->qmi.dev_mem[i].size);
2458 if (resp.eeprom_caldata_read_timeout_valid) {
2459 ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout;
2460 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n");
2463 ath12k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n",
2464 ab->qmi.target.chip_id, ab->qmi.target.chip_family,
2465 ab->qmi.target.board_id, ab->qmi.target.soc_id);
2467 ath12k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s",
2468 ab->qmi.target.fw_version,
2469 ab->qmi.target.fw_build_timestamp,
2470 ab->qmi.target.fw_build_id);
2472 r = ath12k_core_check_smbios(ab);
2474 ath12k_dbg(ab, ATH12K_DBG_QMI, "SMBIOS bdf variant name not set.\n");
2480 static int ath12k_qmi_load_file_target_mem(struct ath12k_base *ab,
2481 const u8 *data, u32 len, u8 type)
2483 struct qmi_wlanfw_bdf_download_req_msg_v01 *req;
2484 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp = {};
2486 const u8 *temp = data;
2488 u32 remaining = len;
2490 req = kzalloc(sizeof(*req), GFP_KERNEL);
2496 req->file_id_valid = 1;
2497 req->file_id = ab->qmi.target.board_id;
2498 req->total_size_valid = 1;
2499 req->total_size = remaining;
2500 req->seg_id_valid = 1;
2501 req->data_valid = 1;
2502 req->bdf_type = type;
2503 req->bdf_type_valid = 1;
2507 if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) {
2508 req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01;
2510 req->data_len = remaining;
2514 if (type == ATH12K_QMI_FILE_TYPE_EEPROM) {
2515 req->data_valid = 0;
2517 req->data_len = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE;
2519 memcpy(req->data, temp, req->data_len);
2522 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2523 qmi_wlanfw_bdf_download_resp_msg_v01_ei,
2528 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf download req fixed addr type %d\n",
2531 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2532 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,
2533 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,
2534 qmi_wlanfw_bdf_download_req_msg_v01_ei, req);
2536 qmi_txn_cancel(&txn);
2540 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2544 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2545 ath12k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n",
2546 resp.resp.result, resp.resp.error);
2551 if (type == ATH12K_QMI_FILE_TYPE_EEPROM) {
2554 remaining -= req->data_len;
2555 temp += req->data_len;
2557 ath12k_dbg(ab, ATH12K_DBG_QMI,
2558 "qmi bdf download request remaining %i\n",
2568 static int ath12k_qmi_load_bdf_qmi(struct ath12k_base *ab,
2569 enum ath12k_qmi_bdf_type type)
2571 struct device *dev = ab->dev;
2572 char filename[ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE];
2573 const struct firmware *fw_entry;
2574 struct ath12k_board_data bd;
2575 u32 fw_size, file_type;
2579 memset(&bd, 0, sizeof(bd));
2582 case ATH12K_QMI_BDF_TYPE_ELF:
2583 ret = ath12k_core_fetch_bdf(ab, &bd);
2585 ath12k_warn(ab, "qmi failed to load bdf:\n");
2589 if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0)
2590 type = ATH12K_QMI_BDF_TYPE_ELF;
2592 type = ATH12K_QMI_BDF_TYPE_BIN;
2595 case ATH12K_QMI_BDF_TYPE_REGDB:
2596 ret = ath12k_core_fetch_regdb(ab, &bd);
2598 ath12k_warn(ab, "qmi failed to load regdb bin:\n");
2602 case ATH12K_QMI_BDF_TYPE_CALIBRATION:
2604 if (ab->qmi.target.eeprom_caldata) {
2605 file_type = ATH12K_QMI_FILE_TYPE_EEPROM;
2607 fw_size = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE;
2609 file_type = ATH12K_QMI_FILE_TYPE_CALDATA;
2611 /* cal-<bus>-<id>.bin */
2612 snprintf(filename, sizeof(filename), "cal-%s-%s.bin",
2613 ath12k_bus_str(ab->hif.bus), dev_name(dev));
2614 fw_entry = ath12k_core_firmware_request(ab, filename);
2615 if (!IS_ERR(fw_entry))
2618 fw_entry = ath12k_core_firmware_request(ab,
2619 ATH12K_DEFAULT_CAL_FILE);
2620 if (IS_ERR(fw_entry)) {
2621 ret = PTR_ERR(fw_entry);
2623 "qmi failed to load CAL data file:%s\n",
2629 fw_size = min_t(u32, ab->hw_params->fw.board_size,
2631 tmp = fw_entry->data;
2633 ret = ath12k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type);
2635 ath12k_warn(ab, "qmi failed to load caldata\n");
2639 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi caldata downloaded: type: %u\n",
2643 if (!ab->qmi.target.eeprom_caldata)
2644 release_firmware(fw_entry);
2647 ath12k_warn(ab, "unknown file type for load %d", type);
2651 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf_type %d\n", type);
2653 fw_size = min_t(u32, ab->hw_params->fw.board_size, bd.len);
2655 ret = ath12k_qmi_load_file_target_mem(ab, bd.data, fw_size, type);
2657 ath12k_warn(ab, "qmi failed to load bdf file\n");
2660 ath12k_core_free_bdf(ab, &bd);
2661 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi BDF download sequence completed\n");
2666 static int ath12k_qmi_m3_load(struct ath12k_base *ab)
2668 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2669 const struct firmware *fw;
2673 if (m3_mem->vaddr || m3_mem->size)
2676 fw = ath12k_core_firmware_request(ab, ATH12K_M3_FILE);
2679 ath12k_core_create_firmware_path(ab, ATH12K_M3_FILE,
2680 path, sizeof(path));
2681 ath12k_err(ab, "failed to load %s: %d\n", path, ret);
2685 m3_mem->vaddr = dma_alloc_coherent(ab->dev,
2686 fw->size, &m3_mem->paddr,
2688 if (!m3_mem->vaddr) {
2689 ath12k_err(ab, "failed to allocate memory for M3 with size %zu\n",
2691 release_firmware(fw);
2695 memcpy(m3_mem->vaddr, fw->data, fw->size);
2696 m3_mem->size = fw->size;
2697 release_firmware(fw);
2702 static void ath12k_qmi_m3_free(struct ath12k_base *ab)
2704 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2709 dma_free_coherent(ab->dev, m3_mem->size,
2710 m3_mem->vaddr, m3_mem->paddr);
2711 m3_mem->vaddr = NULL;
2715 static int ath12k_qmi_wlanfw_m3_info_send(struct ath12k_base *ab)
2717 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2718 struct qmi_wlanfw_m3_info_req_msg_v01 req = {};
2719 struct qmi_wlanfw_m3_info_resp_msg_v01 resp = {};
2723 ret = ath12k_qmi_m3_load(ab);
2725 ath12k_err(ab, "failed to load m3 firmware: %d", ret);
2729 req.addr = m3_mem->paddr;
2730 req.size = m3_mem->size;
2732 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2733 qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp);
2737 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2738 QMI_WLANFW_M3_INFO_REQ_V01,
2739 QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN,
2740 qmi_wlanfw_m3_info_req_msg_v01_ei, &req);
2742 qmi_txn_cancel(&txn);
2743 ath12k_warn(ab, "qmi failed to send M3 information request, err = %d\n",
2748 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2750 ath12k_warn(ab, "qmi failed M3 information request %d\n", ret);
2754 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2755 ath12k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n",
2756 resp.resp.result, resp.resp.error);
2764 static int ath12k_qmi_wlanfw_mode_send(struct ath12k_base *ab,
2767 struct qmi_wlanfw_wlan_mode_req_msg_v01 req = {};
2768 struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp = {};
2773 req.hw_debug_valid = 1;
2776 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2777 qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp);
2781 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2782 QMI_WLANFW_WLAN_MODE_REQ_V01,
2783 QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN,
2784 qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req);
2786 qmi_txn_cancel(&txn);
2787 ath12k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n",
2792 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2794 if (mode == ATH12K_FIRMWARE_MODE_OFF && ret == -ENETRESET) {
2795 ath12k_warn(ab, "WLFW service is dis-connected\n");
2798 ath12k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n",
2803 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2804 ath12k_warn(ab, "Mode request failed, mode: %d, result: %d err: %d\n",
2805 mode, resp.resp.result, resp.resp.error);
2814 static int ath12k_qmi_wlanfw_wlan_cfg_send(struct ath12k_base *ab)
2816 struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req;
2817 struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp = {};
2818 struct ce_pipe_config *ce_cfg;
2819 struct service_to_pipe *svc_cfg;
2821 int ret = 0, pipe_num;
2823 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce;
2824 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map;
2826 req = kzalloc(sizeof(*req), GFP_KERNEL);
2830 req->host_version_valid = 1;
2831 strscpy(req->host_version, ATH12K_HOST_VERSION_STRING,
2832 sizeof(req->host_version));
2834 req->tgt_cfg_valid = 1;
2835 /* This is number of CE configs */
2836 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;
2837 for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) {
2838 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;
2839 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;
2840 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;
2841 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;
2842 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;
2845 req->svc_cfg_valid = 1;
2846 /* This is number of Service/CE configs */
2847 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;
2848 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {
2849 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;
2850 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;
2851 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;
2854 /* set shadow v3 configuration */
2855 if (ab->hw_params->supports_shadow_regs) {
2856 req->shadow_reg_v3_valid = 1;
2857 req->shadow_reg_v3_len = min_t(u32,
2858 ab->qmi.ce_cfg.shadow_reg_v3_len,
2859 QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01);
2860 memcpy(&req->shadow_reg_v3, ab->qmi.ce_cfg.shadow_reg_v3,
2861 sizeof(u32) * req->shadow_reg_v3_len);
2863 req->shadow_reg_v3_valid = 0;
2866 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2867 qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp);
2871 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2872 QMI_WLANFW_WLAN_CFG_REQ_V01,
2873 QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN,
2874 qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req);
2876 qmi_txn_cancel(&txn);
2877 ath12k_warn(ab, "qmi failed to send wlan config request, err = %d\n",
2882 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2884 ath12k_warn(ab, "qmi failed wlan config request, err = %d\n", ret);
2888 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2889 ath12k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n",
2890 resp.resp.result, resp.resp.error);
2900 static int ath12k_qmi_wlanfw_wlan_ini_send(struct ath12k_base *ab)
2902 struct qmi_wlanfw_wlan_ini_resp_msg_v01 resp = {};
2903 struct qmi_wlanfw_wlan_ini_req_msg_v01 req = {};
2907 req.enable_fwlog_valid = true;
2908 req.enable_fwlog = 1;
2910 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2911 qmi_wlanfw_wlan_ini_resp_msg_v01_ei, &resp);
2915 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2916 ATH12K_QMI_WLANFW_WLAN_INI_REQ_V01,
2917 QMI_WLANFW_WLAN_INI_REQ_MSG_V01_MAX_LEN,
2918 qmi_wlanfw_wlan_ini_req_msg_v01_ei, &req);
2920 qmi_txn_cancel(&txn);
2921 ath12k_warn(ab, "failed to send QMI wlan ini request: %d\n",
2926 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS));
2928 ath12k_warn(ab, "failed to receive QMI wlan ini request: %d\n", ret);
2932 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2933 ath12k_warn(ab, "QMI wlan ini response failure: %d %d\n",
2934 resp.resp.result, resp.resp.error);
2943 void ath12k_qmi_firmware_stop(struct ath12k_base *ab)
2947 ret = ath12k_qmi_wlanfw_mode_send(ab, ATH12K_FIRMWARE_MODE_OFF);
2949 ath12k_warn(ab, "qmi failed to send wlan mode off\n");
2954 int ath12k_qmi_firmware_start(struct ath12k_base *ab,
2959 ret = ath12k_qmi_wlanfw_wlan_ini_send(ab);
2961 ath12k_warn(ab, "qmi failed to send wlan fw ini: %d\n", ret);
2965 ret = ath12k_qmi_wlanfw_wlan_cfg_send(ab);
2967 ath12k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret);
2971 ret = ath12k_qmi_wlanfw_mode_send(ab, mode);
2973 ath12k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret);
2981 ath12k_qmi_driver_event_post(struct ath12k_qmi *qmi,
2982 enum ath12k_qmi_event_type type,
2985 struct ath12k_qmi_driver_event *event;
2987 event = kzalloc(sizeof(*event), GFP_ATOMIC);
2994 spin_lock(&qmi->event_lock);
2995 list_add_tail(&event->list, &qmi->event_list);
2996 spin_unlock(&qmi->event_lock);
2998 queue_work(qmi->event_wq, &qmi->event_work);
3003 static int ath12k_qmi_event_server_arrive(struct ath12k_qmi *qmi)
3005 struct ath12k_base *ab = qmi->ab;
3008 ath12k_qmi_phy_cap_send(ab);
3010 ret = ath12k_qmi_fw_ind_register_send(ab);
3012 ath12k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret);
3016 ret = ath12k_qmi_host_cap_send(ab);
3018 ath12k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret);
3025 static int ath12k_qmi_event_mem_request(struct ath12k_qmi *qmi)
3027 struct ath12k_base *ab = qmi->ab;
3030 ret = ath12k_qmi_respond_fw_mem_request(ab);
3032 ath12k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret);
3039 static int ath12k_qmi_event_load_bdf(struct ath12k_qmi *qmi)
3041 struct ath12k_base *ab = qmi->ab;
3044 ret = ath12k_qmi_request_target_cap(ab);
3046 ath12k_warn(ab, "qmi failed to req target capabilities:%d\n", ret);
3050 ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_REGDB);
3052 ath12k_warn(ab, "qmi failed to load regdb file:%d\n", ret);
3056 ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_ELF);
3058 ath12k_warn(ab, "qmi failed to load board data file:%d\n", ret);
3062 if (ab->hw_params->download_calib) {
3063 ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_CALIBRATION);
3065 ath12k_warn(ab, "qmi failed to load calibrated data :%d\n", ret);
3068 ret = ath12k_qmi_wlanfw_m3_info_send(ab);
3070 ath12k_warn(ab, "qmi failed to send m3 info req:%d\n", ret);
3077 static void ath12k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
3078 struct sockaddr_qrtr *sq,
3079 struct qmi_txn *txn,
3082 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);
3083 struct ath12k_base *ab = qmi->ab;
3084 const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data;
3087 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware request memory request\n");
3089 if (msg->mem_seg_len == 0 ||
3090 msg->mem_seg_len > ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01)
3091 ath12k_warn(ab, "Invalid memory segment length: %u\n",
3094 ab->qmi.mem_seg_count = msg->mem_seg_len;
3096 for (i = 0; i < qmi->mem_seg_count ; i++) {
3097 ab->qmi.target_mem[i].type = msg->mem_seg[i].type;
3098 ab->qmi.target_mem[i].size = msg->mem_seg[i].size;
3099 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi mem seg type %d size %d\n",
3100 msg->mem_seg[i].type, msg->mem_seg[i].size);
3103 ret = ath12k_qmi_alloc_target_mem_chunk(ab);
3105 ath12k_warn(ab, "qmi failed to alloc target memory: %d\n",
3110 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_REQUEST_MEM, NULL);
3113 static void ath12k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl,
3114 struct sockaddr_qrtr *sq,
3115 struct qmi_txn *txn,
3116 const void *decoded)
3118 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);
3119 struct ath12k_base *ab = qmi->ab;
3121 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware memory ready indication\n");
3122 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_MEM_READY, NULL);
3125 static void ath12k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl,
3126 struct sockaddr_qrtr *sq,
3127 struct qmi_txn *txn,
3128 const void *decoded)
3130 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);
3131 struct ath12k_base *ab = qmi->ab;
3133 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware ready\n");
3134 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_READY, NULL);
3137 static const struct qmi_msg_handler ath12k_qmi_msg_handlers[] = {
3139 .type = QMI_INDICATION,
3140 .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
3141 .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
3142 .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01),
3143 .fn = ath12k_qmi_msg_mem_request_cb,
3146 .type = QMI_INDICATION,
3147 .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
3148 .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
3149 .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01),
3150 .fn = ath12k_qmi_msg_mem_ready_cb,
3153 .type = QMI_INDICATION,
3154 .msg_id = QMI_WLFW_FW_READY_IND_V01,
3155 .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
3156 .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01),
3157 .fn = ath12k_qmi_msg_fw_ready_cb,
3161 static int ath12k_qmi_ops_new_server(struct qmi_handle *qmi_hdl,
3162 struct qmi_service *service)
3164 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);
3165 struct ath12k_base *ab = qmi->ab;
3166 struct sockaddr_qrtr *sq = &qmi->sq;
3169 sq->sq_family = AF_QIPCRTR;
3170 sq->sq_node = service->node;
3171 sq->sq_port = service->port;
3173 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq,
3176 ath12k_warn(ab, "qmi failed to connect to remote service %d\n", ret);
3180 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw qmi service connected\n");
3181 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_ARRIVE, NULL);
3186 static void ath12k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,
3187 struct qmi_service *service)
3189 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle);
3190 struct ath12k_base *ab = qmi->ab;
3192 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw del server\n");
3193 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_EXIT, NULL);
3196 static const struct qmi_ops ath12k_qmi_ops = {
3197 .new_server = ath12k_qmi_ops_new_server,
3198 .del_server = ath12k_qmi_ops_del_server,
3201 static void ath12k_qmi_driver_event_work(struct work_struct *work)
3203 struct ath12k_qmi *qmi = container_of(work, struct ath12k_qmi,
3205 struct ath12k_qmi_driver_event *event;
3206 struct ath12k_base *ab = qmi->ab;
3209 spin_lock(&qmi->event_lock);
3210 while (!list_empty(&qmi->event_list)) {
3211 event = list_first_entry(&qmi->event_list,
3212 struct ath12k_qmi_driver_event, list);
3213 list_del(&event->list);
3214 spin_unlock(&qmi->event_lock);
3216 if (test_bit(ATH12K_FLAG_UNREGISTERING, &ab->dev_flags))
3219 switch (event->type) {
3220 case ATH12K_QMI_EVENT_SERVER_ARRIVE:
3221 ret = ath12k_qmi_event_server_arrive(qmi);
3223 set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);
3225 case ATH12K_QMI_EVENT_SERVER_EXIT:
3226 set_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags);
3227 set_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags);
3229 case ATH12K_QMI_EVENT_REQUEST_MEM:
3230 ret = ath12k_qmi_event_mem_request(qmi);
3232 set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);
3234 case ATH12K_QMI_EVENT_FW_MEM_READY:
3235 ret = ath12k_qmi_event_load_bdf(qmi);
3237 set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);
3239 case ATH12K_QMI_EVENT_FW_READY:
3240 clear_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags);
3241 if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) {
3242 ath12k_hal_dump_srng_stats(ab);
3243 queue_work(ab->workqueue, &ab->restart_work);
3247 clear_bit(ATH12K_FLAG_CRASH_FLUSH,
3249 clear_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags);
3250 ath12k_core_qmi_firmware_ready(ab);
3251 set_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags);
3255 ath12k_warn(ab, "invalid event type: %d", event->type);
3261 spin_lock(&qmi->event_lock);
3263 spin_unlock(&qmi->event_lock);
3266 int ath12k_qmi_init_service(struct ath12k_base *ab)
3270 memset(&ab->qmi.target, 0, sizeof(struct target_info));
3271 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk));
3274 ab->qmi.target_mem_mode = ATH12K_QMI_TARGET_MEM_MODE_DEFAULT;
3275 ret = qmi_handle_init(&ab->qmi.handle, ATH12K_QMI_RESP_LEN_MAX,
3276 &ath12k_qmi_ops, ath12k_qmi_msg_handlers);
3278 ath12k_warn(ab, "failed to initialize qmi handle\n");
3282 ab->qmi.event_wq = alloc_ordered_workqueue("ath12k_qmi_driver_event", 0);
3283 if (!ab->qmi.event_wq) {
3284 ath12k_err(ab, "failed to allocate workqueue\n");
3288 INIT_LIST_HEAD(&ab->qmi.event_list);
3289 spin_lock_init(&ab->qmi.event_lock);
3290 INIT_WORK(&ab->qmi.event_work, ath12k_qmi_driver_event_work);
3292 ret = qmi_add_lookup(&ab->qmi.handle, ATH12K_QMI_WLFW_SERVICE_ID_V01,
3293 ATH12K_QMI_WLFW_SERVICE_VERS_V01,
3294 ab->qmi.service_ins_id);
3296 ath12k_warn(ab, "failed to add qmi lookup\n");
3297 destroy_workqueue(ab->qmi.event_wq);
3304 void ath12k_qmi_deinit_service(struct ath12k_base *ab)
3306 qmi_handle_release(&ab->qmi.handle);
3307 cancel_work_sync(&ab->qmi.event_work);
3308 destroy_workqueue(ab->qmi.event_wq);
3309 ath12k_qmi_m3_free(ab);
3310 ath12k_qmi_free_target_mem_chunk(ab);
3313 void ath12k_qmi_free_resource(struct ath12k_base *ab)
3315 ath12k_qmi_free_target_mem_chunk(ab);
3316 ath12k_qmi_m3_free(ab);