1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
12 #include <linux/firmware.h>
14 #define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02
15 #define HOST_CSTATE_BIT 0x04
17 bool ath11k_cold_boot_cal = 1;
18 EXPORT_SYMBOL(ath11k_cold_boot_cal);
19 module_param_named(cold_boot_cal, ath11k_cold_boot_cal, bool, 0644);
20 MODULE_PARM_DESC(cold_boot_cal,
21 "Decrease the channel switch time but increase the driver load time (Default: true)");
23 static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = {
25 .data_type = QMI_OPT_FLAG,
27 .elem_size = sizeof(u8),
28 .array_type = NO_ARRAY,
30 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
34 .data_type = QMI_UNSIGNED_4_BYTE,
36 .elem_size = sizeof(u32),
37 .array_type = NO_ARRAY,
39 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
43 .data_type = QMI_OPT_FLAG,
45 .elem_size = sizeof(u8),
46 .array_type = NO_ARRAY,
48 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
52 .data_type = QMI_UNSIGNED_4_BYTE,
54 .elem_size = sizeof(u32),
55 .array_type = NO_ARRAY,
57 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
61 .data_type = QMI_OPT_FLAG,
63 .elem_size = sizeof(u8),
64 .array_type = NO_ARRAY,
66 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
70 .data_type = QMI_DATA_LEN,
72 .elem_size = sizeof(u8),
73 .array_type = NO_ARRAY,
75 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
79 .data_type = QMI_UNSIGNED_4_BYTE,
80 .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,
81 .elem_size = sizeof(u32),
82 .array_type = VAR_LEN_ARRAY,
84 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
88 .data_type = QMI_OPT_FLAG,
90 .elem_size = sizeof(u8),
91 .array_type = NO_ARRAY,
93 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
97 .data_type = QMI_UNSIGNED_1_BYTE,
99 .elem_size = sizeof(u8),
100 .array_type = NO_ARRAY,
102 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
106 .data_type = QMI_OPT_FLAG,
108 .elem_size = sizeof(u8),
109 .array_type = NO_ARRAY,
111 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
115 .data_type = QMI_UNSIGNED_1_BYTE,
117 .elem_size = sizeof(u8),
118 .array_type = NO_ARRAY,
120 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
124 .data_type = QMI_OPT_FLAG,
126 .elem_size = sizeof(u8),
127 .array_type = NO_ARRAY,
129 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
130 bdf_cache_support_valid),
133 .data_type = QMI_UNSIGNED_1_BYTE,
135 .elem_size = sizeof(u8),
136 .array_type = NO_ARRAY,
138 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
142 .data_type = QMI_OPT_FLAG,
144 .elem_size = sizeof(u8),
145 .array_type = NO_ARRAY,
147 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
151 .data_type = QMI_UNSIGNED_1_BYTE,
153 .elem_size = sizeof(u8),
154 .array_type = NO_ARRAY,
156 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
160 .data_type = QMI_OPT_FLAG,
162 .elem_size = sizeof(u8),
163 .array_type = NO_ARRAY,
165 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
166 m3_cache_support_valid),
169 .data_type = QMI_UNSIGNED_1_BYTE,
171 .elem_size = sizeof(u8),
172 .array_type = NO_ARRAY,
174 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
178 .data_type = QMI_OPT_FLAG,
180 .elem_size = sizeof(u8),
181 .array_type = NO_ARRAY,
183 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
184 cal_filesys_support_valid),
187 .data_type = QMI_UNSIGNED_1_BYTE,
189 .elem_size = sizeof(u8),
190 .array_type = NO_ARRAY,
192 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
193 cal_filesys_support),
196 .data_type = QMI_OPT_FLAG,
198 .elem_size = sizeof(u8),
199 .array_type = NO_ARRAY,
201 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
202 cal_cache_support_valid),
205 .data_type = QMI_UNSIGNED_1_BYTE,
207 .elem_size = sizeof(u8),
208 .array_type = NO_ARRAY,
210 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
214 .data_type = QMI_OPT_FLAG,
216 .elem_size = sizeof(u8),
217 .array_type = NO_ARRAY,
219 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
223 .data_type = QMI_UNSIGNED_1_BYTE,
225 .elem_size = sizeof(u8),
226 .array_type = NO_ARRAY,
228 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
232 .data_type = QMI_OPT_FLAG,
234 .elem_size = sizeof(u8),
235 .array_type = NO_ARRAY,
237 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
241 .data_type = QMI_UNSIGNED_4_BYTE,
243 .elem_size = sizeof(u32),
244 .array_type = NO_ARRAY,
246 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
250 .data_type = QMI_OPT_FLAG,
252 .elem_size = sizeof(u8),
253 .array_type = NO_ARRAY,
255 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
259 .data_type = QMI_UNSIGNED_1_BYTE,
261 .elem_size = sizeof(u8),
262 .array_type = NO_ARRAY,
264 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
268 .data_type = QMI_EOTI,
269 .array_type = NO_ARRAY,
270 .tlv_type = QMI_COMMON_TLV_TYPE,
274 static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = {
276 .data_type = QMI_STRUCT,
278 .elem_size = sizeof(struct qmi_response_type_v01),
279 .array_type = NO_ARRAY,
281 .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp),
282 .ei_array = qmi_response_type_v01_ei,
285 .data_type = QMI_EOTI,
286 .array_type = NO_ARRAY,
287 .tlv_type = QMI_COMMON_TLV_TYPE,
291 static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = {
293 .data_type = QMI_OPT_FLAG,
295 .elem_size = sizeof(u8),
296 .array_type = NO_ARRAY,
298 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
299 fw_ready_enable_valid),
302 .data_type = QMI_UNSIGNED_1_BYTE,
304 .elem_size = sizeof(u8),
305 .array_type = NO_ARRAY,
307 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
311 .data_type = QMI_OPT_FLAG,
313 .elem_size = sizeof(u8),
314 .array_type = NO_ARRAY,
316 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
317 initiate_cal_download_enable_valid),
320 .data_type = QMI_UNSIGNED_1_BYTE,
322 .elem_size = sizeof(u8),
323 .array_type = NO_ARRAY,
325 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
326 initiate_cal_download_enable),
329 .data_type = QMI_OPT_FLAG,
331 .elem_size = sizeof(u8),
332 .array_type = NO_ARRAY,
334 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
335 initiate_cal_update_enable_valid),
338 .data_type = QMI_UNSIGNED_1_BYTE,
340 .elem_size = sizeof(u8),
341 .array_type = NO_ARRAY,
343 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
344 initiate_cal_update_enable),
347 .data_type = QMI_OPT_FLAG,
349 .elem_size = sizeof(u8),
350 .array_type = NO_ARRAY,
352 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
353 msa_ready_enable_valid),
356 .data_type = QMI_UNSIGNED_1_BYTE,
358 .elem_size = sizeof(u8),
359 .array_type = NO_ARRAY,
361 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
365 .data_type = QMI_OPT_FLAG,
367 .elem_size = sizeof(u8),
368 .array_type = NO_ARRAY,
370 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
371 pin_connect_result_enable_valid),
374 .data_type = QMI_UNSIGNED_1_BYTE,
376 .elem_size = sizeof(u8),
377 .array_type = NO_ARRAY,
379 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
380 pin_connect_result_enable),
383 .data_type = QMI_OPT_FLAG,
385 .elem_size = sizeof(u8),
386 .array_type = NO_ARRAY,
388 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
392 .data_type = QMI_UNSIGNED_4_BYTE,
394 .elem_size = sizeof(u32),
395 .array_type = NO_ARRAY,
397 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
401 .data_type = QMI_OPT_FLAG,
403 .elem_size = sizeof(u8),
404 .array_type = NO_ARRAY,
406 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
407 request_mem_enable_valid),
410 .data_type = QMI_UNSIGNED_1_BYTE,
412 .elem_size = sizeof(u8),
413 .array_type = NO_ARRAY,
415 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
419 .data_type = QMI_OPT_FLAG,
421 .elem_size = sizeof(u8),
422 .array_type = NO_ARRAY,
424 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
425 fw_mem_ready_enable_valid),
428 .data_type = QMI_UNSIGNED_1_BYTE,
430 .elem_size = sizeof(u8),
431 .array_type = NO_ARRAY,
433 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
434 fw_mem_ready_enable),
437 .data_type = QMI_OPT_FLAG,
439 .elem_size = sizeof(u8),
440 .array_type = NO_ARRAY,
442 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
443 fw_init_done_enable_valid),
446 .data_type = QMI_UNSIGNED_1_BYTE,
448 .elem_size = sizeof(u8),
449 .array_type = NO_ARRAY,
451 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
452 fw_init_done_enable),
456 .data_type = QMI_OPT_FLAG,
458 .elem_size = sizeof(u8),
459 .array_type = NO_ARRAY,
461 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
462 rejuvenate_enable_valid),
465 .data_type = QMI_UNSIGNED_1_BYTE,
467 .elem_size = sizeof(u8),
468 .array_type = NO_ARRAY,
470 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
474 .data_type = QMI_OPT_FLAG,
476 .elem_size = sizeof(u8),
477 .array_type = NO_ARRAY,
479 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
480 xo_cal_enable_valid),
483 .data_type = QMI_UNSIGNED_1_BYTE,
485 .elem_size = sizeof(u8),
486 .array_type = NO_ARRAY,
488 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
492 .data_type = QMI_OPT_FLAG,
494 .elem_size = sizeof(u8),
495 .array_type = NO_ARRAY,
497 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
498 cal_done_enable_valid),
501 .data_type = QMI_UNSIGNED_1_BYTE,
503 .elem_size = sizeof(u8),
504 .array_type = NO_ARRAY,
506 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
510 .data_type = QMI_EOTI,
511 .array_type = NO_ARRAY,
512 .tlv_type = QMI_COMMON_TLV_TYPE,
516 static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = {
518 .data_type = QMI_STRUCT,
520 .elem_size = sizeof(struct qmi_response_type_v01),
521 .array_type = NO_ARRAY,
523 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
525 .ei_array = qmi_response_type_v01_ei,
528 .data_type = QMI_OPT_FLAG,
530 .elem_size = sizeof(u8),
531 .array_type = NO_ARRAY,
533 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
537 .data_type = QMI_UNSIGNED_8_BYTE,
539 .elem_size = sizeof(u64),
540 .array_type = NO_ARRAY,
542 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
546 .data_type = QMI_EOTI,
547 .array_type = NO_ARRAY,
548 .tlv_type = QMI_COMMON_TLV_TYPE,
552 static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = {
554 .data_type = QMI_UNSIGNED_8_BYTE,
556 .elem_size = sizeof(u64),
557 .array_type = NO_ARRAY,
559 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset),
562 .data_type = QMI_UNSIGNED_4_BYTE,
564 .elem_size = sizeof(u32),
565 .array_type = NO_ARRAY,
567 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size),
570 .data_type = QMI_UNSIGNED_1_BYTE,
572 .elem_size = sizeof(u8),
573 .array_type = NO_ARRAY,
575 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag),
578 .data_type = QMI_EOTI,
579 .array_type = NO_ARRAY,
580 .tlv_type = QMI_COMMON_TLV_TYPE,
584 static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = {
586 .data_type = QMI_UNSIGNED_4_BYTE,
588 .elem_size = sizeof(u32),
589 .array_type = NO_ARRAY,
591 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01,
595 .data_type = QMI_SIGNED_4_BYTE_ENUM,
597 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
598 .array_type = NO_ARRAY,
600 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type),
603 .data_type = QMI_DATA_LEN,
605 .elem_size = sizeof(u8),
606 .array_type = NO_ARRAY,
608 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len),
611 .data_type = QMI_STRUCT,
612 .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01,
613 .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01),
614 .array_type = VAR_LEN_ARRAY,
616 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg),
617 .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei,
620 .data_type = QMI_EOTI,
621 .array_type = NO_ARRAY,
622 .tlv_type = QMI_COMMON_TLV_TYPE,
626 static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = {
628 .data_type = QMI_DATA_LEN,
630 .elem_size = sizeof(u8),
631 .array_type = NO_ARRAY,
633 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
637 .data_type = QMI_STRUCT,
638 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
639 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01),
640 .array_type = VAR_LEN_ARRAY,
642 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
644 .ei_array = qmi_wlanfw_mem_seg_s_v01_ei,
647 .data_type = QMI_EOTI,
648 .array_type = NO_ARRAY,
649 .tlv_type = QMI_COMMON_TLV_TYPE,
653 static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = {
655 .data_type = QMI_UNSIGNED_8_BYTE,
657 .elem_size = sizeof(u64),
658 .array_type = NO_ARRAY,
660 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr),
663 .data_type = QMI_UNSIGNED_4_BYTE,
665 .elem_size = sizeof(u32),
666 .array_type = NO_ARRAY,
668 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size),
671 .data_type = QMI_SIGNED_4_BYTE_ENUM,
673 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
674 .array_type = NO_ARRAY,
676 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type),
679 .data_type = QMI_UNSIGNED_1_BYTE,
681 .elem_size = sizeof(u8),
682 .array_type = NO_ARRAY,
684 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore),
687 .data_type = QMI_EOTI,
688 .array_type = NO_ARRAY,
689 .tlv_type = QMI_COMMON_TLV_TYPE,
693 static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = {
695 .data_type = QMI_DATA_LEN,
697 .elem_size = sizeof(u8),
698 .array_type = NO_ARRAY,
700 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
704 .data_type = QMI_STRUCT,
705 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
706 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01),
707 .array_type = VAR_LEN_ARRAY,
709 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
711 .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei,
714 .data_type = QMI_EOTI,
715 .array_type = NO_ARRAY,
716 .tlv_type = QMI_COMMON_TLV_TYPE,
720 static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = {
722 .data_type = QMI_STRUCT,
724 .elem_size = sizeof(struct qmi_response_type_v01),
725 .array_type = NO_ARRAY,
727 .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01,
729 .ei_array = qmi_response_type_v01_ei,
732 .data_type = QMI_EOTI,
733 .array_type = NO_ARRAY,
734 .tlv_type = QMI_COMMON_TLV_TYPE,
738 static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = {
740 .data_type = QMI_EOTI,
741 .array_type = NO_ARRAY,
742 .tlv_type = QMI_COMMON_TLV_TYPE,
746 static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
748 .data_type = QMI_UNSIGNED_4_BYTE,
750 .elem_size = sizeof(u32),
751 .array_type = NO_ARRAY,
753 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
757 .data_type = QMI_UNSIGNED_4_BYTE,
759 .elem_size = sizeof(u32),
760 .array_type = NO_ARRAY,
762 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
766 .data_type = QMI_EOTI,
767 .array_type = NO_ARRAY,
768 .tlv_type = QMI_COMMON_TLV_TYPE,
772 static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = {
774 .data_type = QMI_UNSIGNED_4_BYTE,
776 .elem_size = sizeof(u32),
777 .array_type = NO_ARRAY,
779 .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01,
783 .data_type = QMI_EOTI,
784 .array_type = NO_ARRAY,
785 .tlv_type = QMI_COMMON_TLV_TYPE,
789 static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = {
791 .data_type = QMI_UNSIGNED_4_BYTE,
793 .elem_size = sizeof(u32),
794 .array_type = NO_ARRAY,
796 .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id),
799 .data_type = QMI_EOTI,
800 .array_type = NO_ARRAY,
801 .tlv_type = QMI_COMMON_TLV_TYPE,
805 static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = {
807 .data_type = QMI_UNSIGNED_4_BYTE,
809 .elem_size = sizeof(u32),
810 .array_type = NO_ARRAY,
812 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
816 .data_type = QMI_STRING,
817 .elem_len = ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1,
818 .elem_size = sizeof(char),
819 .array_type = NO_ARRAY,
821 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
825 .data_type = QMI_EOTI,
826 .array_type = NO_ARRAY,
827 .tlv_type = QMI_COMMON_TLV_TYPE,
831 static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = {
833 .data_type = QMI_STRUCT,
835 .elem_size = sizeof(struct qmi_response_type_v01),
836 .array_type = NO_ARRAY,
838 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp),
839 .ei_array = qmi_response_type_v01_ei,
842 .data_type = QMI_OPT_FLAG,
844 .elem_size = sizeof(u8),
845 .array_type = NO_ARRAY,
847 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
851 .data_type = QMI_STRUCT,
853 .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01),
854 .array_type = NO_ARRAY,
856 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
858 .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei,
861 .data_type = QMI_OPT_FLAG,
863 .elem_size = sizeof(u8),
864 .array_type = NO_ARRAY,
866 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
870 .data_type = QMI_STRUCT,
872 .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01),
873 .array_type = NO_ARRAY,
875 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
877 .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei,
880 .data_type = QMI_OPT_FLAG,
882 .elem_size = sizeof(u8),
883 .array_type = NO_ARRAY,
885 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
889 .data_type = QMI_STRUCT,
891 .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01),
892 .array_type = NO_ARRAY,
894 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
896 .ei_array = qmi_wlanfw_soc_info_s_v01_ei,
899 .data_type = QMI_OPT_FLAG,
901 .elem_size = sizeof(u8),
902 .array_type = NO_ARRAY,
904 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
905 fw_version_info_valid),
908 .data_type = QMI_STRUCT,
910 .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01),
911 .array_type = NO_ARRAY,
913 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
915 .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei,
918 .data_type = QMI_OPT_FLAG,
920 .elem_size = sizeof(u8),
921 .array_type = NO_ARRAY,
923 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
927 .data_type = QMI_STRING,
928 .elem_len = ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1,
929 .elem_size = sizeof(char),
930 .array_type = NO_ARRAY,
932 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
936 .data_type = QMI_OPT_FLAG,
938 .elem_size = sizeof(u8),
939 .array_type = NO_ARRAY,
941 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
945 .data_type = QMI_UNSIGNED_1_BYTE,
947 .elem_size = sizeof(u8),
948 .array_type = NO_ARRAY,
950 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
954 .data_type = QMI_EOTI,
955 .array_type = NO_ARRAY,
956 .tlv_type = QMI_COMMON_TLV_TYPE,
960 static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = {
962 .data_type = QMI_UNSIGNED_1_BYTE,
964 .elem_size = sizeof(u8),
965 .array_type = NO_ARRAY,
967 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
971 .data_type = QMI_OPT_FLAG,
973 .elem_size = sizeof(u8),
974 .array_type = NO_ARRAY,
976 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
980 .data_type = QMI_SIGNED_4_BYTE_ENUM,
982 .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01),
983 .array_type = NO_ARRAY,
985 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
989 .data_type = QMI_OPT_FLAG,
991 .elem_size = sizeof(u8),
992 .array_type = NO_ARRAY,
994 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
998 .data_type = QMI_UNSIGNED_4_BYTE,
1000 .elem_size = sizeof(u32),
1001 .array_type = NO_ARRAY,
1003 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1007 .data_type = QMI_OPT_FLAG,
1009 .elem_size = sizeof(u8),
1010 .array_type = NO_ARRAY,
1012 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1016 .data_type = QMI_UNSIGNED_4_BYTE,
1018 .elem_size = sizeof(u32),
1019 .array_type = NO_ARRAY,
1021 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1025 .data_type = QMI_OPT_FLAG,
1027 .elem_size = sizeof(u8),
1028 .array_type = NO_ARRAY,
1030 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1034 .data_type = QMI_DATA_LEN,
1036 .elem_size = sizeof(u16),
1037 .array_type = NO_ARRAY,
1039 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1043 .data_type = QMI_UNSIGNED_1_BYTE,
1044 .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01,
1045 .elem_size = sizeof(u8),
1046 .array_type = VAR_LEN_ARRAY,
1048 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1052 .data_type = QMI_OPT_FLAG,
1054 .elem_size = sizeof(u8),
1055 .array_type = NO_ARRAY,
1057 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1061 .data_type = QMI_UNSIGNED_1_BYTE,
1063 .elem_size = sizeof(u8),
1064 .array_type = NO_ARRAY,
1066 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1070 .data_type = QMI_OPT_FLAG,
1072 .elem_size = sizeof(u8),
1073 .array_type = NO_ARRAY,
1075 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1079 .data_type = QMI_UNSIGNED_1_BYTE,
1081 .elem_size = sizeof(u8),
1082 .array_type = NO_ARRAY,
1084 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1089 .data_type = QMI_EOTI,
1090 .array_type = NO_ARRAY,
1091 .tlv_type = QMI_COMMON_TLV_TYPE,
1095 static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = {
1097 .data_type = QMI_STRUCT,
1099 .elem_size = sizeof(struct qmi_response_type_v01),
1100 .array_type = NO_ARRAY,
1102 .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01,
1104 .ei_array = qmi_response_type_v01_ei,
1107 .data_type = QMI_EOTI,
1108 .array_type = NO_ARRAY,
1109 .tlv_type = QMI_COMMON_TLV_TYPE,
1113 static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = {
1115 .data_type = QMI_UNSIGNED_8_BYTE,
1117 .elem_size = sizeof(u64),
1118 .array_type = NO_ARRAY,
1120 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr),
1123 .data_type = QMI_UNSIGNED_4_BYTE,
1125 .elem_size = sizeof(u32),
1126 .array_type = NO_ARRAY,
1128 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size),
1131 .data_type = QMI_EOTI,
1132 .array_type = NO_ARRAY,
1133 .tlv_type = QMI_COMMON_TLV_TYPE,
1137 static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = {
1139 .data_type = QMI_STRUCT,
1141 .elem_size = sizeof(struct qmi_response_type_v01),
1142 .array_type = NO_ARRAY,
1144 .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp),
1145 .ei_array = qmi_response_type_v01_ei,
1148 .data_type = QMI_EOTI,
1149 .array_type = NO_ARRAY,
1150 .tlv_type = QMI_COMMON_TLV_TYPE,
1154 static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = {
1156 .data_type = QMI_UNSIGNED_4_BYTE,
1158 .elem_size = sizeof(u32),
1159 .array_type = NO_ARRAY,
1161 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1165 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1167 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1168 .array_type = NO_ARRAY,
1170 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1174 .data_type = QMI_UNSIGNED_4_BYTE,
1176 .elem_size = sizeof(u32),
1177 .array_type = NO_ARRAY,
1179 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1183 .data_type = QMI_UNSIGNED_4_BYTE,
1185 .elem_size = sizeof(u32),
1186 .array_type = NO_ARRAY,
1188 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1192 .data_type = QMI_UNSIGNED_4_BYTE,
1194 .elem_size = sizeof(u32),
1195 .array_type = NO_ARRAY,
1197 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1201 .data_type = QMI_EOTI,
1202 .array_type = NO_ARRAY,
1203 .tlv_type = QMI_COMMON_TLV_TYPE,
1207 static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = {
1209 .data_type = QMI_UNSIGNED_4_BYTE,
1211 .elem_size = sizeof(u32),
1212 .array_type = NO_ARRAY,
1214 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1218 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1220 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1221 .array_type = NO_ARRAY,
1223 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1227 .data_type = QMI_UNSIGNED_4_BYTE,
1229 .elem_size = sizeof(u32),
1230 .array_type = NO_ARRAY,
1232 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1236 .data_type = QMI_EOTI,
1237 .array_type = NO_ARRAY,
1238 .tlv_type = QMI_COMMON_TLV_TYPE,
1242 static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = {
1244 .data_type = QMI_UNSIGNED_2_BYTE,
1246 .elem_size = sizeof(u16),
1247 .array_type = NO_ARRAY,
1249 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id),
1252 .data_type = QMI_UNSIGNED_2_BYTE,
1254 .elem_size = sizeof(u16),
1255 .array_type = NO_ARRAY,
1257 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01,
1261 .data_type = QMI_EOTI,
1262 .array_type = QMI_COMMON_TLV_TYPE,
1266 static struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = {
1268 .data_type = QMI_UNSIGNED_4_BYTE,
1270 .elem_size = sizeof(u32),
1271 .array_type = NO_ARRAY,
1273 .offset = offsetof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01,
1277 .data_type = QMI_EOTI,
1278 .array_type = NO_ARRAY,
1279 .tlv_type = QMI_COMMON_TLV_TYPE,
1283 static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = {
1285 .data_type = QMI_UNSIGNED_4_BYTE,
1287 .elem_size = sizeof(u32),
1288 .array_type = NO_ARRAY,
1290 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1294 .data_type = QMI_OPT_FLAG,
1296 .elem_size = sizeof(u8),
1297 .array_type = NO_ARRAY,
1299 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1303 .data_type = QMI_UNSIGNED_1_BYTE,
1305 .elem_size = sizeof(u8),
1306 .array_type = NO_ARRAY,
1308 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1312 .data_type = QMI_EOTI,
1313 .array_type = NO_ARRAY,
1314 .tlv_type = QMI_COMMON_TLV_TYPE,
1318 static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = {
1320 .data_type = QMI_STRUCT,
1322 .elem_size = sizeof(struct qmi_response_type_v01),
1323 .array_type = NO_ARRAY,
1325 .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01,
1327 .ei_array = qmi_response_type_v01_ei,
1330 .data_type = QMI_EOTI,
1331 .array_type = NO_ARRAY,
1332 .tlv_type = QMI_COMMON_TLV_TYPE,
1336 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = {
1338 .data_type = QMI_OPT_FLAG,
1340 .elem_size = sizeof(u8),
1341 .array_type = NO_ARRAY,
1343 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1344 host_version_valid),
1347 .data_type = QMI_STRING,
1348 .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1,
1349 .elem_size = sizeof(char),
1350 .array_type = NO_ARRAY,
1352 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1356 .data_type = QMI_OPT_FLAG,
1358 .elem_size = sizeof(u8),
1359 .array_type = NO_ARRAY,
1361 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1365 .data_type = QMI_DATA_LEN,
1367 .elem_size = sizeof(u8),
1368 .array_type = NO_ARRAY,
1370 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1374 .data_type = QMI_STRUCT,
1375 .elem_len = QMI_WLANFW_MAX_NUM_CE_V01,
1376 .elem_size = sizeof(
1377 struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01),
1378 .array_type = VAR_LEN_ARRAY,
1380 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1382 .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei,
1385 .data_type = QMI_OPT_FLAG,
1387 .elem_size = sizeof(u8),
1388 .array_type = NO_ARRAY,
1390 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1394 .data_type = QMI_DATA_LEN,
1396 .elem_size = sizeof(u8),
1397 .array_type = NO_ARRAY,
1399 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1403 .data_type = QMI_STRUCT,
1404 .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01,
1405 .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01),
1406 .array_type = VAR_LEN_ARRAY,
1408 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1410 .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei,
1413 .data_type = QMI_OPT_FLAG,
1415 .elem_size = sizeof(u8),
1416 .array_type = NO_ARRAY,
1418 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1422 .data_type = QMI_DATA_LEN,
1424 .elem_size = sizeof(u8),
1425 .array_type = NO_ARRAY,
1427 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1431 .data_type = QMI_STRUCT,
1432 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01,
1433 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01),
1434 .array_type = VAR_LEN_ARRAY,
1436 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1438 .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei,
1441 .data_type = QMI_OPT_FLAG,
1443 .elem_size = sizeof(u8),
1444 .array_type = NO_ARRAY,
1446 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1447 shadow_reg_v2_valid),
1450 .data_type = QMI_DATA_LEN,
1452 .elem_size = sizeof(u8),
1453 .array_type = NO_ARRAY,
1455 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1459 .data_type = QMI_STRUCT,
1460 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01,
1461 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01),
1462 .array_type = VAR_LEN_ARRAY,
1464 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1466 .ei_array = qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei,
1469 .data_type = QMI_EOTI,
1470 .array_type = NO_ARRAY,
1471 .tlv_type = QMI_COMMON_TLV_TYPE,
1475 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = {
1477 .data_type = QMI_STRUCT,
1479 .elem_size = sizeof(struct qmi_response_type_v01),
1480 .array_type = NO_ARRAY,
1482 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp),
1483 .ei_array = qmi_response_type_v01_ei,
1486 .data_type = QMI_EOTI,
1487 .array_type = NO_ARRAY,
1488 .tlv_type = QMI_COMMON_TLV_TYPE,
1492 static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = {
1494 .data_type = QMI_EOTI,
1495 .array_type = NO_ARRAY,
1499 static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = {
1501 .data_type = QMI_EOTI,
1502 .array_type = NO_ARRAY,
1506 static struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = {
1508 .data_type = QMI_EOTI,
1509 .array_type = NO_ARRAY,
1513 static int ath11k_qmi_host_cap_send(struct ath11k_base *ab)
1515 struct qmi_wlanfw_host_cap_req_msg_v01 req;
1516 struct qmi_wlanfw_host_cap_resp_msg_v01 resp;
1517 struct qmi_txn txn = {};
1520 memset(&req, 0, sizeof(req));
1521 memset(&resp, 0, sizeof(resp));
1523 req.num_clients_valid = 1;
1524 req.num_clients = 1;
1525 req.mem_cfg_mode = ab->qmi.target_mem_mode;
1526 req.mem_cfg_mode_valid = 1;
1527 req.bdf_support_valid = 1;
1528 req.bdf_support = 1;
1530 if (ab->bus_params.m3_fw_support) {
1531 req.m3_support_valid = 1;
1533 req.m3_cache_support_valid = 1;
1534 req.m3_cache_support = 1;
1536 req.m3_support_valid = 0;
1538 req.m3_cache_support_valid = 0;
1539 req.m3_cache_support = 0;
1542 req.cal_done_valid = 1;
1543 req.cal_done = ab->qmi.cal_done;
1545 if (ab->hw_params.internal_sleep_clock) {
1546 req.nm_modem_valid = 1;
1548 /* Notify firmware that this is non-qualcomm platform. */
1549 req.nm_modem |= HOST_CSTATE_BIT;
1551 /* Notify firmware about the sleep clock selection,
1552 * nm_modem_bit[1] is used for this purpose. Host driver on
1553 * non-qualcomm platforms should select internal sleep
1556 req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT;
1559 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi host cap request\n");
1561 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1562 qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp);
1566 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1567 QMI_WLANFW_HOST_CAP_REQ_V01,
1568 QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN,
1569 qmi_wlanfw_host_cap_req_msg_v01_ei, &req);
1571 ath11k_warn(ab, "failed to send host capability request: %d\n", ret);
1575 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1579 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1580 ath11k_warn(ab, "host capability request failed: %d %d\n",
1581 resp.resp.result, resp.resp.error);
1590 static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
1592 struct qmi_wlanfw_ind_register_req_msg_v01 *req;
1593 struct qmi_wlanfw_ind_register_resp_msg_v01 *resp;
1594 struct qmi_handle *handle = &ab->qmi.handle;
1598 req = kzalloc(sizeof(*req), GFP_KERNEL);
1602 resp = kzalloc(sizeof(*resp), GFP_KERNEL);
1608 req->client_id_valid = 1;
1609 req->client_id = QMI_WLANFW_CLIENT_ID;
1610 req->fw_ready_enable_valid = 1;
1611 req->fw_ready_enable = 1;
1612 req->request_mem_enable_valid = 1;
1613 req->request_mem_enable = 1;
1614 req->fw_mem_ready_enable_valid = 1;
1615 req->fw_mem_ready_enable = 1;
1616 req->cal_done_enable_valid = 1;
1617 req->cal_done_enable = 1;
1618 req->fw_init_done_enable_valid = 1;
1619 req->fw_init_done_enable = 1;
1621 req->pin_connect_result_enable_valid = 0;
1622 req->pin_connect_result_enable = 0;
1624 ret = qmi_txn_init(handle, &txn,
1625 qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
1629 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi indication register request\n");
1631 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1632 QMI_WLANFW_IND_REGISTER_REQ_V01,
1633 QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN,
1634 qmi_wlanfw_ind_register_req_msg_v01_ei, req);
1636 ath11k_warn(ab, "failed to send indication register request: %d\n",
1641 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1643 ath11k_warn(ab, "failed to register fw indication: %d\n", ret);
1647 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
1648 ath11k_warn(ab, "firmware indication register request failed: %d %d\n",
1649 resp->resp.result, resp->resp.error);
1661 static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)
1663 struct qmi_wlanfw_respond_mem_req_msg_v01 *req;
1664 struct qmi_wlanfw_respond_mem_resp_msg_v01 resp;
1665 struct qmi_txn txn = {};
1669 req = kzalloc(sizeof(*req), GFP_KERNEL);
1673 memset(&resp, 0, sizeof(resp));
1675 /* For QCA6390 by default FW requests a block of ~4M contiguous
1676 * DMA memory, it's hard to allocate from OS. So host returns
1677 * failure to FW and FW will then request mulitple blocks of small
1678 * chunk size memory.
1680 if (!ab->bus_params.fixed_mem_region && ab->qmi.target_mem_delayed) {
1682 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi delays mem_request %d\n",
1683 ab->qmi.mem_seg_count);
1684 memset(req, 0, sizeof(*req));
1687 req->mem_seg_len = ab->qmi.mem_seg_count;
1689 for (i = 0; i < req->mem_seg_len ; i++) {
1690 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
1691 req->mem_seg[i].size = ab->qmi.target_mem[i].size;
1692 req->mem_seg[i].type = ab->qmi.target_mem[i].type;
1693 ath11k_dbg(ab, ATH11K_DBG_QMI,
1694 "qmi req mem_seg[%d] %pad %u %u\n", i,
1695 &ab->qmi.target_mem[i].paddr,
1696 ab->qmi.target_mem[i].size,
1697 ab->qmi.target_mem[i].type);
1701 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1702 qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);
1706 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi respond memory request delayed %i\n",
1709 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1710 QMI_WLANFW_RESPOND_MEM_REQ_V01,
1711 QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,
1712 qmi_wlanfw_respond_mem_req_msg_v01_ei, req);
1714 ath11k_warn(ab, "failed to respond qmi memory request: %d\n",
1719 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1721 ath11k_warn(ab, "failed to wait qmi memory request: %d\n", ret);
1725 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1726 /* the error response is expected when
1727 * target_mem_delayed is true.
1729 if (delayed && resp.resp.error == 0)
1732 ath11k_warn(ab, "qmi respond memory request failed: %d %d\n",
1733 resp.resp.result, resp.resp.error);
1742 static void ath11k_qmi_free_target_mem_chunk(struct ath11k_base *ab)
1746 if (ab->bus_params.fixed_mem_region)
1749 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
1750 if (!ab->qmi.target_mem[i].vaddr)
1753 dma_free_coherent(ab->dev,
1754 ab->qmi.target_mem[i].size,
1755 ab->qmi.target_mem[i].vaddr,
1756 ab->qmi.target_mem[i].paddr);
1757 ab->qmi.target_mem[i].vaddr = NULL;
1761 static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab)
1764 struct target_mem_chunk *chunk;
1766 ab->qmi.target_mem_delayed = false;
1768 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
1769 chunk = &ab->qmi.target_mem[i];
1770 chunk->vaddr = dma_alloc_coherent(ab->dev,
1774 if (!chunk->vaddr) {
1775 if (ab->qmi.mem_seg_count <= ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT) {
1776 ath11k_dbg(ab, ATH11K_DBG_QMI,
1777 "qmi dma allocation failed (%d B type %u), will try later with small size\n",
1780 ath11k_qmi_free_target_mem_chunk(ab);
1781 ab->qmi.target_mem_delayed = true;
1785 ath11k_err(ab, "failed to allocate dma memory for qmi (%d B type %u)\n",
1795 static int ath11k_qmi_assign_target_mem_chunk(struct ath11k_base *ab)
1799 for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
1800 switch (ab->qmi.target_mem[i].type) {
1801 case BDF_MEM_REGION_TYPE:
1802 ab->qmi.target_mem[idx].paddr = ab->hw_params.bdf_addr;
1803 ab->qmi.target_mem[idx].vaddr = NULL;
1804 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
1805 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
1808 case CALDB_MEM_REGION_TYPE:
1809 if (ab->qmi.target_mem[i].size > ATH11K_QMI_CALDB_SIZE) {
1810 ath11k_warn(ab, "qmi mem size is low to load caldata\n");
1814 if (ath11k_cold_boot_cal && ab->hw_params.cold_boot_calib) {
1815 ab->qmi.target_mem[idx].paddr =
1816 ATH11K_QMI_CALDB_ADDRESS;
1817 ab->qmi.target_mem[idx].vaddr =
1818 (void *)ATH11K_QMI_CALDB_ADDRESS;
1820 ab->qmi.target_mem[idx].paddr = 0;
1821 ab->qmi.target_mem[idx].vaddr = NULL;
1823 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
1824 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
1828 ath11k_warn(ab, "qmi ignore invalid mem req type %d\n",
1829 ab->qmi.target_mem[i].type);
1833 ab->qmi.mem_seg_count = idx;
1838 static int ath11k_qmi_request_target_cap(struct ath11k_base *ab)
1840 struct qmi_wlanfw_cap_req_msg_v01 req;
1841 struct qmi_wlanfw_cap_resp_msg_v01 resp;
1842 struct qmi_txn txn = {};
1846 memset(&req, 0, sizeof(req));
1847 memset(&resp, 0, sizeof(resp));
1849 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1850 qmi_wlanfw_cap_resp_msg_v01_ei, &resp);
1854 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi target cap request\n");
1856 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1857 QMI_WLANFW_CAP_REQ_V01,
1858 QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN,
1859 qmi_wlanfw_cap_req_msg_v01_ei, &req);
1861 ath11k_warn(ab, "failed to send qmi cap request: %d\n",
1866 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1868 ath11k_warn(ab, "failed to wait qmi cap request: %d\n", ret);
1872 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1873 ath11k_warn(ab, "qmi cap request failed: %d %d\n",
1874 resp.resp.result, resp.resp.error);
1879 if (resp.chip_info_valid) {
1880 ab->qmi.target.chip_id = resp.chip_info.chip_id;
1881 ab->qmi.target.chip_family = resp.chip_info.chip_family;
1884 if (resp.board_info_valid)
1885 ab->qmi.target.board_id = resp.board_info.board_id;
1887 ab->qmi.target.board_id = 0xFF;
1889 if (resp.soc_info_valid)
1890 ab->qmi.target.soc_id = resp.soc_info.soc_id;
1892 if (resp.fw_version_info_valid) {
1893 ab->qmi.target.fw_version = resp.fw_version_info.fw_version;
1894 strlcpy(ab->qmi.target.fw_build_timestamp,
1895 resp.fw_version_info.fw_build_timestamp,
1896 sizeof(ab->qmi.target.fw_build_timestamp));
1899 if (resp.fw_build_id_valid)
1900 strlcpy(ab->qmi.target.fw_build_id, resp.fw_build_id,
1901 sizeof(ab->qmi.target.fw_build_id));
1903 ath11k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n",
1904 ab->qmi.target.chip_id, ab->qmi.target.chip_family,
1905 ab->qmi.target.board_id, ab->qmi.target.soc_id);
1907 ath11k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s",
1908 ab->qmi.target.fw_version,
1909 ab->qmi.target.fw_build_timestamp,
1910 ab->qmi.target.fw_build_id);
1912 r = ath11k_core_check_dt(ab);
1914 ath11k_dbg(ab, ATH11K_DBG_QMI, "DT bdf variant name not set.\n");
1921 ath11k_qmi_prepare_bdf_download(struct ath11k_base *ab, int type,
1922 struct qmi_wlanfw_bdf_download_req_msg_v01 *req,
1923 void __iomem *bdf_addr)
1925 const struct firmware *fw_entry;
1926 struct ath11k_board_data bd;
1931 case ATH11K_QMI_FILE_TYPE_BDF_GOLDEN:
1932 memset(&bd, 0, sizeof(bd));
1934 ret = ath11k_core_fetch_bdf(ab, &bd);
1936 ath11k_warn(ab, "failed to load board file: %d\n", ret);
1940 fw_size = min_t(u32, ab->hw_params.fw.board_size, bd.len);
1941 memcpy_toio(bdf_addr, bd.data, fw_size);
1942 ath11k_core_free_bdf(ab, &bd);
1944 case ATH11K_QMI_FILE_TYPE_CALDATA:
1945 fw_entry = ath11k_core_firmware_request(ab, ATH11K_DEFAULT_CAL_FILE);
1946 if (IS_ERR(fw_entry)) {
1947 ret = PTR_ERR(fw_entry);
1948 ath11k_warn(ab, "failed to load %s: %d\n",
1949 ATH11K_DEFAULT_CAL_FILE, ret);
1953 fw_size = min_t(u32, ab->hw_params.fw.board_size,
1956 memcpy_toio(bdf_addr + ATH11K_QMI_CALDATA_OFFSET,
1957 fw_entry->data, fw_size);
1959 release_firmware(fw_entry);
1965 req->total_size = fw_size;
1969 static int ath11k_qmi_load_bdf_fixed_addr(struct ath11k_base *ab)
1971 struct qmi_wlanfw_bdf_download_req_msg_v01 *req;
1972 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
1973 struct qmi_txn txn = {};
1974 void __iomem *bdf_addr = NULL;
1977 req = kzalloc(sizeof(*req), GFP_KERNEL);
1980 memset(&resp, 0, sizeof(resp));
1982 bdf_addr = ioremap(ab->hw_params.bdf_addr, ATH11K_QMI_BDF_MAX_SIZE);
1984 ath11k_warn(ab, "failed ioremap for board file\n");
1989 for (type = 0; type < ATH11K_QMI_MAX_FILE_TYPE; type++) {
1991 req->file_id_valid = 1;
1992 req->file_id = ab->qmi.target.board_id;
1993 req->total_size_valid = 1;
1994 req->seg_id_valid = 1;
1996 req->data_valid = 0;
1997 req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
1999 req->bdf_type_valid = 0;
2003 ret = ath11k_qmi_prepare_bdf_download(ab, type, req, bdf_addr);
2007 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2008 qmi_wlanfw_bdf_download_resp_msg_v01_ei,
2013 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf download req fixed addr type %d\n",
2016 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2017 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,
2018 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,
2019 qmi_wlanfw_bdf_download_req_msg_v01_ei, req);
2021 qmi_txn_cancel(&txn);
2025 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2029 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2030 ath11k_warn(ab, "board file download request failed: %d %d\n",
2031 resp.resp.result, resp.resp.error);
2044 static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab)
2046 struct qmi_wlanfw_bdf_download_req_msg_v01 *req;
2047 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
2048 struct ath11k_board_data bd;
2049 unsigned int remaining;
2050 struct qmi_txn txn = {};
2055 req = kzalloc(sizeof(*req), GFP_KERNEL);
2058 memset(&resp, 0, sizeof(resp));
2060 memset(&bd, 0, sizeof(bd));
2061 ret = ath11k_core_fetch_bdf(ab, &bd);
2063 ath11k_warn(ab, "failed to fetch board file: %d\n", ret);
2070 if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0)
2071 bdf_type = ATH11K_QMI_BDF_TYPE_ELF;
2073 bdf_type = ATH11K_QMI_BDF_TYPE_BIN;
2075 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf_type %d\n", bdf_type);
2079 req->file_id_valid = 1;
2080 req->file_id = ab->qmi.target.board_id;
2081 req->total_size_valid = 1;
2082 req->total_size = bd.len;
2083 req->seg_id_valid = 1;
2084 req->data_valid = 1;
2085 req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
2086 req->bdf_type = bdf_type;
2087 req->bdf_type_valid = 1;
2091 if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) {
2092 req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01;
2094 req->data_len = remaining;
2098 memcpy(req->data, temp, req->data_len);
2100 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2101 qmi_wlanfw_bdf_download_resp_msg_v01_ei,
2106 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf download request remaining %i\n",
2109 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2110 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,
2111 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,
2112 qmi_wlanfw_bdf_download_req_msg_v01_ei, req);
2114 qmi_txn_cancel(&txn);
2118 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2122 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2123 ath11k_warn(ab, "bdf download request failed: %d %d\n",
2124 resp.resp.result, resp.resp.error);
2125 ret = resp.resp.result;
2128 remaining -= req->data_len;
2129 temp += req->data_len;
2134 ath11k_core_free_bdf(ab, &bd);
2141 static int ath11k_qmi_m3_load(struct ath11k_base *ab)
2143 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2144 const struct firmware *fw;
2148 if (m3_mem->vaddr || m3_mem->size)
2151 fw = ath11k_core_firmware_request(ab, ATH11K_M3_FILE);
2154 ath11k_core_create_firmware_path(ab, ATH11K_M3_FILE,
2155 path, sizeof(path));
2156 ath11k_err(ab, "failed to load %s: %d\n", path, ret);
2160 m3_mem->vaddr = dma_alloc_coherent(ab->dev,
2161 fw->size, &m3_mem->paddr,
2163 if (!m3_mem->vaddr) {
2164 ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
2166 release_firmware(fw);
2170 memcpy(m3_mem->vaddr, fw->data, fw->size);
2171 m3_mem->size = fw->size;
2172 release_firmware(fw);
2177 static void ath11k_qmi_m3_free(struct ath11k_base *ab)
2179 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2181 if (!ab->bus_params.m3_fw_support || !m3_mem->vaddr)
2184 dma_free_coherent(ab->dev, m3_mem->size,
2185 m3_mem->vaddr, m3_mem->paddr);
2186 m3_mem->vaddr = NULL;
2189 static int ath11k_qmi_wlanfw_m3_info_send(struct ath11k_base *ab)
2191 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2192 struct qmi_wlanfw_m3_info_req_msg_v01 req;
2193 struct qmi_wlanfw_m3_info_resp_msg_v01 resp;
2194 struct qmi_txn txn = {};
2197 memset(&req, 0, sizeof(req));
2198 memset(&resp, 0, sizeof(resp));
2200 if (ab->bus_params.m3_fw_support) {
2201 ret = ath11k_qmi_m3_load(ab);
2203 ath11k_err(ab, "failed to load m3 firmware: %d", ret);
2207 req.addr = m3_mem->paddr;
2208 req.size = m3_mem->size;
2214 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2215 qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp);
2219 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi m3 info req\n");
2221 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2222 QMI_WLANFW_M3_INFO_REQ_V01,
2223 QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN,
2224 qmi_wlanfw_m3_info_req_msg_v01_ei, &req);
2226 ath11k_warn(ab, "failed to send m3 information request: %d\n",
2231 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2233 ath11k_warn(ab, "failed to wait m3 information request: %d\n", ret);
2237 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2238 ath11k_warn(ab, "m3 info request failed: %d %d\n",
2239 resp.resp.result, resp.resp.error);
2247 static int ath11k_qmi_wlanfw_mode_send(struct ath11k_base *ab,
2250 struct qmi_wlanfw_wlan_mode_req_msg_v01 req;
2251 struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp;
2252 struct qmi_txn txn = {};
2255 memset(&req, 0, sizeof(req));
2256 memset(&resp, 0, sizeof(resp));
2259 req.hw_debug_valid = 1;
2262 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2263 qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp);
2267 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wlan mode req mode %d\n", mode);
2269 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2270 QMI_WLANFW_WLAN_MODE_REQ_V01,
2271 QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN,
2272 qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req);
2274 ath11k_warn(ab, "failed to send wlan mode request (mode %d): %d\n",
2279 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2281 if (mode == ATH11K_FIRMWARE_MODE_OFF && ret == -ENETRESET) {
2282 ath11k_warn(ab, "WLFW service is dis-connected\n");
2285 ath11k_warn(ab, "failed to wait wlan mode request (mode %d): %d\n",
2290 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2291 ath11k_warn(ab, "wlan mode request failed (mode: %d): %d %d\n",
2292 mode, resp.resp.result, resp.resp.error);
2301 static int ath11k_qmi_wlanfw_wlan_cfg_send(struct ath11k_base *ab)
2303 struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req;
2304 struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp;
2305 struct ce_pipe_config *ce_cfg;
2306 struct service_to_pipe *svc_cfg;
2307 struct qmi_txn txn = {};
2308 int ret = 0, pipe_num;
2310 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce;
2311 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map;
2313 req = kzalloc(sizeof(*req), GFP_KERNEL);
2317 memset(&resp, 0, sizeof(resp));
2319 req->host_version_valid = 1;
2320 strlcpy(req->host_version, ATH11K_HOST_VERSION_STRING,
2321 sizeof(req->host_version));
2323 req->tgt_cfg_valid = 1;
2324 /* This is number of CE configs */
2325 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;
2326 for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) {
2327 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;
2328 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;
2329 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;
2330 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;
2331 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;
2334 req->svc_cfg_valid = 1;
2335 /* This is number of Service/CE configs */
2336 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;
2337 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {
2338 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;
2339 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;
2340 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;
2342 req->shadow_reg_valid = 0;
2344 /* set shadow v2 configuration */
2345 if (ab->hw_params.supports_shadow_regs) {
2346 req->shadow_reg_v2_valid = 1;
2347 req->shadow_reg_v2_len = min_t(u32,
2348 ab->qmi.ce_cfg.shadow_reg_v2_len,
2349 QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01);
2350 memcpy(&req->shadow_reg_v2, ab->qmi.ce_cfg.shadow_reg_v2,
2351 sizeof(u32) * req->shadow_reg_v2_len);
2353 req->shadow_reg_v2_valid = 0;
2356 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2357 qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp);
2361 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wlan cfg req\n");
2363 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2364 QMI_WLANFW_WLAN_CFG_REQ_V01,
2365 QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN,
2366 qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req);
2368 ath11k_warn(ab, "failed to send wlan config request: %d\n",
2373 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2375 ath11k_warn(ab, "failed to wait wlan config request: %d\n", ret);
2379 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2380 ath11k_warn(ab, "wlan config request failed: %d %d\n",
2381 resp.resp.result, resp.resp.error);
2391 void ath11k_qmi_firmware_stop(struct ath11k_base *ab)
2395 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware stop\n");
2397 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_OFF);
2399 ath11k_warn(ab, "qmi failed to send wlan mode off: %d\n", ret);
2404 int ath11k_qmi_firmware_start(struct ath11k_base *ab,
2409 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware start\n");
2411 ret = ath11k_qmi_wlanfw_wlan_cfg_send(ab);
2413 ath11k_warn(ab, "qmi failed to send wlan cfg: %d\n", ret);
2417 ret = ath11k_qmi_wlanfw_mode_send(ab, mode);
2419 ath11k_warn(ab, "qmi failed to send wlan fw mode: %d\n", ret);
2426 static int ath11k_qmi_process_coldboot_calibration(struct ath11k_base *ab)
2431 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_COLD_BOOT);
2433 ath11k_warn(ab, "qmi failed to send wlan fw mode: %d\n", ret);
2437 ath11k_dbg(ab, ATH11K_DBG_QMI, "Coldboot calibration wait started\n");
2439 timeout = wait_event_timeout(ab->qmi.cold_boot_waitq,
2440 (ab->qmi.cal_done == 1),
2441 ATH11K_COLD_BOOT_FW_RESET_DELAY);
2443 ath11k_warn(ab, "coldboot calibration timed out\n");
2447 ath11k_dbg(ab, ATH11K_DBG_QMI, "Coldboot calibration done\n");
2453 ath11k_qmi_driver_event_post(struct ath11k_qmi *qmi,
2454 enum ath11k_qmi_event_type type,
2457 struct ath11k_qmi_driver_event *event;
2459 event = kzalloc(sizeof(*event), GFP_ATOMIC);
2466 spin_lock(&qmi->event_lock);
2467 list_add_tail(&event->list, &qmi->event_list);
2468 spin_unlock(&qmi->event_lock);
2470 queue_work(qmi->event_wq, &qmi->event_work);
2475 static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
2477 struct ath11k_base *ab = qmi->ab;
2480 ret = ath11k_qmi_fw_ind_register_send(ab);
2482 ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
2487 ret = ath11k_qmi_host_cap_send(ab);
2489 ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
2496 static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
2498 struct ath11k_base *ab = qmi->ab;
2501 ret = ath11k_qmi_respond_fw_mem_request(ab);
2503 ath11k_warn(ab, "qmi failed to respond fw mem req: %d\n", ret);
2510 static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
2512 struct ath11k_base *ab = qmi->ab;
2515 ret = ath11k_qmi_request_target_cap(ab);
2517 ath11k_warn(ab, "failed to requeqst qmi target capabilities: %d\n",
2522 if (ab->bus_params.fixed_bdf_addr)
2523 ret = ath11k_qmi_load_bdf_fixed_addr(ab);
2525 ret = ath11k_qmi_load_bdf_qmi(ab);
2527 ath11k_warn(ab, "failed to load board data file: %d\n", ret);
2531 ret = ath11k_qmi_wlanfw_m3_info_send(ab);
2533 ath11k_warn(ab, "failed to send qmi m3 info req: %d\n", ret);
2540 static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
2541 struct sockaddr_qrtr *sq,
2542 struct qmi_txn *txn,
2545 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2546 struct ath11k_base *ab = qmi->ab;
2547 const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data;
2550 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware request memory request\n");
2552 if (msg->mem_seg_len == 0 ||
2553 msg->mem_seg_len > ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01)
2554 ath11k_warn(ab, "invalid memory segment length: %u\n",
2557 ab->qmi.mem_seg_count = msg->mem_seg_len;
2559 for (i = 0; i < qmi->mem_seg_count ; i++) {
2560 ab->qmi.target_mem[i].type = msg->mem_seg[i].type;
2561 ab->qmi.target_mem[i].size = msg->mem_seg[i].size;
2562 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi mem seg type %d size %d\n",
2563 msg->mem_seg[i].type, msg->mem_seg[i].size);
2566 if (ab->bus_params.fixed_mem_region) {
2567 ret = ath11k_qmi_assign_target_mem_chunk(ab);
2569 ath11k_warn(ab, "failed to assign qmi target memory: %d\n",
2574 ret = ath11k_qmi_alloc_target_mem_chunk(ab);
2576 ath11k_warn(ab, "failed to allocate qmi target memory: %d\n",
2582 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_REQUEST_MEM, NULL);
2585 static void ath11k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl,
2586 struct sockaddr_qrtr *sq,
2587 struct qmi_txn *txn,
2588 const void *decoded)
2590 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2591 struct ath11k_base *ab = qmi->ab;
2593 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware memory ready indication\n");
2594 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_MEM_READY, NULL);
2597 static void ath11k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl,
2598 struct sockaddr_qrtr *sq,
2599 struct qmi_txn *txn,
2600 const void *decoded)
2602 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2603 struct ath11k_base *ab = qmi->ab;
2605 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware ready\n");
2606 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_READY, NULL);
2609 static void ath11k_qmi_msg_cold_boot_cal_done_cb(struct qmi_handle *qmi_hdl,
2610 struct sockaddr_qrtr *sq,
2611 struct qmi_txn *txn,
2612 const void *decoded)
2614 struct ath11k_qmi *qmi = container_of(qmi_hdl,
2615 struct ath11k_qmi, handle);
2616 struct ath11k_base *ab = qmi->ab;
2618 ab->qmi.cal_done = 1;
2619 wake_up(&ab->qmi.cold_boot_waitq);
2620 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi cold boot calibration done\n");
2623 static const struct qmi_msg_handler ath11k_qmi_msg_handlers[] = {
2625 .type = QMI_INDICATION,
2626 .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
2627 .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
2628 .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01),
2629 .fn = ath11k_qmi_msg_mem_request_cb,
2632 .type = QMI_INDICATION,
2633 .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
2634 .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
2635 .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01),
2636 .fn = ath11k_qmi_msg_mem_ready_cb,
2639 .type = QMI_INDICATION,
2640 .msg_id = QMI_WLFW_FW_READY_IND_V01,
2641 .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
2642 .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01),
2643 .fn = ath11k_qmi_msg_fw_ready_cb,
2646 .type = QMI_INDICATION,
2647 .msg_id = QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01,
2648 .ei = qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei,
2650 sizeof(struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01),
2651 .fn = ath11k_qmi_msg_cold_boot_cal_done_cb,
2655 static int ath11k_qmi_ops_new_server(struct qmi_handle *qmi_hdl,
2656 struct qmi_service *service)
2658 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2659 struct ath11k_base *ab = qmi->ab;
2660 struct sockaddr_qrtr *sq = &qmi->sq;
2663 sq->sq_family = AF_QIPCRTR;
2664 sq->sq_node = service->node;
2665 sq->sq_port = service->port;
2667 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq,
2670 ath11k_warn(ab, "failed to connect to qmi remote service: %d\n", ret);
2674 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw qmi service connected\n");
2675 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_ARRIVE, NULL);
2680 static void ath11k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,
2681 struct qmi_service *service)
2683 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2684 struct ath11k_base *ab = qmi->ab;
2686 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw del server\n");
2687 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_EXIT, NULL);
2690 static const struct qmi_ops ath11k_qmi_ops = {
2691 .new_server = ath11k_qmi_ops_new_server,
2692 .del_server = ath11k_qmi_ops_del_server,
2695 static void ath11k_qmi_driver_event_work(struct work_struct *work)
2697 struct ath11k_qmi *qmi = container_of(work, struct ath11k_qmi,
2699 struct ath11k_qmi_driver_event *event;
2700 struct ath11k_base *ab = qmi->ab;
2703 spin_lock(&qmi->event_lock);
2704 while (!list_empty(&qmi->event_list)) {
2705 event = list_first_entry(&qmi->event_list,
2706 struct ath11k_qmi_driver_event, list);
2707 list_del(&event->list);
2708 spin_unlock(&qmi->event_lock);
2710 if (test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags))
2713 switch (event->type) {
2714 case ATH11K_QMI_EVENT_SERVER_ARRIVE:
2715 ret = ath11k_qmi_event_server_arrive(qmi);
2717 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
2719 case ATH11K_QMI_EVENT_SERVER_EXIT:
2720 set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
2721 set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
2723 case ATH11K_QMI_EVENT_REQUEST_MEM:
2724 ret = ath11k_qmi_event_mem_request(qmi);
2726 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
2728 case ATH11K_QMI_EVENT_FW_MEM_READY:
2729 ret = ath11k_qmi_event_load_bdf(qmi);
2731 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
2733 case ATH11K_QMI_EVENT_FW_READY:
2734 clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
2735 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
2736 ath11k_hal_dump_srng_stats(ab);
2737 queue_work(ab->workqueue, &ab->restart_work);
2741 if (ath11k_cold_boot_cal && ab->qmi.cal_done == 0 &&
2742 ab->hw_params.cold_boot_calib) {
2743 ath11k_qmi_process_coldboot_calibration(ab);
2745 clear_bit(ATH11K_FLAG_CRASH_FLUSH,
2747 clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
2748 ath11k_core_qmi_firmware_ready(ab);
2749 set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
2753 case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
2756 ath11k_warn(ab, "invalid qmi event type: %d", event->type);
2760 spin_lock(&qmi->event_lock);
2762 spin_unlock(&qmi->event_lock);
2765 int ath11k_qmi_init_service(struct ath11k_base *ab)
2769 memset(&ab->qmi.target, 0, sizeof(struct target_info));
2770 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk));
2773 ab->qmi.target_mem_mode = ATH11K_QMI_TARGET_MEM_MODE_DEFAULT;
2774 ret = qmi_handle_init(&ab->qmi.handle, ATH11K_QMI_RESP_LEN_MAX,
2775 &ath11k_qmi_ops, ath11k_qmi_msg_handlers);
2777 ath11k_warn(ab, "failed to initialize qmi handle: %d\n", ret);
2781 ab->qmi.event_wq = alloc_workqueue("ath11k_qmi_driver_event",
2783 if (!ab->qmi.event_wq) {
2784 ath11k_err(ab, "failed to allocate workqueue\n");
2788 INIT_LIST_HEAD(&ab->qmi.event_list);
2789 spin_lock_init(&ab->qmi.event_lock);
2790 INIT_WORK(&ab->qmi.event_work, ath11k_qmi_driver_event_work);
2792 ret = qmi_add_lookup(&ab->qmi.handle, ATH11K_QMI_WLFW_SERVICE_ID_V01,
2793 ATH11K_QMI_WLFW_SERVICE_VERS_V01,
2794 ab->qmi.service_ins_id);
2796 ath11k_warn(ab, "failed to add qmi lookup: %d\n", ret);
2797 destroy_workqueue(ab->qmi.event_wq);
2804 void ath11k_qmi_deinit_service(struct ath11k_base *ab)
2806 qmi_handle_release(&ab->qmi.handle);
2807 cancel_work_sync(&ab->qmi.event_work);
2808 destroy_workqueue(ab->qmi.event_wq);
2809 ath11k_qmi_m3_free(ab);
2810 ath11k_qmi_free_target_mem_chunk(ab);
2812 EXPORT_SYMBOL(ath11k_qmi_deinit_service);