1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
4 * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
13 #include <linux/of_address.h>
14 #include <linux/ioport.h>
15 #include <linux/firmware.h>
16 #include <linux/of_device.h>
17 #include <linux/of_irq.h>
19 #define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02
20 #define HOST_CSTATE_BIT 0x04
21 #define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x08
23 #define FW_BUILD_ID_MASK "QC_IMAGE_VERSION_STRING="
25 bool ath11k_cold_boot_cal = 1;
26 EXPORT_SYMBOL(ath11k_cold_boot_cal);
27 module_param_named(cold_boot_cal, ath11k_cold_boot_cal, bool, 0644);
28 MODULE_PARM_DESC(cold_boot_cal,
29 "Decrease the channel switch time but increase the driver load time (Default: true)");
31 static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = {
33 .data_type = QMI_OPT_FLAG,
35 .elem_size = sizeof(u8),
36 .array_type = NO_ARRAY,
38 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
42 .data_type = QMI_UNSIGNED_4_BYTE,
44 .elem_size = sizeof(u32),
45 .array_type = NO_ARRAY,
47 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
51 .data_type = QMI_OPT_FLAG,
53 .elem_size = sizeof(u8),
54 .array_type = NO_ARRAY,
56 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
60 .data_type = QMI_UNSIGNED_4_BYTE,
62 .elem_size = sizeof(u32),
63 .array_type = NO_ARRAY,
65 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
69 .data_type = QMI_OPT_FLAG,
71 .elem_size = sizeof(u8),
72 .array_type = NO_ARRAY,
74 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
78 .data_type = QMI_DATA_LEN,
80 .elem_size = sizeof(u8),
81 .array_type = NO_ARRAY,
83 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
87 .data_type = QMI_UNSIGNED_4_BYTE,
88 .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01,
89 .elem_size = sizeof(u32),
90 .array_type = VAR_LEN_ARRAY,
92 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
96 .data_type = QMI_OPT_FLAG,
98 .elem_size = sizeof(u8),
99 .array_type = NO_ARRAY,
101 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
105 .data_type = QMI_UNSIGNED_1_BYTE,
107 .elem_size = sizeof(u8),
108 .array_type = NO_ARRAY,
110 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
114 .data_type = QMI_OPT_FLAG,
116 .elem_size = sizeof(u8),
117 .array_type = NO_ARRAY,
119 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
123 .data_type = QMI_UNSIGNED_1_BYTE,
125 .elem_size = sizeof(u8),
126 .array_type = NO_ARRAY,
128 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
132 .data_type = QMI_OPT_FLAG,
134 .elem_size = sizeof(u8),
135 .array_type = NO_ARRAY,
137 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
138 bdf_cache_support_valid),
141 .data_type = QMI_UNSIGNED_1_BYTE,
143 .elem_size = sizeof(u8),
144 .array_type = NO_ARRAY,
146 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
150 .data_type = QMI_OPT_FLAG,
152 .elem_size = sizeof(u8),
153 .array_type = NO_ARRAY,
155 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
159 .data_type = QMI_UNSIGNED_1_BYTE,
161 .elem_size = sizeof(u8),
162 .array_type = NO_ARRAY,
164 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
168 .data_type = QMI_OPT_FLAG,
170 .elem_size = sizeof(u8),
171 .array_type = NO_ARRAY,
173 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
174 m3_cache_support_valid),
177 .data_type = QMI_UNSIGNED_1_BYTE,
179 .elem_size = sizeof(u8),
180 .array_type = NO_ARRAY,
182 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
186 .data_type = QMI_OPT_FLAG,
188 .elem_size = sizeof(u8),
189 .array_type = NO_ARRAY,
191 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
192 cal_filesys_support_valid),
195 .data_type = QMI_UNSIGNED_1_BYTE,
197 .elem_size = sizeof(u8),
198 .array_type = NO_ARRAY,
200 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
201 cal_filesys_support),
204 .data_type = QMI_OPT_FLAG,
206 .elem_size = sizeof(u8),
207 .array_type = NO_ARRAY,
209 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
210 cal_cache_support_valid),
213 .data_type = QMI_UNSIGNED_1_BYTE,
215 .elem_size = sizeof(u8),
216 .array_type = NO_ARRAY,
218 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
222 .data_type = QMI_OPT_FLAG,
224 .elem_size = sizeof(u8),
225 .array_type = NO_ARRAY,
227 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
231 .data_type = QMI_UNSIGNED_1_BYTE,
233 .elem_size = sizeof(u8),
234 .array_type = NO_ARRAY,
236 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
240 .data_type = QMI_OPT_FLAG,
242 .elem_size = sizeof(u8),
243 .array_type = NO_ARRAY,
245 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
249 .data_type = QMI_UNSIGNED_4_BYTE,
251 .elem_size = sizeof(u32),
252 .array_type = NO_ARRAY,
254 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
258 .data_type = QMI_OPT_FLAG,
260 .elem_size = sizeof(u8),
261 .array_type = NO_ARRAY,
263 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
267 .data_type = QMI_UNSIGNED_1_BYTE,
269 .elem_size = sizeof(u8),
270 .array_type = NO_ARRAY,
272 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01,
276 .data_type = QMI_EOTI,
277 .array_type = NO_ARRAY,
278 .tlv_type = QMI_COMMON_TLV_TYPE,
282 static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = {
284 .data_type = QMI_STRUCT,
286 .elem_size = sizeof(struct qmi_response_type_v01),
287 .array_type = NO_ARRAY,
289 .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp),
290 .ei_array = qmi_response_type_v01_ei,
293 .data_type = QMI_EOTI,
294 .array_type = NO_ARRAY,
295 .tlv_type = QMI_COMMON_TLV_TYPE,
299 static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = {
301 .data_type = QMI_OPT_FLAG,
303 .elem_size = sizeof(u8),
304 .array_type = NO_ARRAY,
306 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
307 fw_ready_enable_valid),
310 .data_type = QMI_UNSIGNED_1_BYTE,
312 .elem_size = sizeof(u8),
313 .array_type = NO_ARRAY,
315 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
319 .data_type = QMI_OPT_FLAG,
321 .elem_size = sizeof(u8),
322 .array_type = NO_ARRAY,
324 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
325 initiate_cal_download_enable_valid),
328 .data_type = QMI_UNSIGNED_1_BYTE,
330 .elem_size = sizeof(u8),
331 .array_type = NO_ARRAY,
333 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
334 initiate_cal_download_enable),
337 .data_type = QMI_OPT_FLAG,
339 .elem_size = sizeof(u8),
340 .array_type = NO_ARRAY,
342 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
343 initiate_cal_update_enable_valid),
346 .data_type = QMI_UNSIGNED_1_BYTE,
348 .elem_size = sizeof(u8),
349 .array_type = NO_ARRAY,
351 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
352 initiate_cal_update_enable),
355 .data_type = QMI_OPT_FLAG,
357 .elem_size = sizeof(u8),
358 .array_type = NO_ARRAY,
360 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
361 msa_ready_enable_valid),
364 .data_type = QMI_UNSIGNED_1_BYTE,
366 .elem_size = sizeof(u8),
367 .array_type = NO_ARRAY,
369 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
373 .data_type = QMI_OPT_FLAG,
375 .elem_size = sizeof(u8),
376 .array_type = NO_ARRAY,
378 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
379 pin_connect_result_enable_valid),
382 .data_type = QMI_UNSIGNED_1_BYTE,
384 .elem_size = sizeof(u8),
385 .array_type = NO_ARRAY,
387 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
388 pin_connect_result_enable),
391 .data_type = QMI_OPT_FLAG,
393 .elem_size = sizeof(u8),
394 .array_type = NO_ARRAY,
396 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
400 .data_type = QMI_UNSIGNED_4_BYTE,
402 .elem_size = sizeof(u32),
403 .array_type = NO_ARRAY,
405 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
409 .data_type = QMI_OPT_FLAG,
411 .elem_size = sizeof(u8),
412 .array_type = NO_ARRAY,
414 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
415 request_mem_enable_valid),
418 .data_type = QMI_UNSIGNED_1_BYTE,
420 .elem_size = sizeof(u8),
421 .array_type = NO_ARRAY,
423 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
427 .data_type = QMI_OPT_FLAG,
429 .elem_size = sizeof(u8),
430 .array_type = NO_ARRAY,
432 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
433 fw_mem_ready_enable_valid),
436 .data_type = QMI_UNSIGNED_1_BYTE,
438 .elem_size = sizeof(u8),
439 .array_type = NO_ARRAY,
441 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
442 fw_mem_ready_enable),
445 .data_type = QMI_OPT_FLAG,
447 .elem_size = sizeof(u8),
448 .array_type = NO_ARRAY,
450 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
451 fw_init_done_enable_valid),
454 .data_type = QMI_UNSIGNED_1_BYTE,
456 .elem_size = sizeof(u8),
457 .array_type = NO_ARRAY,
459 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
460 fw_init_done_enable),
464 .data_type = QMI_OPT_FLAG,
466 .elem_size = sizeof(u8),
467 .array_type = NO_ARRAY,
469 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
470 rejuvenate_enable_valid),
473 .data_type = QMI_UNSIGNED_1_BYTE,
475 .elem_size = sizeof(u8),
476 .array_type = NO_ARRAY,
478 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
482 .data_type = QMI_OPT_FLAG,
484 .elem_size = sizeof(u8),
485 .array_type = NO_ARRAY,
487 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
488 xo_cal_enable_valid),
491 .data_type = QMI_UNSIGNED_1_BYTE,
493 .elem_size = sizeof(u8),
494 .array_type = NO_ARRAY,
496 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
500 .data_type = QMI_OPT_FLAG,
502 .elem_size = sizeof(u8),
503 .array_type = NO_ARRAY,
505 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
506 cal_done_enable_valid),
509 .data_type = QMI_UNSIGNED_1_BYTE,
511 .elem_size = sizeof(u8),
512 .array_type = NO_ARRAY,
514 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01,
518 .data_type = QMI_EOTI,
519 .array_type = NO_ARRAY,
520 .tlv_type = QMI_COMMON_TLV_TYPE,
524 static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = {
526 .data_type = QMI_STRUCT,
528 .elem_size = sizeof(struct qmi_response_type_v01),
529 .array_type = NO_ARRAY,
531 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
533 .ei_array = qmi_response_type_v01_ei,
536 .data_type = QMI_OPT_FLAG,
538 .elem_size = sizeof(u8),
539 .array_type = NO_ARRAY,
541 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
545 .data_type = QMI_UNSIGNED_8_BYTE,
547 .elem_size = sizeof(u64),
548 .array_type = NO_ARRAY,
550 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01,
554 .data_type = QMI_EOTI,
555 .array_type = NO_ARRAY,
556 .tlv_type = QMI_COMMON_TLV_TYPE,
560 static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = {
562 .data_type = QMI_UNSIGNED_8_BYTE,
564 .elem_size = sizeof(u64),
565 .array_type = NO_ARRAY,
567 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset),
570 .data_type = QMI_UNSIGNED_4_BYTE,
572 .elem_size = sizeof(u32),
573 .array_type = NO_ARRAY,
575 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size),
578 .data_type = QMI_UNSIGNED_1_BYTE,
580 .elem_size = sizeof(u8),
581 .array_type = NO_ARRAY,
583 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag),
586 .data_type = QMI_EOTI,
587 .array_type = NO_ARRAY,
588 .tlv_type = QMI_COMMON_TLV_TYPE,
592 static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = {
594 .data_type = QMI_UNSIGNED_4_BYTE,
596 .elem_size = sizeof(u32),
597 .array_type = NO_ARRAY,
599 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01,
603 .data_type = QMI_SIGNED_4_BYTE_ENUM,
605 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
606 .array_type = NO_ARRAY,
608 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type),
611 .data_type = QMI_DATA_LEN,
613 .elem_size = sizeof(u8),
614 .array_type = NO_ARRAY,
616 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len),
619 .data_type = QMI_STRUCT,
620 .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01,
621 .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01),
622 .array_type = VAR_LEN_ARRAY,
624 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg),
625 .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei,
628 .data_type = QMI_EOTI,
629 .array_type = NO_ARRAY,
630 .tlv_type = QMI_COMMON_TLV_TYPE,
634 static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = {
636 .data_type = QMI_DATA_LEN,
638 .elem_size = sizeof(u8),
639 .array_type = NO_ARRAY,
641 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
645 .data_type = QMI_STRUCT,
646 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
647 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01),
648 .array_type = VAR_LEN_ARRAY,
650 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01,
652 .ei_array = qmi_wlanfw_mem_seg_s_v01_ei,
655 .data_type = QMI_EOTI,
656 .array_type = NO_ARRAY,
657 .tlv_type = QMI_COMMON_TLV_TYPE,
661 static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = {
663 .data_type = QMI_UNSIGNED_8_BYTE,
665 .elem_size = sizeof(u64),
666 .array_type = NO_ARRAY,
668 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr),
671 .data_type = QMI_UNSIGNED_4_BYTE,
673 .elem_size = sizeof(u32),
674 .array_type = NO_ARRAY,
676 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size),
679 .data_type = QMI_SIGNED_4_BYTE_ENUM,
681 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01),
682 .array_type = NO_ARRAY,
684 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type),
687 .data_type = QMI_UNSIGNED_1_BYTE,
689 .elem_size = sizeof(u8),
690 .array_type = NO_ARRAY,
692 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore),
695 .data_type = QMI_EOTI,
696 .array_type = NO_ARRAY,
697 .tlv_type = QMI_COMMON_TLV_TYPE,
701 static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = {
703 .data_type = QMI_DATA_LEN,
705 .elem_size = sizeof(u8),
706 .array_type = NO_ARRAY,
708 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
712 .data_type = QMI_STRUCT,
713 .elem_len = ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01,
714 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01),
715 .array_type = VAR_LEN_ARRAY,
717 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01,
719 .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei,
722 .data_type = QMI_EOTI,
723 .array_type = NO_ARRAY,
724 .tlv_type = QMI_COMMON_TLV_TYPE,
728 static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = {
730 .data_type = QMI_STRUCT,
732 .elem_size = sizeof(struct qmi_response_type_v01),
733 .array_type = NO_ARRAY,
735 .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01,
737 .ei_array = qmi_response_type_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_cap_req_msg_v01_ei[] = {
748 .data_type = QMI_EOTI,
749 .array_type = NO_ARRAY,
750 .tlv_type = QMI_COMMON_TLV_TYPE,
754 static struct qmi_elem_info qmi_wlanfw_device_info_req_msg_v01_ei[] = {
756 .data_type = QMI_EOTI,
757 .array_type = NO_ARRAY,
758 .tlv_type = QMI_COMMON_TLV_TYPE,
762 static struct qmi_elem_info qmi_wlfw_device_info_resp_msg_v01_ei[] = {
764 .data_type = QMI_STRUCT,
766 .elem_size = sizeof(struct qmi_response_type_v01),
767 .array_type = NO_ARRAY,
769 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
771 .ei_array = qmi_response_type_v01_ei,
774 .data_type = QMI_OPT_FLAG,
776 .elem_size = sizeof(u8),
777 .array_type = NO_ARRAY,
779 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
783 .data_type = QMI_UNSIGNED_8_BYTE,
785 .elem_size = sizeof(u64),
786 .array_type = NO_ARRAY,
788 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
792 .data_type = QMI_OPT_FLAG,
794 .elem_size = sizeof(u8),
795 .array_type = NO_ARRAY,
797 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
801 .data_type = QMI_UNSIGNED_4_BYTE,
803 .elem_size = sizeof(u32),
804 .array_type = NO_ARRAY,
806 .offset = offsetof(struct qmi_wlanfw_device_info_resp_msg_v01,
810 .data_type = QMI_EOTI,
811 .array_type = NO_ARRAY,
812 .tlv_type = QMI_COMMON_TLV_TYPE,
816 static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = {
818 .data_type = QMI_UNSIGNED_4_BYTE,
820 .elem_size = sizeof(u32),
821 .array_type = NO_ARRAY,
823 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
827 .data_type = QMI_UNSIGNED_4_BYTE,
829 .elem_size = sizeof(u32),
830 .array_type = NO_ARRAY,
832 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01,
836 .data_type = QMI_EOTI,
837 .array_type = NO_ARRAY,
838 .tlv_type = QMI_COMMON_TLV_TYPE,
842 static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = {
844 .data_type = QMI_UNSIGNED_4_BYTE,
846 .elem_size = sizeof(u32),
847 .array_type = NO_ARRAY,
849 .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01,
853 .data_type = QMI_EOTI,
854 .array_type = NO_ARRAY,
855 .tlv_type = QMI_COMMON_TLV_TYPE,
859 static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = {
861 .data_type = QMI_UNSIGNED_4_BYTE,
863 .elem_size = sizeof(u32),
864 .array_type = NO_ARRAY,
866 .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id),
869 .data_type = QMI_EOTI,
870 .array_type = NO_ARRAY,
871 .tlv_type = QMI_COMMON_TLV_TYPE,
875 static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = {
877 .data_type = QMI_UNSIGNED_4_BYTE,
879 .elem_size = sizeof(u32),
880 .array_type = NO_ARRAY,
882 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
886 .data_type = QMI_STRING,
887 .elem_len = ATH11K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1,
888 .elem_size = sizeof(char),
889 .array_type = NO_ARRAY,
891 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01,
895 .data_type = QMI_EOTI,
896 .array_type = NO_ARRAY,
897 .tlv_type = QMI_COMMON_TLV_TYPE,
901 static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = {
903 .data_type = QMI_STRUCT,
905 .elem_size = sizeof(struct qmi_response_type_v01),
906 .array_type = NO_ARRAY,
908 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp),
909 .ei_array = qmi_response_type_v01_ei,
912 .data_type = QMI_OPT_FLAG,
914 .elem_size = sizeof(u8),
915 .array_type = NO_ARRAY,
917 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
921 .data_type = QMI_STRUCT,
923 .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01),
924 .array_type = NO_ARRAY,
926 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
928 .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei,
931 .data_type = QMI_OPT_FLAG,
933 .elem_size = sizeof(u8),
934 .array_type = NO_ARRAY,
936 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
940 .data_type = QMI_STRUCT,
942 .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01),
943 .array_type = NO_ARRAY,
945 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
947 .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei,
950 .data_type = QMI_OPT_FLAG,
952 .elem_size = sizeof(u8),
953 .array_type = NO_ARRAY,
955 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
959 .data_type = QMI_STRUCT,
961 .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01),
962 .array_type = NO_ARRAY,
964 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
966 .ei_array = qmi_wlanfw_soc_info_s_v01_ei,
969 .data_type = QMI_OPT_FLAG,
971 .elem_size = sizeof(u8),
972 .array_type = NO_ARRAY,
974 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
975 fw_version_info_valid),
978 .data_type = QMI_STRUCT,
980 .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01),
981 .array_type = NO_ARRAY,
983 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
985 .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei,
988 .data_type = QMI_OPT_FLAG,
990 .elem_size = sizeof(u8),
991 .array_type = NO_ARRAY,
993 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
997 .data_type = QMI_STRING,
998 .elem_len = ATH11K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1,
999 .elem_size = sizeof(char),
1000 .array_type = NO_ARRAY,
1002 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1006 .data_type = QMI_OPT_FLAG,
1008 .elem_size = sizeof(u8),
1009 .array_type = NO_ARRAY,
1011 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1015 .data_type = QMI_UNSIGNED_1_BYTE,
1017 .elem_size = sizeof(u8),
1018 .array_type = NO_ARRAY,
1020 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1024 .data_type = QMI_OPT_FLAG,
1026 .elem_size = sizeof(u8),
1027 .array_type = NO_ARRAY,
1029 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1033 .data_type = QMI_UNSIGNED_4_BYTE,
1035 .elem_size = sizeof(u32),
1036 .array_type = NO_ARRAY,
1038 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1042 .data_type = QMI_OPT_FLAG,
1044 .elem_size = sizeof(u8),
1045 .array_type = NO_ARRAY,
1047 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1048 time_freq_hz_valid),
1051 .data_type = QMI_UNSIGNED_4_BYTE,
1053 .elem_size = sizeof(u32),
1054 .array_type = NO_ARRAY,
1056 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1060 .data_type = QMI_OPT_FLAG,
1062 .elem_size = sizeof(u8),
1063 .array_type = NO_ARRAY,
1065 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1069 .data_type = QMI_UNSIGNED_4_BYTE,
1071 .elem_size = sizeof(u32),
1072 .array_type = NO_ARRAY,
1074 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1078 .data_type = QMI_OPT_FLAG,
1080 .elem_size = sizeof(u8),
1081 .array_type = NO_ARRAY,
1083 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1084 eeprom_read_timeout_valid),
1087 .data_type = QMI_UNSIGNED_4_BYTE,
1089 .elem_size = sizeof(u32),
1090 .array_type = NO_ARRAY,
1092 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01,
1093 eeprom_read_timeout),
1096 .data_type = QMI_EOTI,
1097 .array_type = NO_ARRAY,
1098 .tlv_type = QMI_COMMON_TLV_TYPE,
1102 static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = {
1104 .data_type = QMI_UNSIGNED_1_BYTE,
1106 .elem_size = sizeof(u8),
1107 .array_type = NO_ARRAY,
1109 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1113 .data_type = QMI_OPT_FLAG,
1115 .elem_size = sizeof(u8),
1116 .array_type = NO_ARRAY,
1118 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1122 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1124 .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01),
1125 .array_type = NO_ARRAY,
1127 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1131 .data_type = QMI_OPT_FLAG,
1133 .elem_size = sizeof(u8),
1134 .array_type = NO_ARRAY,
1136 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1140 .data_type = QMI_UNSIGNED_4_BYTE,
1142 .elem_size = sizeof(u32),
1143 .array_type = NO_ARRAY,
1145 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1149 .data_type = QMI_OPT_FLAG,
1151 .elem_size = sizeof(u8),
1152 .array_type = NO_ARRAY,
1154 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1158 .data_type = QMI_UNSIGNED_4_BYTE,
1160 .elem_size = sizeof(u32),
1161 .array_type = NO_ARRAY,
1163 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1167 .data_type = QMI_OPT_FLAG,
1169 .elem_size = sizeof(u8),
1170 .array_type = NO_ARRAY,
1172 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1176 .data_type = QMI_DATA_LEN,
1178 .elem_size = sizeof(u16),
1179 .array_type = NO_ARRAY,
1181 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1185 .data_type = QMI_UNSIGNED_1_BYTE,
1186 .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01,
1187 .elem_size = sizeof(u8),
1188 .array_type = VAR_LEN_ARRAY,
1190 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1194 .data_type = QMI_OPT_FLAG,
1196 .elem_size = sizeof(u8),
1197 .array_type = NO_ARRAY,
1199 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1203 .data_type = QMI_UNSIGNED_1_BYTE,
1205 .elem_size = sizeof(u8),
1206 .array_type = NO_ARRAY,
1208 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1212 .data_type = QMI_OPT_FLAG,
1214 .elem_size = sizeof(u8),
1215 .array_type = NO_ARRAY,
1217 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1221 .data_type = QMI_UNSIGNED_1_BYTE,
1223 .elem_size = sizeof(u8),
1224 .array_type = NO_ARRAY,
1226 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01,
1231 .data_type = QMI_EOTI,
1232 .array_type = NO_ARRAY,
1233 .tlv_type = QMI_COMMON_TLV_TYPE,
1237 static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = {
1239 .data_type = QMI_STRUCT,
1241 .elem_size = sizeof(struct qmi_response_type_v01),
1242 .array_type = NO_ARRAY,
1244 .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01,
1246 .ei_array = qmi_response_type_v01_ei,
1249 .data_type = QMI_EOTI,
1250 .array_type = NO_ARRAY,
1251 .tlv_type = QMI_COMMON_TLV_TYPE,
1255 static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = {
1257 .data_type = QMI_UNSIGNED_8_BYTE,
1259 .elem_size = sizeof(u64),
1260 .array_type = NO_ARRAY,
1262 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr),
1265 .data_type = QMI_UNSIGNED_4_BYTE,
1267 .elem_size = sizeof(u32),
1268 .array_type = NO_ARRAY,
1270 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size),
1273 .data_type = QMI_EOTI,
1274 .array_type = NO_ARRAY,
1275 .tlv_type = QMI_COMMON_TLV_TYPE,
1279 static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = {
1281 .data_type = QMI_STRUCT,
1283 .elem_size = sizeof(struct qmi_response_type_v01),
1284 .array_type = NO_ARRAY,
1286 .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp),
1287 .ei_array = qmi_response_type_v01_ei,
1290 .data_type = QMI_EOTI,
1291 .array_type = NO_ARRAY,
1292 .tlv_type = QMI_COMMON_TLV_TYPE,
1296 static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = {
1298 .data_type = QMI_UNSIGNED_4_BYTE,
1300 .elem_size = sizeof(u32),
1301 .array_type = NO_ARRAY,
1303 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1307 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1309 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1310 .array_type = NO_ARRAY,
1312 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1316 .data_type = QMI_UNSIGNED_4_BYTE,
1318 .elem_size = sizeof(u32),
1319 .array_type = NO_ARRAY,
1321 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1325 .data_type = QMI_UNSIGNED_4_BYTE,
1327 .elem_size = sizeof(u32),
1328 .array_type = NO_ARRAY,
1330 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1334 .data_type = QMI_UNSIGNED_4_BYTE,
1336 .elem_size = sizeof(u32),
1337 .array_type = NO_ARRAY,
1339 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01,
1343 .data_type = QMI_EOTI,
1344 .array_type = NO_ARRAY,
1345 .tlv_type = QMI_COMMON_TLV_TYPE,
1349 static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = {
1351 .data_type = QMI_UNSIGNED_4_BYTE,
1353 .elem_size = sizeof(u32),
1354 .array_type = NO_ARRAY,
1356 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1360 .data_type = QMI_SIGNED_4_BYTE_ENUM,
1362 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01),
1363 .array_type = NO_ARRAY,
1365 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1369 .data_type = QMI_UNSIGNED_4_BYTE,
1371 .elem_size = sizeof(u32),
1372 .array_type = NO_ARRAY,
1374 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01,
1378 .data_type = QMI_EOTI,
1379 .array_type = NO_ARRAY,
1380 .tlv_type = QMI_COMMON_TLV_TYPE,
1384 static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = {
1386 .data_type = QMI_UNSIGNED_2_BYTE,
1388 .elem_size = sizeof(u16),
1389 .array_type = NO_ARRAY,
1391 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id),
1394 .data_type = QMI_UNSIGNED_2_BYTE,
1396 .elem_size = sizeof(u16),
1397 .array_type = NO_ARRAY,
1399 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01,
1403 .data_type = QMI_EOTI,
1404 .array_type = QMI_COMMON_TLV_TYPE,
1408 static struct qmi_elem_info qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei[] = {
1410 .data_type = QMI_UNSIGNED_4_BYTE,
1412 .elem_size = sizeof(u32),
1413 .array_type = NO_ARRAY,
1415 .offset = offsetof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01,
1419 .data_type = QMI_EOTI,
1420 .array_type = NO_ARRAY,
1421 .tlv_type = QMI_COMMON_TLV_TYPE,
1425 static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = {
1427 .data_type = QMI_UNSIGNED_4_BYTE,
1429 .elem_size = sizeof(u32),
1430 .array_type = NO_ARRAY,
1432 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1436 .data_type = QMI_OPT_FLAG,
1438 .elem_size = sizeof(u8),
1439 .array_type = NO_ARRAY,
1441 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1445 .data_type = QMI_UNSIGNED_1_BYTE,
1447 .elem_size = sizeof(u8),
1448 .array_type = NO_ARRAY,
1450 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01,
1454 .data_type = QMI_EOTI,
1455 .array_type = NO_ARRAY,
1456 .tlv_type = QMI_COMMON_TLV_TYPE,
1460 static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = {
1462 .data_type = QMI_STRUCT,
1464 .elem_size = sizeof(struct qmi_response_type_v01),
1465 .array_type = NO_ARRAY,
1467 .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01,
1469 .ei_array = qmi_response_type_v01_ei,
1472 .data_type = QMI_EOTI,
1473 .array_type = NO_ARRAY,
1474 .tlv_type = QMI_COMMON_TLV_TYPE,
1478 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = {
1480 .data_type = QMI_OPT_FLAG,
1482 .elem_size = sizeof(u8),
1483 .array_type = NO_ARRAY,
1485 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1486 host_version_valid),
1489 .data_type = QMI_STRING,
1490 .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1,
1491 .elem_size = sizeof(char),
1492 .array_type = NO_ARRAY,
1494 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1498 .data_type = QMI_OPT_FLAG,
1500 .elem_size = sizeof(u8),
1501 .array_type = NO_ARRAY,
1503 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1507 .data_type = QMI_DATA_LEN,
1509 .elem_size = sizeof(u8),
1510 .array_type = NO_ARRAY,
1512 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1516 .data_type = QMI_STRUCT,
1517 .elem_len = QMI_WLANFW_MAX_NUM_CE_V01,
1518 .elem_size = sizeof(
1519 struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01),
1520 .array_type = VAR_LEN_ARRAY,
1522 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1524 .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei,
1527 .data_type = QMI_OPT_FLAG,
1529 .elem_size = sizeof(u8),
1530 .array_type = NO_ARRAY,
1532 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1536 .data_type = QMI_DATA_LEN,
1538 .elem_size = sizeof(u8),
1539 .array_type = NO_ARRAY,
1541 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1545 .data_type = QMI_STRUCT,
1546 .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01,
1547 .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01),
1548 .array_type = VAR_LEN_ARRAY,
1550 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1552 .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei,
1555 .data_type = QMI_OPT_FLAG,
1557 .elem_size = sizeof(u8),
1558 .array_type = NO_ARRAY,
1560 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1564 .data_type = QMI_DATA_LEN,
1566 .elem_size = sizeof(u8),
1567 .array_type = NO_ARRAY,
1569 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1573 .data_type = QMI_STRUCT,
1574 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01,
1575 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01),
1576 .array_type = VAR_LEN_ARRAY,
1578 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1580 .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei,
1583 .data_type = QMI_OPT_FLAG,
1585 .elem_size = sizeof(u8),
1586 .array_type = NO_ARRAY,
1588 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1589 shadow_reg_v2_valid),
1592 .data_type = QMI_DATA_LEN,
1594 .elem_size = sizeof(u8),
1595 .array_type = NO_ARRAY,
1597 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1601 .data_type = QMI_STRUCT,
1602 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01,
1603 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v2_cfg_s_v01),
1604 .array_type = VAR_LEN_ARRAY,
1606 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01,
1608 .ei_array = qmi_wlanfw_shadow_reg_v2_cfg_s_v01_ei,
1611 .data_type = QMI_EOTI,
1612 .array_type = NO_ARRAY,
1613 .tlv_type = QMI_COMMON_TLV_TYPE,
1617 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = {
1619 .data_type = QMI_STRUCT,
1621 .elem_size = sizeof(struct qmi_response_type_v01),
1622 .array_type = NO_ARRAY,
1624 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp),
1625 .ei_array = qmi_response_type_v01_ei,
1628 .data_type = QMI_EOTI,
1629 .array_type = NO_ARRAY,
1630 .tlv_type = QMI_COMMON_TLV_TYPE,
1634 static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = {
1636 .data_type = QMI_EOTI,
1637 .array_type = NO_ARRAY,
1641 static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = {
1643 .data_type = QMI_EOTI,
1644 .array_type = NO_ARRAY,
1648 static struct qmi_elem_info qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei[] = {
1650 .data_type = QMI_EOTI,
1651 .array_type = NO_ARRAY,
1655 static struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = {
1657 .data_type = QMI_OPT_FLAG,
1659 .elem_size = sizeof(u8),
1660 .array_type = NO_ARRAY,
1662 .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01,
1666 .data_type = QMI_UNSIGNED_1_BYTE,
1668 .elem_size = sizeof(u8),
1669 .array_type = NO_ARRAY,
1671 .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01,
1675 .data_type = QMI_EOTI,
1676 .array_type = NO_ARRAY,
1677 .tlv_type = QMI_COMMON_TLV_TYPE,
1681 static struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = {
1683 .data_type = QMI_STRUCT,
1685 .elem_size = sizeof(struct qmi_response_type_v01),
1686 .array_type = NO_ARRAY,
1688 .offset = offsetof(struct qmi_wlanfw_wlan_ini_resp_msg_v01,
1690 .ei_array = qmi_response_type_v01_ei,
1693 .data_type = QMI_EOTI,
1694 .array_type = NO_ARRAY,
1695 .tlv_type = QMI_COMMON_TLV_TYPE,
1699 static int ath11k_qmi_host_cap_send(struct ath11k_base *ab)
1701 struct qmi_wlanfw_host_cap_req_msg_v01 req;
1702 struct qmi_wlanfw_host_cap_resp_msg_v01 resp;
1706 memset(&req, 0, sizeof(req));
1707 memset(&resp, 0, sizeof(resp));
1709 req.num_clients_valid = 1;
1710 req.num_clients = 1;
1711 req.mem_cfg_mode = ab->qmi.target_mem_mode;
1712 req.mem_cfg_mode_valid = 1;
1713 req.bdf_support_valid = 1;
1714 req.bdf_support = 1;
1716 if (ab->hw_params.m3_fw_support) {
1717 req.m3_support_valid = 1;
1719 req.m3_cache_support_valid = 1;
1720 req.m3_cache_support = 1;
1722 req.m3_support_valid = 0;
1724 req.m3_cache_support_valid = 0;
1725 req.m3_cache_support = 0;
1728 req.cal_done_valid = 1;
1729 req.cal_done = ab->qmi.cal_done;
1731 if (ab->hw_params.internal_sleep_clock) {
1732 req.nm_modem_valid = 1;
1734 /* Notify firmware that this is non-qualcomm platform. */
1735 req.nm_modem |= HOST_CSTATE_BIT;
1737 /* Notify firmware about the sleep clock selection,
1738 * nm_modem_bit[1] is used for this purpose. Host driver on
1739 * non-qualcomm platforms should select internal sleep
1742 req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT;
1745 if (ab->hw_params.global_reset)
1746 req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET;
1748 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi host cap request\n");
1750 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1751 qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp);
1755 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1756 QMI_WLANFW_HOST_CAP_REQ_V01,
1757 QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN,
1758 qmi_wlanfw_host_cap_req_msg_v01_ei, &req);
1760 qmi_txn_cancel(&txn);
1761 ath11k_warn(ab, "failed to send host capability request: %d\n", ret);
1765 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1769 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1770 ath11k_warn(ab, "host capability request failed: %d %d\n",
1771 resp.resp.result, resp.resp.error);
1780 static int ath11k_qmi_fw_ind_register_send(struct ath11k_base *ab)
1782 struct qmi_wlanfw_ind_register_req_msg_v01 *req;
1783 struct qmi_wlanfw_ind_register_resp_msg_v01 *resp;
1784 struct qmi_handle *handle = &ab->qmi.handle;
1788 req = kzalloc(sizeof(*req), GFP_KERNEL);
1792 resp = kzalloc(sizeof(*resp), GFP_KERNEL);
1798 req->client_id_valid = 1;
1799 req->client_id = QMI_WLANFW_CLIENT_ID;
1800 req->fw_ready_enable_valid = 1;
1801 req->fw_ready_enable = 1;
1802 req->cal_done_enable_valid = 1;
1803 req->cal_done_enable = 1;
1804 req->fw_init_done_enable_valid = 1;
1805 req->fw_init_done_enable = 1;
1807 req->pin_connect_result_enable_valid = 0;
1808 req->pin_connect_result_enable = 0;
1810 /* WCN6750 doesn't request for DDR memory via QMI,
1811 * instead it uses a fixed 12MB reserved memory
1814 if (!ab->hw_params.fixed_fw_mem) {
1815 req->request_mem_enable_valid = 1;
1816 req->request_mem_enable = 1;
1817 req->fw_mem_ready_enable_valid = 1;
1818 req->fw_mem_ready_enable = 1;
1821 ret = qmi_txn_init(handle, &txn,
1822 qmi_wlanfw_ind_register_resp_msg_v01_ei, resp);
1826 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi indication register request\n");
1828 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1829 QMI_WLANFW_IND_REGISTER_REQ_V01,
1830 QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN,
1831 qmi_wlanfw_ind_register_req_msg_v01_ei, req);
1833 qmi_txn_cancel(&txn);
1834 ath11k_warn(ab, "failed to send indication register request: %d\n",
1839 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1841 ath11k_warn(ab, "failed to register fw indication: %d\n", ret);
1845 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) {
1846 ath11k_warn(ab, "firmware indication register request failed: %d %d\n",
1847 resp->resp.result, resp->resp.error);
1859 static int ath11k_qmi_respond_fw_mem_request(struct ath11k_base *ab)
1861 struct qmi_wlanfw_respond_mem_req_msg_v01 *req;
1862 struct qmi_wlanfw_respond_mem_resp_msg_v01 resp;
1867 req = kzalloc(sizeof(*req), GFP_KERNEL);
1871 memset(&resp, 0, sizeof(resp));
1873 /* For QCA6390 by default FW requests a block of ~4M contiguous
1874 * DMA memory, it's hard to allocate from OS. So host returns
1875 * failure to FW and FW will then request mulitple blocks of small
1876 * chunk size memory.
1878 if (!(ab->hw_params.fixed_mem_region ||
1879 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
1880 ab->qmi.target_mem_delayed) {
1882 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi delays mem_request %d\n",
1883 ab->qmi.mem_seg_count);
1884 memset(req, 0, sizeof(*req));
1887 req->mem_seg_len = ab->qmi.mem_seg_count;
1889 for (i = 0; i < req->mem_seg_len ; i++) {
1890 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr;
1891 req->mem_seg[i].size = ab->qmi.target_mem[i].size;
1892 req->mem_seg[i].type = ab->qmi.target_mem[i].type;
1893 ath11k_dbg(ab, ATH11K_DBG_QMI,
1894 "qmi req mem_seg[%d] %pad %u %u\n", i,
1895 &ab->qmi.target_mem[i].paddr,
1896 ab->qmi.target_mem[i].size,
1897 ab->qmi.target_mem[i].type);
1901 ret = qmi_txn_init(&ab->qmi.handle, &txn,
1902 qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp);
1906 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi respond memory request delayed %i\n",
1909 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
1910 QMI_WLANFW_RESPOND_MEM_REQ_V01,
1911 QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN,
1912 qmi_wlanfw_respond_mem_req_msg_v01_ei, req);
1914 qmi_txn_cancel(&txn);
1915 ath11k_warn(ab, "failed to respond qmi memory request: %d\n",
1920 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
1922 ath11k_warn(ab, "failed to wait qmi memory request: %d\n", ret);
1926 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
1927 /* the error response is expected when
1928 * target_mem_delayed is true.
1930 if (delayed && resp.resp.error == 0)
1933 ath11k_warn(ab, "qmi respond memory request failed: %d %d\n",
1934 resp.resp.result, resp.resp.error);
1943 static void ath11k_qmi_free_target_mem_chunk(struct ath11k_base *ab)
1947 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
1948 if ((ab->hw_params.fixed_mem_region ||
1949 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) &&
1950 ab->qmi.target_mem[i].iaddr)
1951 iounmap(ab->qmi.target_mem[i].iaddr);
1953 if (!ab->qmi.target_mem[i].vaddr)
1956 dma_free_coherent(ab->dev,
1957 ab->qmi.target_mem[i].size,
1958 ab->qmi.target_mem[i].vaddr,
1959 ab->qmi.target_mem[i].paddr);
1960 ab->qmi.target_mem[i].vaddr = NULL;
1964 static int ath11k_qmi_alloc_target_mem_chunk(struct ath11k_base *ab)
1967 struct target_mem_chunk *chunk;
1969 ab->qmi.target_mem_delayed = false;
1971 for (i = 0; i < ab->qmi.mem_seg_count; i++) {
1972 chunk = &ab->qmi.target_mem[i];
1974 /* Firmware reloads in coldboot/firmware recovery.
1975 * in such case, no need to allocate memory for FW again.
1978 if (chunk->prev_type == chunk->type ||
1979 chunk->prev_size == chunk->size)
1982 /* cannot reuse the existing chunk */
1983 dma_free_coherent(ab->dev, chunk->size,
1984 chunk->vaddr, chunk->paddr);
1985 chunk->vaddr = NULL;
1988 chunk->vaddr = dma_alloc_coherent(ab->dev,
1991 GFP_KERNEL | __GFP_NOWARN);
1992 if (!chunk->vaddr) {
1993 if (ab->qmi.mem_seg_count <= ATH11K_QMI_FW_MEM_REQ_SEGMENT_CNT) {
1994 ath11k_dbg(ab, ATH11K_DBG_QMI,
1995 "qmi dma allocation failed (%d B type %u), will try later with small size\n",
1998 ath11k_qmi_free_target_mem_chunk(ab);
1999 ab->qmi.target_mem_delayed = true;
2003 ath11k_err(ab, "failed to allocate dma memory for qmi (%d B type %u)\n",
2008 chunk->prev_type = chunk->type;
2009 chunk->prev_size = chunk->size;
2015 static int ath11k_qmi_assign_target_mem_chunk(struct ath11k_base *ab)
2017 struct device *dev = ab->dev;
2018 struct device_node *hremote_node = NULL;
2019 struct resource res;
2023 for (i = 0, idx = 0; i < ab->qmi.mem_seg_count; i++) {
2024 switch (ab->qmi.target_mem[i].type) {
2025 case HOST_DDR_REGION_TYPE:
2026 hremote_node = of_parse_phandle(dev->of_node, "memory-region", 0);
2027 if (!hremote_node) {
2028 ath11k_dbg(ab, ATH11K_DBG_QMI,
2029 "qmi fail to get hremote_node\n");
2033 ret = of_address_to_resource(hremote_node, 0, &res);
2034 of_node_put(hremote_node);
2036 ath11k_dbg(ab, ATH11K_DBG_QMI,
2037 "qmi fail to get reg from hremote\n");
2041 if (res.end - res.start + 1 < ab->qmi.target_mem[i].size) {
2042 ath11k_dbg(ab, ATH11K_DBG_QMI,
2043 "qmi fail to assign memory of sz\n");
2047 ab->qmi.target_mem[idx].paddr = res.start;
2048 ab->qmi.target_mem[idx].iaddr =
2049 ioremap(ab->qmi.target_mem[idx].paddr,
2050 ab->qmi.target_mem[i].size);
2051 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
2052 host_ddr_sz = ab->qmi.target_mem[i].size;
2053 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
2056 case BDF_MEM_REGION_TYPE:
2057 ab->qmi.target_mem[idx].paddr = ab->hw_params.bdf_addr;
2058 ab->qmi.target_mem[idx].vaddr = NULL;
2059 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
2060 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
2063 case CALDB_MEM_REGION_TYPE:
2064 if (ab->qmi.target_mem[i].size > ATH11K_QMI_CALDB_SIZE) {
2065 ath11k_warn(ab, "qmi mem size is low to load caldata\n");
2069 if (ath11k_cold_boot_cal && ab->hw_params.cold_boot_calib) {
2071 ab->qmi.target_mem[idx].paddr =
2072 res.start + host_ddr_sz;
2073 ab->qmi.target_mem[idx].iaddr =
2074 ioremap(ab->qmi.target_mem[idx].paddr,
2075 ab->qmi.target_mem[i].size);
2077 ab->qmi.target_mem[idx].paddr =
2078 ATH11K_QMI_CALDB_ADDRESS;
2081 ab->qmi.target_mem[idx].paddr = 0;
2082 ab->qmi.target_mem[idx].vaddr = NULL;
2084 ab->qmi.target_mem[idx].size = ab->qmi.target_mem[i].size;
2085 ab->qmi.target_mem[idx].type = ab->qmi.target_mem[i].type;
2089 ath11k_warn(ab, "qmi ignore invalid mem req type %d\n",
2090 ab->qmi.target_mem[i].type);
2094 ab->qmi.mem_seg_count = idx;
2099 static int ath11k_qmi_request_device_info(struct ath11k_base *ab)
2101 struct qmi_wlanfw_device_info_req_msg_v01 req = {};
2102 struct qmi_wlanfw_device_info_resp_msg_v01 resp = {};
2104 void __iomem *bar_addr_va;
2107 /* device info message req is only sent for hybrid bus devices */
2108 if (!ab->hw_params.hybrid_bus_type)
2111 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2112 qmi_wlfw_device_info_resp_msg_v01_ei, &resp);
2116 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2117 QMI_WLANFW_DEVICE_INFO_REQ_V01,
2118 QMI_WLANFW_DEVICE_INFO_REQ_MSG_V01_MAX_LEN,
2119 qmi_wlanfw_device_info_req_msg_v01_ei, &req);
2121 qmi_txn_cancel(&txn);
2122 ath11k_warn(ab, "failed to send qmi target device info request: %d\n",
2127 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2129 ath11k_warn(ab, "failed to wait qmi target device info request: %d\n",
2134 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2135 ath11k_warn(ab, "qmi device info request failed: %d %d\n",
2136 resp.resp.result, resp.resp.error);
2141 if (!resp.bar_addr_valid || !resp.bar_size_valid) {
2142 ath11k_warn(ab, "qmi device info response invalid: %d %d\n",
2143 resp.resp.result, resp.resp.error);
2148 if (!resp.bar_addr ||
2149 resp.bar_size != ATH11K_QMI_DEVICE_BAR_SIZE) {
2150 ath11k_warn(ab, "qmi device info invalid address and size: %llu %u\n",
2151 resp.bar_addr, resp.bar_size);
2156 bar_addr_va = devm_ioremap(ab->dev, resp.bar_addr, resp.bar_size);
2159 ath11k_warn(ab, "qmi device info ioremap failed\n");
2165 ab->mem = bar_addr_va;
2166 ab->mem_len = resp.bar_size;
2173 static int ath11k_qmi_request_target_cap(struct ath11k_base *ab)
2175 struct qmi_wlanfw_cap_req_msg_v01 req;
2176 struct qmi_wlanfw_cap_resp_msg_v01 resp;
2181 int fw_build_id_mask_len;
2183 memset(&req, 0, sizeof(req));
2184 memset(&resp, 0, sizeof(resp));
2186 ret = qmi_txn_init(&ab->qmi.handle, &txn, qmi_wlanfw_cap_resp_msg_v01_ei,
2191 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi target cap request\n");
2193 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2194 QMI_WLANFW_CAP_REQ_V01,
2195 QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN,
2196 qmi_wlanfw_cap_req_msg_v01_ei, &req);
2198 qmi_txn_cancel(&txn);
2199 ath11k_warn(ab, "failed to send qmi cap request: %d\n",
2204 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2206 ath11k_warn(ab, "failed to wait qmi cap request: %d\n", ret);
2210 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2211 ath11k_warn(ab, "qmi cap request failed: %d %d\n",
2212 resp.resp.result, resp.resp.error);
2217 if (resp.chip_info_valid) {
2218 ab->qmi.target.chip_id = resp.chip_info.chip_id;
2219 ab->qmi.target.chip_family = resp.chip_info.chip_family;
2222 if (resp.board_info_valid)
2223 ab->qmi.target.board_id = resp.board_info.board_id;
2225 ab->qmi.target.board_id = 0xFF;
2227 if (resp.soc_info_valid)
2228 ab->qmi.target.soc_id = resp.soc_info.soc_id;
2230 if (resp.fw_version_info_valid) {
2231 ab->qmi.target.fw_version = resp.fw_version_info.fw_version;
2232 strlcpy(ab->qmi.target.fw_build_timestamp,
2233 resp.fw_version_info.fw_build_timestamp,
2234 sizeof(ab->qmi.target.fw_build_timestamp));
2237 if (resp.fw_build_id_valid)
2238 strlcpy(ab->qmi.target.fw_build_id, resp.fw_build_id,
2239 sizeof(ab->qmi.target.fw_build_id));
2241 if (resp.eeprom_read_timeout_valid) {
2242 ab->qmi.target.eeprom_caldata =
2243 resp.eeprom_read_timeout;
2244 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi cal data supported from eeprom\n");
2247 fw_build_id = ab->qmi.target.fw_build_id;
2248 fw_build_id_mask_len = strlen(FW_BUILD_ID_MASK);
2249 if (!strncmp(fw_build_id, FW_BUILD_ID_MASK, fw_build_id_mask_len))
2250 fw_build_id = fw_build_id + fw_build_id_mask_len;
2252 ath11k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n",
2253 ab->qmi.target.chip_id, ab->qmi.target.chip_family,
2254 ab->qmi.target.board_id, ab->qmi.target.soc_id);
2256 ath11k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s",
2257 ab->qmi.target.fw_version,
2258 ab->qmi.target.fw_build_timestamp,
2261 r = ath11k_core_check_smbios(ab);
2263 ath11k_dbg(ab, ATH11K_DBG_QMI, "SMBIOS bdf variant name not set.\n");
2265 r = ath11k_core_check_dt(ab);
2267 ath11k_dbg(ab, ATH11K_DBG_QMI, "DT bdf variant name not set.\n");
2273 static int ath11k_qmi_load_file_target_mem(struct ath11k_base *ab,
2274 const u8 *data, u32 len, u8 type)
2276 struct qmi_wlanfw_bdf_download_req_msg_v01 *req;
2277 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp;
2279 const u8 *temp = data;
2280 void __iomem *bdf_addr = NULL;
2282 u32 remaining = len;
2284 req = kzalloc(sizeof(*req), GFP_KERNEL);
2288 memset(&resp, 0, sizeof(resp));
2290 if (ab->hw_params.fixed_bdf_addr) {
2291 bdf_addr = ioremap(ab->hw_params.bdf_addr, ab->hw_params.fw.board_size);
2293 ath11k_warn(ab, "qmi ioremap error for bdf_addr\n");
2301 req->file_id_valid = 1;
2302 req->file_id = ab->qmi.target.board_id;
2303 req->total_size_valid = 1;
2304 req->total_size = remaining;
2305 req->seg_id_valid = 1;
2306 req->data_valid = 1;
2307 req->bdf_type = type;
2308 req->bdf_type_valid = 1;
2312 if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) {
2313 req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01;
2315 req->data_len = remaining;
2319 if (ab->hw_params.fixed_bdf_addr ||
2320 type == ATH11K_QMI_FILE_TYPE_EEPROM) {
2321 req->data_valid = 0;
2323 req->data_len = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
2325 memcpy(req->data, temp, req->data_len);
2328 if (ab->hw_params.fixed_bdf_addr) {
2329 if (type == ATH11K_QMI_FILE_TYPE_CALDATA)
2330 bdf_addr += ab->hw_params.fw.cal_offset;
2332 memcpy_toio(bdf_addr, temp, len);
2335 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2336 qmi_wlanfw_bdf_download_resp_msg_v01_ei,
2341 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf download req fixed addr type %d\n",
2344 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2345 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01,
2346 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN,
2347 qmi_wlanfw_bdf_download_req_msg_v01_ei, req);
2349 qmi_txn_cancel(&txn);
2353 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2355 ath11k_warn(ab, "failed to wait board file download request: %d\n",
2360 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2361 ath11k_warn(ab, "board file download request failed: %d %d\n",
2362 resp.resp.result, resp.resp.error);
2367 if (ab->hw_params.fixed_bdf_addr ||
2368 type == ATH11K_QMI_FILE_TYPE_EEPROM) {
2371 remaining -= req->data_len;
2372 temp += req->data_len;
2374 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf download request remaining %i\n",
2380 if (ab->hw_params.fixed_bdf_addr)
2389 static int ath11k_qmi_load_bdf_qmi(struct ath11k_base *ab,
2392 struct device *dev = ab->dev;
2393 char filename[ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE];
2394 const struct firmware *fw_entry;
2395 struct ath11k_board_data bd;
2396 u32 fw_size, file_type;
2397 int ret = 0, bdf_type;
2400 memset(&bd, 0, sizeof(bd));
2403 ret = ath11k_core_fetch_regdb(ab, &bd);
2405 ret = ath11k_core_fetch_bdf(ab, &bd);
2407 ath11k_warn(ab, "qmi failed to fetch board file: %d\n", ret);
2414 bdf_type = ATH11K_QMI_BDF_TYPE_REGDB;
2415 else if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0)
2416 bdf_type = ATH11K_QMI_BDF_TYPE_ELF;
2418 bdf_type = ATH11K_QMI_BDF_TYPE_BIN;
2420 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi bdf_type %d\n", bdf_type);
2422 fw_size = min_t(u32, ab->hw_params.fw.board_size, bd.len);
2424 ret = ath11k_qmi_load_file_target_mem(ab, bd.data, fw_size, bdf_type);
2426 ath11k_warn(ab, "qmi failed to load bdf file\n");
2430 /* QCA6390/WCN6855 does not support cal data, skip it */
2431 if (bdf_type == ATH11K_QMI_BDF_TYPE_ELF || bdf_type == ATH11K_QMI_BDF_TYPE_REGDB)
2434 if (ab->qmi.target.eeprom_caldata) {
2435 file_type = ATH11K_QMI_FILE_TYPE_EEPROM;
2437 fw_size = ATH11K_QMI_MAX_BDF_FILE_NAME_SIZE;
2439 file_type = ATH11K_QMI_FILE_TYPE_CALDATA;
2442 snprintf(filename, sizeof(filename), "/*(DEBLOBBED)*/",
2443 ath11k_bus_str(ab->hif.bus), dev_name(dev));
2444 fw_entry = ath11k_core_firmware_request(ab, filename);
2445 if (!IS_ERR(fw_entry))
2448 fw_entry = ath11k_core_firmware_request(ab, ATH11K_DEFAULT_CAL_FILE);
2449 if (IS_ERR(fw_entry)) {
2450 ret = PTR_ERR(fw_entry);
2452 "qmi failed to load CAL data file:%s\n",
2457 fw_size = min_t(u32, ab->hw_params.fw.board_size, fw_entry->size);
2458 tmp = fw_entry->data;
2461 ret = ath11k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type);
2463 ath11k_warn(ab, "qmi failed to load caldata\n");
2467 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi caldata type: %u\n", file_type);
2470 if (!ab->qmi.target.eeprom_caldata)
2471 release_firmware(fw_entry);
2473 ath11k_core_free_bdf(ab, &bd);
2474 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi BDF download sequence completed\n");
2479 static int ath11k_qmi_m3_load(struct ath11k_base *ab)
2481 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2482 const struct firmware *fw;
2486 fw = ath11k_core_firmware_request(ab, ATH11K_M3_FILE);
2489 ath11k_core_create_firmware_path(ab, ATH11K_M3_FILE,
2490 path, sizeof(path));
2491 ath11k_err(ab, "failed to load %s: %d\n", path, ret);
2495 if (m3_mem->vaddr || m3_mem->size)
2498 m3_mem->vaddr = dma_alloc_coherent(ab->dev,
2499 fw->size, &m3_mem->paddr,
2501 if (!m3_mem->vaddr) {
2502 ath11k_err(ab, "failed to allocate memory for M3 with size %zu\n",
2504 release_firmware(fw);
2509 memcpy(m3_mem->vaddr, fw->data, fw->size);
2510 m3_mem->size = fw->size;
2511 release_firmware(fw);
2516 static void ath11k_qmi_m3_free(struct ath11k_base *ab)
2518 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2520 if (!ab->hw_params.m3_fw_support || !m3_mem->vaddr)
2523 dma_free_coherent(ab->dev, m3_mem->size,
2524 m3_mem->vaddr, m3_mem->paddr);
2525 m3_mem->vaddr = NULL;
2529 static int ath11k_qmi_wlanfw_m3_info_send(struct ath11k_base *ab)
2531 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem;
2532 struct qmi_wlanfw_m3_info_req_msg_v01 req;
2533 struct qmi_wlanfw_m3_info_resp_msg_v01 resp;
2537 memset(&req, 0, sizeof(req));
2538 memset(&resp, 0, sizeof(resp));
2540 if (ab->hw_params.m3_fw_support) {
2541 ret = ath11k_qmi_m3_load(ab);
2543 ath11k_err(ab, "failed to load m3 firmware: %d", ret);
2547 req.addr = m3_mem->paddr;
2548 req.size = m3_mem->size;
2554 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2555 qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp);
2559 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi m3 info req\n");
2561 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2562 QMI_WLANFW_M3_INFO_REQ_V01,
2563 QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN,
2564 qmi_wlanfw_m3_info_req_msg_v01_ei, &req);
2566 qmi_txn_cancel(&txn);
2567 ath11k_warn(ab, "failed to send m3 information request: %d\n",
2572 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2574 ath11k_warn(ab, "failed to wait m3 information request: %d\n", ret);
2578 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2579 ath11k_warn(ab, "m3 info request failed: %d %d\n",
2580 resp.resp.result, resp.resp.error);
2588 static int ath11k_qmi_wlanfw_mode_send(struct ath11k_base *ab,
2591 struct qmi_wlanfw_wlan_mode_req_msg_v01 req;
2592 struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp;
2596 memset(&req, 0, sizeof(req));
2597 memset(&resp, 0, sizeof(resp));
2600 req.hw_debug_valid = 1;
2603 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2604 qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp);
2608 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wlan mode req mode %d\n", mode);
2610 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2611 QMI_WLANFW_WLAN_MODE_REQ_V01,
2612 QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN,
2613 qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req);
2615 qmi_txn_cancel(&txn);
2616 ath11k_warn(ab, "failed to send wlan mode request (mode %d): %d\n",
2621 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2623 if (mode == ATH11K_FIRMWARE_MODE_OFF && ret == -ENETRESET) {
2624 ath11k_warn(ab, "WLFW service is dis-connected\n");
2627 ath11k_warn(ab, "failed to wait wlan mode request (mode %d): %d\n",
2632 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2633 ath11k_warn(ab, "wlan mode request failed (mode: %d): %d %d\n",
2634 mode, resp.resp.result, resp.resp.error);
2643 static int ath11k_qmi_wlanfw_wlan_cfg_send(struct ath11k_base *ab)
2645 struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req;
2646 struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp;
2647 struct ce_pipe_config *ce_cfg;
2648 struct service_to_pipe *svc_cfg;
2650 int ret = 0, pipe_num;
2652 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce;
2653 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map;
2655 req = kzalloc(sizeof(*req), GFP_KERNEL);
2659 memset(&resp, 0, sizeof(resp));
2661 req->host_version_valid = 1;
2662 strlcpy(req->host_version, ATH11K_HOST_VERSION_STRING,
2663 sizeof(req->host_version));
2665 req->tgt_cfg_valid = 1;
2666 /* This is number of CE configs */
2667 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len;
2668 for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) {
2669 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum;
2670 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir;
2671 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries;
2672 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max;
2673 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags;
2676 req->svc_cfg_valid = 1;
2677 /* This is number of Service/CE configs */
2678 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len;
2679 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) {
2680 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id;
2681 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir;
2682 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum;
2684 req->shadow_reg_valid = 0;
2686 /* set shadow v2 configuration */
2687 if (ab->hw_params.supports_shadow_regs) {
2688 req->shadow_reg_v2_valid = 1;
2689 req->shadow_reg_v2_len = min_t(u32,
2690 ab->qmi.ce_cfg.shadow_reg_v2_len,
2691 QMI_WLANFW_MAX_NUM_SHADOW_REG_V2_V01);
2692 memcpy(&req->shadow_reg_v2, ab->qmi.ce_cfg.shadow_reg_v2,
2693 sizeof(u32) * req->shadow_reg_v2_len);
2695 req->shadow_reg_v2_valid = 0;
2698 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2699 qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp);
2703 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wlan cfg req\n");
2705 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2706 QMI_WLANFW_WLAN_CFG_REQ_V01,
2707 QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN,
2708 qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req);
2710 qmi_txn_cancel(&txn);
2711 ath11k_warn(ab, "failed to send wlan config request: %d\n",
2716 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2718 ath11k_warn(ab, "failed to wait wlan config request: %d\n", ret);
2722 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2723 ath11k_warn(ab, "wlan config request failed: %d %d\n",
2724 resp.resp.result, resp.resp.error);
2734 static int ath11k_qmi_wlanfw_wlan_ini_send(struct ath11k_base *ab, bool enable)
2738 struct qmi_wlanfw_wlan_ini_req_msg_v01 req = {};
2739 struct qmi_wlanfw_wlan_ini_resp_msg_v01 resp = {};
2741 req.enablefwlog_valid = true;
2742 req.enablefwlog = enable ? 1 : 0;
2744 ret = qmi_txn_init(&ab->qmi.handle, &txn,
2745 qmi_wlanfw_wlan_ini_resp_msg_v01_ei, &resp);
2749 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn,
2750 QMI_WLANFW_WLAN_INI_REQ_V01,
2751 QMI_WLANFW_WLAN_INI_REQ_MSG_V01_MAX_LEN,
2752 qmi_wlanfw_wlan_ini_req_msg_v01_ei, &req);
2754 ath11k_warn(ab, "qmi failed to send wlan ini request, err = %d\n",
2756 qmi_txn_cancel(&txn);
2760 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH11K_QMI_WLANFW_TIMEOUT_MS));
2762 ath11k_warn(ab, "qmi failed wlan ini request, err = %d\n", ret);
2766 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) {
2767 ath11k_warn(ab, "qmi wlan ini request failed, result: %d, err: %d\n",
2768 resp.resp.result, resp.resp.error);
2776 void ath11k_qmi_firmware_stop(struct ath11k_base *ab)
2780 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware stop\n");
2782 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_OFF);
2784 ath11k_warn(ab, "qmi failed to send wlan mode off: %d\n", ret);
2789 int ath11k_qmi_firmware_start(struct ath11k_base *ab,
2794 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware start\n");
2796 if (ab->hw_params.fw_wmi_diag_event) {
2797 ret = ath11k_qmi_wlanfw_wlan_ini_send(ab, true);
2799 ath11k_warn(ab, "qmi failed to send wlan fw ini:%d\n", ret);
2804 ret = ath11k_qmi_wlanfw_wlan_cfg_send(ab);
2806 ath11k_warn(ab, "qmi failed to send wlan cfg: %d\n", ret);
2810 ret = ath11k_qmi_wlanfw_mode_send(ab, mode);
2812 ath11k_warn(ab, "qmi failed to send wlan fw mode: %d\n", ret);
2819 static int ath11k_qmi_process_coldboot_calibration(struct ath11k_base *ab)
2824 ret = ath11k_qmi_wlanfw_mode_send(ab, ATH11K_FIRMWARE_MODE_COLD_BOOT);
2826 ath11k_warn(ab, "qmi failed to send wlan fw mode: %d\n", ret);
2830 ath11k_dbg(ab, ATH11K_DBG_QMI, "Coldboot calibration wait started\n");
2832 timeout = wait_event_timeout(ab->qmi.cold_boot_waitq,
2833 (ab->qmi.cal_done == 1),
2834 ATH11K_COLD_BOOT_FW_RESET_DELAY);
2836 ath11k_warn(ab, "coldboot calibration timed out\n");
2840 ath11k_dbg(ab, ATH11K_DBG_QMI, "Coldboot calibration done\n");
2846 ath11k_qmi_driver_event_post(struct ath11k_qmi *qmi,
2847 enum ath11k_qmi_event_type type,
2850 struct ath11k_qmi_driver_event *event;
2852 event = kzalloc(sizeof(*event), GFP_ATOMIC);
2859 spin_lock(&qmi->event_lock);
2860 list_add_tail(&event->list, &qmi->event_list);
2861 spin_unlock(&qmi->event_lock);
2863 queue_work(qmi->event_wq, &qmi->event_work);
2868 static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
2870 struct ath11k_base *ab = qmi->ab;
2873 ret = ath11k_qmi_respond_fw_mem_request(ab);
2875 ath11k_warn(ab, "qmi failed to respond fw mem req: %d\n", ret);
2882 static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
2884 struct ath11k_base *ab = qmi->ab;
2887 ret = ath11k_qmi_request_target_cap(ab);
2889 ath11k_warn(ab, "failed to request qmi target capabilities: %d\n",
2894 ret = ath11k_qmi_request_device_info(ab);
2896 ath11k_warn(ab, "failed to request qmi device info: %d\n", ret);
2900 if (ab->hw_params.supports_regdb)
2901 ath11k_qmi_load_bdf_qmi(ab, true);
2903 ret = ath11k_qmi_load_bdf_qmi(ab, false);
2905 ath11k_warn(ab, "failed to load board data file: %d\n", ret);
2912 static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
2914 struct ath11k_base *ab = qmi->ab;
2917 ret = ath11k_qmi_fw_ind_register_send(ab);
2919 ath11k_warn(ab, "failed to send qmi firmware indication: %d\n",
2924 ret = ath11k_qmi_host_cap_send(ab);
2926 ath11k_warn(ab, "failed to send qmi host cap: %d\n", ret);
2930 if (!ab->hw_params.fixed_fw_mem)
2933 ret = ath11k_qmi_event_load_bdf(qmi);
2935 ath11k_warn(ab, "qmi failed to download BDF:%d\n", ret);
2942 static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
2943 struct sockaddr_qrtr *sq,
2944 struct qmi_txn *txn,
2947 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2948 struct ath11k_base *ab = qmi->ab;
2949 const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data;
2952 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware request memory request\n");
2954 if (msg->mem_seg_len == 0 ||
2955 msg->mem_seg_len > ATH11K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01)
2956 ath11k_warn(ab, "invalid memory segment length: %u\n",
2959 ab->qmi.mem_seg_count = msg->mem_seg_len;
2961 for (i = 0; i < qmi->mem_seg_count ; i++) {
2962 ab->qmi.target_mem[i].type = msg->mem_seg[i].type;
2963 ab->qmi.target_mem[i].size = msg->mem_seg[i].size;
2964 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi mem seg type %d size %d\n",
2965 msg->mem_seg[i].type, msg->mem_seg[i].size);
2968 if (ab->hw_params.fixed_mem_region ||
2969 test_bit(ATH11K_FLAG_FIXED_MEM_RGN, &ab->dev_flags)) {
2970 ret = ath11k_qmi_assign_target_mem_chunk(ab);
2972 ath11k_warn(ab, "failed to assign qmi target memory: %d\n",
2977 ret = ath11k_qmi_alloc_target_mem_chunk(ab);
2979 ath11k_warn(ab, "failed to allocate qmi target memory: %d\n",
2985 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_REQUEST_MEM, NULL);
2988 static void ath11k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl,
2989 struct sockaddr_qrtr *sq,
2990 struct qmi_txn *txn,
2991 const void *decoded)
2993 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
2994 struct ath11k_base *ab = qmi->ab;
2996 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware memory ready indication\n");
2997 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_MEM_READY, NULL);
3000 static void ath11k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl,
3001 struct sockaddr_qrtr *sq,
3002 struct qmi_txn *txn,
3003 const void *decoded)
3005 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
3006 struct ath11k_base *ab = qmi->ab;
3008 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi firmware ready\n");
3009 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_FW_READY, NULL);
3012 static void ath11k_qmi_msg_cold_boot_cal_done_cb(struct qmi_handle *qmi_hdl,
3013 struct sockaddr_qrtr *sq,
3014 struct qmi_txn *txn,
3015 const void *decoded)
3017 struct ath11k_qmi *qmi = container_of(qmi_hdl,
3018 struct ath11k_qmi, handle);
3019 struct ath11k_base *ab = qmi->ab;
3021 ab->qmi.cal_done = 1;
3022 wake_up(&ab->qmi.cold_boot_waitq);
3023 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi cold boot calibration done\n");
3026 static const struct qmi_msg_handler ath11k_qmi_msg_handlers[] = {
3028 .type = QMI_INDICATION,
3029 .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01,
3030 .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei,
3031 .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01),
3032 .fn = ath11k_qmi_msg_mem_request_cb,
3035 .type = QMI_INDICATION,
3036 .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01,
3037 .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei,
3038 .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01),
3039 .fn = ath11k_qmi_msg_mem_ready_cb,
3042 .type = QMI_INDICATION,
3043 .msg_id = QMI_WLFW_FW_READY_IND_V01,
3044 .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei,
3045 .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01),
3046 .fn = ath11k_qmi_msg_fw_ready_cb,
3049 .type = QMI_INDICATION,
3050 .msg_id = QMI_WLFW_COLD_BOOT_CAL_DONE_IND_V01,
3051 .ei = qmi_wlanfw_cold_boot_cal_done_ind_msg_v01_ei,
3053 sizeof(struct qmi_wlanfw_fw_cold_cal_done_ind_msg_v01),
3054 .fn = ath11k_qmi_msg_cold_boot_cal_done_cb,
3058 static int ath11k_qmi_ops_new_server(struct qmi_handle *qmi_hdl,
3059 struct qmi_service *service)
3061 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
3062 struct ath11k_base *ab = qmi->ab;
3063 struct sockaddr_qrtr *sq = &qmi->sq;
3066 sq->sq_family = AF_QIPCRTR;
3067 sq->sq_node = service->node;
3068 sq->sq_port = service->port;
3070 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq,
3073 ath11k_warn(ab, "failed to connect to qmi remote service: %d\n", ret);
3077 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw qmi service connected\n");
3078 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_ARRIVE, NULL);
3083 static void ath11k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,
3084 struct qmi_service *service)
3086 struct ath11k_qmi *qmi = container_of(qmi_hdl, struct ath11k_qmi, handle);
3087 struct ath11k_base *ab = qmi->ab;
3089 ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw del server\n");
3090 ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_EXIT, NULL);
3093 static const struct qmi_ops ath11k_qmi_ops = {
3094 .new_server = ath11k_qmi_ops_new_server,
3095 .del_server = ath11k_qmi_ops_del_server,
3098 static void ath11k_qmi_driver_event_work(struct work_struct *work)
3100 struct ath11k_qmi *qmi = container_of(work, struct ath11k_qmi,
3102 struct ath11k_qmi_driver_event *event;
3103 struct ath11k_base *ab = qmi->ab;
3106 spin_lock(&qmi->event_lock);
3107 while (!list_empty(&qmi->event_list)) {
3108 event = list_first_entry(&qmi->event_list,
3109 struct ath11k_qmi_driver_event, list);
3110 list_del(&event->list);
3111 spin_unlock(&qmi->event_lock);
3113 if (test_bit(ATH11K_FLAG_UNREGISTERING, &ab->dev_flags)) {
3118 switch (event->type) {
3119 case ATH11K_QMI_EVENT_SERVER_ARRIVE:
3120 ret = ath11k_qmi_event_server_arrive(qmi);
3122 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3124 case ATH11K_QMI_EVENT_SERVER_EXIT:
3125 set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
3126 set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
3128 case ATH11K_QMI_EVENT_REQUEST_MEM:
3129 ret = ath11k_qmi_event_mem_request(qmi);
3131 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3133 case ATH11K_QMI_EVENT_FW_MEM_READY:
3134 ret = ath11k_qmi_event_load_bdf(qmi);
3136 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3140 ret = ath11k_qmi_wlanfw_m3_info_send(ab);
3143 "failed to send qmi m3 info req: %d\n", ret);
3144 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3148 case ATH11K_QMI_EVENT_FW_READY:
3149 clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3150 if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
3151 ath11k_hal_dump_srng_stats(ab);
3152 queue_work(ab->workqueue, &ab->restart_work);
3156 if (ath11k_cold_boot_cal && ab->qmi.cal_done == 0 &&
3157 ab->hw_params.cold_boot_calib) {
3158 ath11k_qmi_process_coldboot_calibration(ab);
3160 clear_bit(ATH11K_FLAG_CRASH_FLUSH,
3162 clear_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
3163 ret = ath11k_core_qmi_firmware_ready(ab);
3165 set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
3168 set_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags);
3172 case ATH11K_QMI_EVENT_COLD_BOOT_CAL_DONE:
3175 ath11k_warn(ab, "invalid qmi event type: %d", event->type);
3179 spin_lock(&qmi->event_lock);
3181 spin_unlock(&qmi->event_lock);
3184 int ath11k_qmi_init_service(struct ath11k_base *ab)
3188 memset(&ab->qmi.target, 0, sizeof(struct target_info));
3189 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk));
3192 ab->qmi.target_mem_mode = ab->hw_params.fw_mem_mode;
3193 ret = qmi_handle_init(&ab->qmi.handle, ATH11K_QMI_RESP_LEN_MAX,
3194 &ath11k_qmi_ops, ath11k_qmi_msg_handlers);
3196 ath11k_warn(ab, "failed to initialize qmi handle: %d\n", ret);
3200 ab->qmi.event_wq = alloc_workqueue("ath11k_qmi_driver_event",
3202 if (!ab->qmi.event_wq) {
3203 ath11k_err(ab, "failed to allocate workqueue\n");
3207 INIT_LIST_HEAD(&ab->qmi.event_list);
3208 spin_lock_init(&ab->qmi.event_lock);
3209 INIT_WORK(&ab->qmi.event_work, ath11k_qmi_driver_event_work);
3211 ret = qmi_add_lookup(&ab->qmi.handle, ATH11K_QMI_WLFW_SERVICE_ID_V01,
3212 ATH11K_QMI_WLFW_SERVICE_VERS_V01,
3213 ab->qmi.service_ins_id);
3215 ath11k_warn(ab, "failed to add qmi lookup: %d\n", ret);
3216 destroy_workqueue(ab->qmi.event_wq);
3223 void ath11k_qmi_deinit_service(struct ath11k_base *ab)
3225 qmi_handle_release(&ab->qmi.handle);
3226 cancel_work_sync(&ab->qmi.event_work);
3227 destroy_workqueue(ab->qmi.event_wq);
3228 ath11k_qmi_m3_free(ab);
3229 ath11k_qmi_free_target_mem_chunk(ab);
3231 EXPORT_SYMBOL(ath11k_qmi_deinit_service);
3233 void ath11k_qmi_free_resource(struct ath11k_base *ab)
3235 ath11k_qmi_free_target_mem_chunk(ab);
3236 ath11k_qmi_m3_free(ab);