Lines Matching full:qmi

32 static int ath10k_qmi_map_msa_permission(struct ath10k_qmi *qmi,  in ath10k_qmi_map_msa_permission()  argument
36 struct ath10k *ar = qmi->ar; in ath10k_qmi_map_msa_permission()
64 static int ath10k_qmi_unmap_msa_permission(struct ath10k_qmi *qmi, in ath10k_qmi_unmap_msa_permission() argument
68 struct ath10k *ar = qmi->ar; in ath10k_qmi_unmap_msa_permission()
88 static int ath10k_qmi_setup_msa_permissions(struct ath10k_qmi *qmi) in ath10k_qmi_setup_msa_permissions() argument
93 if (qmi->msa_fixed_perm) in ath10k_qmi_setup_msa_permissions()
96 for (i = 0; i < qmi->nr_mem_region; i++) { in ath10k_qmi_setup_msa_permissions()
97 ret = ath10k_qmi_map_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_setup_msa_permissions()
106 ath10k_qmi_unmap_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_setup_msa_permissions()
110 static void ath10k_qmi_remove_msa_permission(struct ath10k_qmi *qmi) in ath10k_qmi_remove_msa_permission() argument
114 if (qmi->msa_fixed_perm) in ath10k_qmi_remove_msa_permission()
117 for (i = 0; i < qmi->nr_mem_region; i++) in ath10k_qmi_remove_msa_permission()
118 ath10k_qmi_unmap_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_remove_msa_permission()
121 static int ath10k_qmi_msa_mem_info_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_msa_mem_info_send_sync_msg() argument
125 struct ath10k *ar = qmi->ar; in ath10k_qmi_msa_mem_info_send_sync_msg()
134 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_msa_mem_info_send_sync_msg()
139 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_msa_mem_info_send_sync_msg()
167 qmi->nr_mem_region = resp.mem_region_info_len; in ath10k_qmi_msa_mem_info_send_sync_msg()
180 qmi->mem_region[i].addr = resp.mem_region_info[i].region_addr; in ath10k_qmi_msa_mem_info_send_sync_msg()
181 qmi->mem_region[i].size = resp.mem_region_info[i].size; in ath10k_qmi_msa_mem_info_send_sync_msg()
182 qmi->mem_region[i].secure = resp.mem_region_info[i].secure_flag; in ath10k_qmi_msa_mem_info_send_sync_msg()
184 "qmi msa mem region %d addr 0x%pa size 0x%x flag 0x%08x\n", in ath10k_qmi_msa_mem_info_send_sync_msg()
185 i, &qmi->mem_region[i].addr, in ath10k_qmi_msa_mem_info_send_sync_msg()
186 qmi->mem_region[i].size, in ath10k_qmi_msa_mem_info_send_sync_msg()
187 qmi->mem_region[i].secure); in ath10k_qmi_msa_mem_info_send_sync_msg()
190 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi msa mem info request completed\n"); in ath10k_qmi_msa_mem_info_send_sync_msg()
194 memset(&qmi->mem_region[0], 0, sizeof(qmi->mem_region[0]) * i); in ath10k_qmi_msa_mem_info_send_sync_msg()
199 static int ath10k_qmi_msa_ready_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_msa_ready_send_sync_msg() argument
203 struct ath10k *ar = qmi->ar; in ath10k_qmi_msa_ready_send_sync_msg()
207 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_msa_ready_send_sync_msg()
212 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_msa_ready_send_sync_msg()
231 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi msa mem ready request completed\n"); in ath10k_qmi_msa_ready_send_sync_msg()
238 static int ath10k_qmi_bdf_dnld_send_sync(struct ath10k_qmi *qmi) in ath10k_qmi_bdf_dnld_send_sync() argument
242 struct ath10k *ar = qmi->ar; in ath10k_qmi_bdf_dnld_send_sync()
274 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_bdf_dnld_send_sync()
280 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_bdf_dnld_send_sync()
314 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi bdf download request completed\n"); in ath10k_qmi_bdf_dnld_send_sync()
324 static int ath10k_qmi_send_cal_report_req(struct ath10k_qmi *qmi) in ath10k_qmi_send_cal_report_req() argument
328 struct ath10k *ar = qmi->ar; in ath10k_qmi_send_cal_report_req()
339 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_cal_report_resp_msg_v01_ei, in ath10k_qmi_send_cal_report_req()
345 if (qmi->cal_data[i].total_size && in ath10k_qmi_send_cal_report_req()
346 qmi->cal_data[i].data) { in ath10k_qmi_send_cal_report_req()
347 req.meta_data[j] = qmi->cal_data[i].cal_id; in ath10k_qmi_send_cal_report_req()
353 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_send_cal_report_req()
373 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi cal report request completed\n"); in ath10k_qmi_send_cal_report_req()
384 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_mode_send_sync_msg() local
390 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_mode_send_sync_msg()
400 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_mode_send_sync_msg()
420 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi wlan mode req completed: %d\n", mode); in ath10k_qmi_mode_send_sync_msg()
433 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_cfg_send_sync_msg() local
444 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_cfg_send_sync_msg()
486 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_cfg_send_sync_msg()
506 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi config request completed\n"); in ath10k_qmi_cfg_send_sync_msg()
522 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi mode %d config %p\n", in ath10k_qmi_wlan_enable()
527 ath10k_err(ar, "failed to send qmi config: %d\n", ret); in ath10k_qmi_wlan_enable()
533 ath10k_err(ar, "failed to send qmi mode: %d\n", ret); in ath10k_qmi_wlan_enable()
572 static int ath10k_qmi_cap_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_cap_send_sync_msg() argument
576 struct ath10k *ar = qmi->ar; in ath10k_qmi_cap_send_sync_msg()
585 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_cap_resp_msg_v01_ei, resp); in ath10k_qmi_cap_send_sync_msg()
589 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_cap_send_sync_msg()
610 qmi->chip_info.chip_id = resp->chip_info.chip_id; in ath10k_qmi_cap_send_sync_msg()
611 qmi->chip_info.chip_family = resp->chip_info.chip_family; in ath10k_qmi_cap_send_sync_msg()
613 qmi->chip_info.chip_id = 0xFF; in ath10k_qmi_cap_send_sync_msg()
617 qmi->board_info.board_id = resp->board_info.board_id; in ath10k_qmi_cap_send_sync_msg()
619 qmi->board_info.board_id = 0xFF; in ath10k_qmi_cap_send_sync_msg()
622 qmi->soc_info.soc_id = resp->soc_info.soc_id; in ath10k_qmi_cap_send_sync_msg()
625 qmi->fw_version = resp->fw_version_info.fw_version; in ath10k_qmi_cap_send_sync_msg()
626 strscpy(qmi->fw_build_timestamp, resp->fw_version_info.fw_build_timestamp, in ath10k_qmi_cap_send_sync_msg()
627 sizeof(qmi->fw_build_timestamp)); in ath10k_qmi_cap_send_sync_msg()
631 strscpy(qmi->fw_build_id, resp->fw_build_id, in ath10k_qmi_cap_send_sync_msg()
635 ath10k_info(ar, "qmi chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x", in ath10k_qmi_cap_send_sync_msg()
636 qmi->chip_info.chip_id, qmi->chip_info.chip_family, in ath10k_qmi_cap_send_sync_msg()
637 qmi->board_info.board_id, qmi->soc_info.soc_id); in ath10k_qmi_cap_send_sync_msg()
638 ath10k_info(ar, "qmi fw_version 0x%x fw_build_timestamp %s fw_build_id %s", in ath10k_qmi_cap_send_sync_msg()
639 qmi->fw_version, qmi->fw_build_timestamp, qmi->fw_build_id); in ath10k_qmi_cap_send_sync_msg()
643 ath10k_qmi_add_wlan_ver_smem(ar, qmi->fw_build_id); in ath10k_qmi_cap_send_sync_msg()
653 static int ath10k_qmi_host_cap_send_sync(struct ath10k_qmi *qmi) in ath10k_qmi_host_cap_send_sync() argument
658 struct ath10k *ar = qmi->ar; in ath10k_qmi_host_cap_send_sync()
666 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_host_cap_resp_msg_v01_ei, in ath10k_qmi_host_cap_send_sync()
676 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_host_cap_send_sync()
698 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi host capability request completed\n"); in ath10k_qmi_host_cap_send_sync()
709 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_set_fw_log_mode() local
717 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, wlfw_ini_resp_msg_v01_ei, in ath10k_qmi_set_fw_log_mode()
722 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_set_fw_log_mode()
742 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi fw log request completed, mode: %d\n", in ath10k_qmi_set_fw_log_mode()
751 ath10k_qmi_ind_register_send_sync_msg(struct ath10k_qmi *qmi) in ath10k_qmi_ind_register_send_sync_msg() argument
755 struct ath10k *ar = qmi->ar; in ath10k_qmi_ind_register_send_sync_msg()
772 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_ind_register_send_sync_msg()
777 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_ind_register_send_sync_msg()
799 qmi->fw_ready = true; in ath10k_qmi_ind_register_send_sync_msg()
801 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi indication register request completed\n"); in ath10k_qmi_ind_register_send_sync_msg()
808 static void ath10k_qmi_event_server_arrive(struct ath10k_qmi *qmi) in ath10k_qmi_event_server_arrive() argument
810 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_server_arrive()
813 ret = ath10k_qmi_ind_register_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
817 if (qmi->fw_ready) { in ath10k_qmi_event_server_arrive()
822 ret = ath10k_qmi_host_cap_send_sync(qmi); in ath10k_qmi_event_server_arrive()
826 ret = ath10k_qmi_msa_mem_info_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
837 ret = ath10k_qmi_setup_msa_permissions(qmi); in ath10k_qmi_event_server_arrive()
841 ret = ath10k_qmi_msa_ready_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
845 ret = ath10k_qmi_cap_send_sync_msg(qmi); in ath10k_qmi_event_server_arrive()
852 ath10k_qmi_remove_msa_permission(qmi); in ath10k_qmi_event_server_arrive()
855 static int ath10k_qmi_fetch_board_file(struct ath10k_qmi *qmi) in ath10k_qmi_fetch_board_file() argument
857 struct ath10k *ar = qmi->ar; in ath10k_qmi_fetch_board_file()
862 ar->id.qmi_board_id = qmi->board_info.board_id; in ath10k_qmi_fetch_board_file()
863 ar->id.qmi_chip_id = qmi->chip_info.chip_id; in ath10k_qmi_fetch_board_file()
870 return ath10k_core_fetch_board_file(qmi->ar, ATH10K_BD_IE_BOARD); in ath10k_qmi_fetch_board_file()
874 ath10k_qmi_driver_event_post(struct ath10k_qmi *qmi, in ath10k_qmi_driver_event_post() argument
887 spin_lock(&qmi->event_lock); in ath10k_qmi_driver_event_post()
888 list_add_tail(&event->list, &qmi->event_list); in ath10k_qmi_driver_event_post()
889 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_post()
891 queue_work(qmi->event_wq, &qmi->event_work); in ath10k_qmi_driver_event_post()
896 static void ath10k_qmi_event_server_exit(struct ath10k_qmi *qmi) in ath10k_qmi_event_server_exit() argument
898 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_server_exit()
901 ath10k_qmi_remove_msa_permission(qmi); in ath10k_qmi_event_server_exit()
908 ath10k_dbg(ar, ATH10K_DBG_QMI, "wifi fw qmi service disconnected\n"); in ath10k_qmi_event_server_exit()
911 static void ath10k_qmi_event_msa_ready(struct ath10k_qmi *qmi) in ath10k_qmi_event_msa_ready() argument
915 ret = ath10k_qmi_fetch_board_file(qmi); in ath10k_qmi_event_msa_ready()
919 ret = ath10k_qmi_bdf_dnld_send_sync(qmi); in ath10k_qmi_event_msa_ready()
923 ret = ath10k_qmi_send_cal_report_req(qmi); in ath10k_qmi_event_msa_ready()
929 static int ath10k_qmi_event_fw_ready_ind(struct ath10k_qmi *qmi) in ath10k_qmi_event_fw_ready_ind() argument
931 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_fw_ready_ind()
943 struct ath10k_qmi *qmi = container_of(qmi_hdl, struct ath10k_qmi, qmi_hdl); in ath10k_qmi_fw_ready_ind() local
945 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_FW_READY_IND, NULL); in ath10k_qmi_fw_ready_ind()
952 struct ath10k_qmi *qmi = container_of(qmi_hdl, struct ath10k_qmi, qmi_hdl); in ath10k_qmi_msa_ready_ind() local
954 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_MSA_READY_IND, NULL); in ath10k_qmi_msa_ready_ind()
978 struct ath10k_qmi *qmi = container_of(qmi_hdl, struct ath10k_qmi, qmi_hdl); in ath10k_qmi_new_server() local
979 struct sockaddr_qrtr *sq = &qmi->sq; in ath10k_qmi_new_server()
980 struct ath10k *ar = qmi->ar; in ath10k_qmi_new_server()
987 ath10k_dbg(ar, ATH10K_DBG_QMI, "wifi fw qmi service found\n"); in ath10k_qmi_new_server()
989 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)&qmi->sq, in ath10k_qmi_new_server()
990 sizeof(qmi->sq), 0); in ath10k_qmi_new_server()
992 ath10k_err(ar, "failed to connect to a remote QMI service port\n"); in ath10k_qmi_new_server()
996 ath10k_dbg(ar, ATH10K_DBG_QMI, "qmi wifi fw qmi service connected\n"); in ath10k_qmi_new_server()
997 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_SERVER_ARRIVE, NULL); in ath10k_qmi_new_server()
1005 struct ath10k_qmi *qmi = in ath10k_qmi_del_server() local
1008 qmi->fw_ready = false; in ath10k_qmi_del_server()
1012 * the qmi server. The qmi infrastructure sends del_server, when in ath10k_qmi_del_server()
1013 * any client releases the qmi handle. In this case do not process in ath10k_qmi_del_server()
1016 if (qmi->state == ATH10K_QMI_STATE_INIT_DONE) in ath10k_qmi_del_server()
1017 ath10k_qmi_driver_event_post(qmi, ATH10K_QMI_EVENT_SERVER_EXIT, in ath10k_qmi_del_server()
1028 struct ath10k_qmi *qmi = container_of(work, struct ath10k_qmi, in ath10k_qmi_driver_event_work() local
1031 struct ath10k *ar = qmi->ar; in ath10k_qmi_driver_event_work()
1033 spin_lock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1034 while (!list_empty(&qmi->event_list)) { in ath10k_qmi_driver_event_work()
1035 event = list_first_entry(&qmi->event_list, in ath10k_qmi_driver_event_work()
1038 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1042 ath10k_qmi_event_server_arrive(qmi); in ath10k_qmi_driver_event_work()
1043 if (qmi->no_msa_ready_indicator) { in ath10k_qmi_driver_event_work()
1044 ath10k_info(ar, "qmi not waiting for msa_ready indicator"); in ath10k_qmi_driver_event_work()
1045 ath10k_qmi_event_msa_ready(qmi); in ath10k_qmi_driver_event_work()
1049 ath10k_qmi_event_server_exit(qmi); in ath10k_qmi_driver_event_work()
1052 ath10k_qmi_event_fw_ready_ind(qmi); in ath10k_qmi_driver_event_work()
1055 if (qmi->no_msa_ready_indicator) { in ath10k_qmi_driver_event_work()
1056 ath10k_warn(ar, "qmi unexpected msa_ready indicator"); in ath10k_qmi_driver_event_work()
1059 ath10k_qmi_event_msa_ready(qmi); in ath10k_qmi_driver_event_work()
1066 spin_lock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1068 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1075 struct ath10k_qmi *qmi; in ath10k_qmi_init() local
1078 qmi = kzalloc(sizeof(*qmi), GFP_KERNEL); in ath10k_qmi_init()
1079 if (!qmi) in ath10k_qmi_init()
1082 qmi->ar = ar; in ath10k_qmi_init()
1083 ar_snoc->qmi = qmi; in ath10k_qmi_init()
1086 qmi->msa_fixed_perm = true; in ath10k_qmi_init()
1089 qmi->no_msa_ready_indicator = true; in ath10k_qmi_init()
1091 ret = qmi_handle_init(&qmi->qmi_hdl, in ath10k_qmi_init()
1097 qmi->event_wq = alloc_ordered_workqueue("ath10k_qmi_driver_event", 0); in ath10k_qmi_init()
1098 if (!qmi->event_wq) { in ath10k_qmi_init()
1104 INIT_LIST_HEAD(&qmi->event_list); in ath10k_qmi_init()
1105 spin_lock_init(&qmi->event_lock); in ath10k_qmi_init()
1106 INIT_WORK(&qmi->event_work, ath10k_qmi_driver_event_work); in ath10k_qmi_init()
1108 ret = qmi_add_lookup(&qmi->qmi_hdl, WLFW_SERVICE_ID_V01, in ath10k_qmi_init()
1113 qmi->state = ATH10K_QMI_STATE_INIT_DONE; in ath10k_qmi_init()
1117 destroy_workqueue(qmi->event_wq); in ath10k_qmi_init()
1120 qmi_handle_release(&qmi->qmi_hdl); in ath10k_qmi_init()
1123 kfree(qmi); in ath10k_qmi_init()
1130 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_deinit() local
1132 qmi->state = ATH10K_QMI_STATE_DEINIT; in ath10k_qmi_deinit()
1133 qmi_handle_release(&qmi->qmi_hdl); in ath10k_qmi_deinit()
1134 cancel_work_sync(&qmi->event_work); in ath10k_qmi_deinit()
1135 destroy_workqueue(qmi->event_wq); in ath10k_qmi_deinit()
1136 kfree(qmi); in ath10k_qmi_deinit()
1137 ar_snoc->qmi = NULL; in ath10k_qmi_deinit()