Lines Matching refs:qmi
31 static int ath10k_qmi_map_msa_permission(struct ath10k_qmi *qmi, in ath10k_qmi_map_msa_permission() argument
35 struct ath10k *ar = qmi->ar; in ath10k_qmi_map_msa_permission()
63 static int ath10k_qmi_unmap_msa_permission(struct ath10k_qmi *qmi, in ath10k_qmi_unmap_msa_permission() argument
67 struct ath10k *ar = qmi->ar; in ath10k_qmi_unmap_msa_permission()
87 static int ath10k_qmi_setup_msa_permissions(struct ath10k_qmi *qmi) in ath10k_qmi_setup_msa_permissions() argument
92 if (qmi->msa_fixed_perm) in ath10k_qmi_setup_msa_permissions()
95 for (i = 0; i < qmi->nr_mem_region; i++) { in ath10k_qmi_setup_msa_permissions()
96 ret = ath10k_qmi_map_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_setup_msa_permissions()
105 ath10k_qmi_unmap_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_setup_msa_permissions()
109 static void ath10k_qmi_remove_msa_permission(struct ath10k_qmi *qmi) in ath10k_qmi_remove_msa_permission() argument
113 if (qmi->msa_fixed_perm) in ath10k_qmi_remove_msa_permission()
116 for (i = 0; i < qmi->nr_mem_region; i++) in ath10k_qmi_remove_msa_permission()
117 ath10k_qmi_unmap_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_remove_msa_permission()
120 static int ath10k_qmi_msa_mem_info_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_msa_mem_info_send_sync_msg() argument
124 struct ath10k *ar = qmi->ar; in ath10k_qmi_msa_mem_info_send_sync_msg()
133 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_msa_mem_info_send_sync_msg()
138 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_msa_mem_info_send_sync_msg()
166 qmi->nr_mem_region = resp.mem_region_info_len; in ath10k_qmi_msa_mem_info_send_sync_msg()
179 qmi->mem_region[i].addr = resp.mem_region_info[i].region_addr; in ath10k_qmi_msa_mem_info_send_sync_msg()
180 qmi->mem_region[i].size = resp.mem_region_info[i].size; in ath10k_qmi_msa_mem_info_send_sync_msg()
181 qmi->mem_region[i].secure = resp.mem_region_info[i].secure_flag; in ath10k_qmi_msa_mem_info_send_sync_msg()
184 i, &qmi->mem_region[i].addr, in ath10k_qmi_msa_mem_info_send_sync_msg()
185 qmi->mem_region[i].size, in ath10k_qmi_msa_mem_info_send_sync_msg()
186 qmi->mem_region[i].secure); in ath10k_qmi_msa_mem_info_send_sync_msg()
193 memset(&qmi->mem_region[0], 0, sizeof(qmi->mem_region[0]) * i); in ath10k_qmi_msa_mem_info_send_sync_msg()
198 static int ath10k_qmi_msa_ready_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_msa_ready_send_sync_msg() argument
202 struct ath10k *ar = qmi->ar; in ath10k_qmi_msa_ready_send_sync_msg()
206 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_msa_ready_send_sync_msg()
211 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_msa_ready_send_sync_msg()
237 static int ath10k_qmi_bdf_dnld_send_sync(struct ath10k_qmi *qmi) in ath10k_qmi_bdf_dnld_send_sync() argument
241 struct ath10k *ar = qmi->ar; in ath10k_qmi_bdf_dnld_send_sync()
273 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_bdf_dnld_send_sync()
279 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_bdf_dnld_send_sync()
323 static int ath10k_qmi_send_cal_report_req(struct ath10k_qmi *qmi) in ath10k_qmi_send_cal_report_req() argument
327 struct ath10k *ar = qmi->ar; in ath10k_qmi_send_cal_report_req()
338 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_cal_report_resp_msg_v01_ei, in ath10k_qmi_send_cal_report_req()
344 if (qmi->cal_data[i].total_size && in ath10k_qmi_send_cal_report_req()
345 qmi->cal_data[i].data) { in ath10k_qmi_send_cal_report_req()
346 req.meta_data[j] = qmi->cal_data[i].cal_id; in ath10k_qmi_send_cal_report_req()
352 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_send_cal_report_req()
383 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_mode_send_sync_msg() local
389 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_mode_send_sync_msg()
399 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_mode_send_sync_msg()
432 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_cfg_send_sync_msg() local
443 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_cfg_send_sync_msg()
485 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_cfg_send_sync_msg()
571 static int ath10k_qmi_cap_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_cap_send_sync_msg() argument
575 struct ath10k *ar = qmi->ar; in ath10k_qmi_cap_send_sync_msg()
584 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_cap_resp_msg_v01_ei, resp); in ath10k_qmi_cap_send_sync_msg()
588 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_cap_send_sync_msg()
609 qmi->chip_info.chip_id = resp->chip_info.chip_id; in ath10k_qmi_cap_send_sync_msg()
610 qmi->chip_info.chip_family = resp->chip_info.chip_family; in ath10k_qmi_cap_send_sync_msg()
612 qmi->chip_info.chip_id = 0xFF; in ath10k_qmi_cap_send_sync_msg()
616 qmi->board_info.board_id = resp->board_info.board_id; in ath10k_qmi_cap_send_sync_msg()
618 qmi->board_info.board_id = 0xFF; in ath10k_qmi_cap_send_sync_msg()
621 qmi->soc_info.soc_id = resp->soc_info.soc_id; in ath10k_qmi_cap_send_sync_msg()
624 qmi->fw_version = resp->fw_version_info.fw_version; in ath10k_qmi_cap_send_sync_msg()
625 strscpy(qmi->fw_build_timestamp, resp->fw_version_info.fw_build_timestamp, in ath10k_qmi_cap_send_sync_msg()
626 sizeof(qmi->fw_build_timestamp)); in ath10k_qmi_cap_send_sync_msg()
630 strscpy(qmi->fw_build_id, resp->fw_build_id, in ath10k_qmi_cap_send_sync_msg()
635 qmi->chip_info.chip_id, qmi->chip_info.chip_family, in ath10k_qmi_cap_send_sync_msg()
636 qmi->board_info.board_id, qmi->soc_info.soc_id); in ath10k_qmi_cap_send_sync_msg()
638 qmi->fw_version, qmi->fw_build_timestamp, qmi->fw_build_id); in ath10k_qmi_cap_send_sync_msg()
642 ath10k_qmi_add_wlan_ver_smem(ar, qmi->fw_build_id); in ath10k_qmi_cap_send_sync_msg()
652 static int ath10k_qmi_host_cap_send_sync(struct ath10k_qmi *qmi) in ath10k_qmi_host_cap_send_sync() argument
657 struct ath10k *ar = qmi->ar; in ath10k_qmi_host_cap_send_sync()
665 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_host_cap_resp_msg_v01_ei, in ath10k_qmi_host_cap_send_sync()
675 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_host_cap_send_sync()
708 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_set_fw_log_mode() local
716 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_ini_resp_msg_v01_ei, in ath10k_qmi_set_fw_log_mode()
721 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_set_fw_log_mode()
750 ath10k_qmi_ind_register_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_ind_register_send_sync_msg() argument
754 struct ath10k *ar = qmi->ar; in ath10k_qmi_ind_register_send_sync_msg()
771 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_ind_register_send_sync_msg()
776 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_ind_register_send_sync_msg()
798 qmi->fw_ready = true; in ath10k_qmi_ind_register_send_sync_msg()
807 static void ath10k_qmi_event_server_arrive(struct ath10k_qmi *qmi) in ath10k_qmi_event_server_arrive() argument
809 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_server_arrive()
812 ret = ath10k_qmi_ind_register_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
816 if (qmi->fw_ready) { in ath10k_qmi_event_server_arrive()
821 ret = ath10k_qmi_host_cap_send_sync(qmi); in ath10k_qmi_event_server_arrive()
825 ret = ath10k_qmi_msa_mem_info_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
836 ret = ath10k_qmi_setup_msa_permissions(qmi); in ath10k_qmi_event_server_arrive()
840 ret = ath10k_qmi_msa_ready_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
844 ret = ath10k_qmi_cap_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
851 ath10k_qmi_remove_msa_permission(qmi); in ath10k_qmi_event_server_arrive()
854 static int ath10k_qmi_fetch_board_file(struct ath10k_qmi *qmi) in ath10k_qmi_fetch_board_file() argument
856 struct ath10k *ar = qmi->ar; in ath10k_qmi_fetch_board_file()
861 ar->id.qmi_board_id = qmi->board_info.board_id; in ath10k_qmi_fetch_board_file()
862 ar->id.qmi_chip_id = qmi->chip_info.chip_id; in ath10k_qmi_fetch_board_file()
869 return ath10k_core_fetch_board_file(qmi->ar, ATH10K_BD_IE_BOARD); in ath10k_qmi_fetch_board_file()
873 ath10k_qmi_driver_event_post(struct ath10k_qmi *qmi, in ath10k_qmi_driver_event_post() argument
886 spin_lock(&qmi->event_lock); in ath10k_qmi_driver_event_post()
887 list_add_tail(&event->list, &qmi->event_list); in ath10k_qmi_driver_event_post()
888 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_post()
890 queue_work(qmi->event_wq, &qmi->event_work); in ath10k_qmi_driver_event_post()
895 static void ath10k_qmi_event_server_exit(struct ath10k_qmi *qmi) in ath10k_qmi_event_server_exit() argument
897 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_server_exit()
900 ath10k_qmi_remove_msa_permission(qmi); in ath10k_qmi_event_server_exit()
910 static void ath10k_qmi_event_msa_ready(struct ath10k_qmi *qmi) in ath10k_qmi_event_msa_ready() argument
914 ret = ath10k_qmi_fetch_board_file(qmi); in ath10k_qmi_event_msa_ready()
918 ret = ath10k_qmi_bdf_dnld_send_sync(qmi); in ath10k_qmi_event_msa_ready()
922 ret = ath10k_qmi_send_cal_report_req(qmi); in ath10k_qmi_event_msa_ready()
928 static int ath10k_qmi_event_fw_ready_ind(struct ath10k_qmi *qmi) in ath10k_qmi_event_fw_ready_ind() argument
930 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_fw_ready_ind()
942 struct ath10k_qmi *qmi = container_of(qmi_hdl, struct ath10k_qmi, qmi_hdl); in ath10k_qmi_fw_ready_ind() local
944 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_FW_READY_IND, NULL); in ath10k_qmi_fw_ready_ind()
951 struct ath10k_qmi *qmi = container_of(qmi_hdl, struct ath10k_qmi, qmi_hdl); in ath10k_qmi_msa_ready_ind() local
953 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_MSA_READY_IND, NULL); in ath10k_qmi_msa_ready_ind()
977 struct ath10k_qmi *qmi = container_of(qmi_hdl, struct ath10k_qmi, qmi_hdl); in ath10k_qmi_new_server() local
978 struct sockaddr_qrtr *sq = &qmi->sq; in ath10k_qmi_new_server()
979 struct ath10k *ar = qmi->ar; in ath10k_qmi_new_server()
988 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)&qmi->sq, in ath10k_qmi_new_server()
989 sizeof(qmi->sq), 0); in ath10k_qmi_new_server()
996 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_SERVER_ARRIVE, NULL); in ath10k_qmi_new_server()
1004 struct ath10k_qmi *qmi = in ath10k_qmi_del_server() local
1007 qmi->fw_ready = false; in ath10k_qmi_del_server()
1015 if (qmi->state == ATH10K_QMI_STATE_INIT_DONE) in ath10k_qmi_del_server()
1016 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_SERVER_EXIT, in ath10k_qmi_del_server()
1027 struct ath10k_qmi *qmi = container_of(work, struct ath10k_qmi, in ath10k_qmi_driver_event_work() local
1030 struct ath10k *ar = qmi->ar; in ath10k_qmi_driver_event_work()
1032 spin_lock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1033 while (!list_empty(&qmi->event_list)) { in ath10k_qmi_driver_event_work()
1034 event = list_first_entry(&qmi->event_list, in ath10k_qmi_driver_event_work()
1037 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1041 ath10k_qmi_event_server_arrive(qmi); in ath10k_qmi_driver_event_work()
1044 ath10k_qmi_event_server_exit(qmi); in ath10k_qmi_driver_event_work()
1047 ath10k_qmi_event_fw_ready_ind(qmi); in ath10k_qmi_driver_event_work()
1050 ath10k_qmi_event_msa_ready(qmi); in ath10k_qmi_driver_event_work()
1057 spin_lock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1059 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1066 struct ath10k_qmi *qmi; in ath10k_qmi_init() local
1069 qmi = kzalloc(sizeof(*qmi), GFP_KERNEL); in ath10k_qmi_init()
1070 if (!qmi) in ath10k_qmi_init()
1073 qmi->ar = ar; in ath10k_qmi_init()
1074 ar_snoc->qmi = qmi; in ath10k_qmi_init()
1077 qmi->msa_fixed_perm = true; in ath10k_qmi_init()
1079 ret = qmi_handle_init(&qmi->qmi_hdl, in ath10k_qmi_init()
1085 qmi->event_wq = alloc_ordered_workqueue("ath10k_qmi_driver_event", 0); in ath10k_qmi_init()
1086 if (!qmi->event_wq) { in ath10k_qmi_init()
1092 INIT_LIST_HEAD(&qmi->event_list); in ath10k_qmi_init()
1093 spin_lock_init(&qmi->event_lock); in ath10k_qmi_init()
1094 INIT_WORK(&qmi->event_work, ath10k_qmi_driver_event_work); in ath10k_qmi_init()
1096 ret = qmi_add_lookup(&qmi->qmi_hdl, WLFW_SERVICE_ID_V01, in ath10k_qmi_init()
1101 qmi->state = ATH10K_QMI_STATE_INIT_DONE; in ath10k_qmi_init()
1105 destroy_workqueue(qmi->event_wq); in ath10k_qmi_init()
1108 qmi_handle_release(&qmi->qmi_hdl); in ath10k_qmi_init()
1111 kfree(qmi); in ath10k_qmi_init()
1118 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_deinit() local
1120 qmi->state = ATH10K_QMI_STATE_DEINIT; in ath10k_qmi_deinit()
1121 qmi_handle_release(&qmi->qmi_hdl); in ath10k_qmi_deinit()
1122 cancel_work_sync(&qmi->event_work); in ath10k_qmi_deinit()
1123 destroy_workqueue(qmi->event_wq); in ath10k_qmi_deinit()
1124 kfree(qmi); in ath10k_qmi_deinit()
1125 ar_snoc->qmi = NULL; in ath10k_qmi_deinit()