Lines Matching +full:ath10k +full:- +full:calibration +full:- +full:data
1 // SPDX-License-Identifier: ISC
4 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
36 struct ath10k *ar = qmi->ar; in ath10k_qmi_map_msa_permission()
48 if (mem_info->secure) { in ath10k_qmi_map_msa_permission()
56 ret = qcom_scm_assign_mem(mem_info->addr, mem_info->size, in ath10k_qmi_map_msa_permission()
68 struct ath10k *ar = qmi->ar; in ath10k_qmi_unmap_msa_permission()
74 if (!mem_info->secure) in ath10k_qmi_unmap_msa_permission()
80 ret = qcom_scm_assign_mem(mem_info->addr, mem_info->size, in ath10k_qmi_unmap_msa_permission()
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()
105 for (i--; i >= 0; i--) in ath10k_qmi_setup_msa_permissions()
106 ath10k_qmi_unmap_msa_permission(qmi, &qmi->mem_region[i]); in ath10k_qmi_setup_msa_permissions()
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()
125 struct ath10k *ar = qmi->ar; in ath10k_qmi_msa_mem_info_send_sync_msg()
131 req.msa_addr = ar->msa.paddr; in ath10k_qmi_msa_mem_info_send_sync_msg()
132 req.size = ar->msa.mem_size; 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()
155 ret = -EINVAL; in ath10k_qmi_msa_mem_info_send_sync_msg()
162 ret = -EINVAL; in ath10k_qmi_msa_mem_info_send_sync_msg()
166 max_mapped_addr = ar->msa.paddr + ar->msa.mem_size; 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()
169 if (resp.mem_region_info[i].size > ar->msa.mem_size || in ath10k_qmi_msa_mem_info_send_sync_msg()
171 resp.mem_region_info[i].region_addr < ar->msa.paddr || in ath10k_qmi_msa_mem_info_send_sync_msg()
177 ret = -EINVAL; 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()
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()
194 memset(&qmi->mem_region[0], 0, sizeof(qmi->mem_region[0]) * i); in ath10k_qmi_msa_mem_info_send_sync_msg()
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()
228 ret = -EINVAL; in ath10k_qmi_msa_ready_send_sync_msg()
242 struct ath10k *ar = qmi->ar; in ath10k_qmi_bdf_dnld_send_sync()
250 return -ENOMEM; in ath10k_qmi_bdf_dnld_send_sync()
252 temp = ar->normal_mode_fw.board_data; in ath10k_qmi_bdf_dnld_send_sync()
253 remaining = ar->normal_mode_fw.board_len; in ath10k_qmi_bdf_dnld_send_sync()
256 req->valid = 1; in ath10k_qmi_bdf_dnld_send_sync()
257 req->file_id_valid = 1; in ath10k_qmi_bdf_dnld_send_sync()
258 req->file_id = 0; in ath10k_qmi_bdf_dnld_send_sync()
259 req->total_size_valid = 1; in ath10k_qmi_bdf_dnld_send_sync()
260 req->total_size = ar->normal_mode_fw.board_len; in ath10k_qmi_bdf_dnld_send_sync()
261 req->seg_id_valid = 1; in ath10k_qmi_bdf_dnld_send_sync()
262 req->data_valid = 1; in ath10k_qmi_bdf_dnld_send_sync()
263 req->end_valid = 1; in ath10k_qmi_bdf_dnld_send_sync()
266 req->data_len = QMI_WLFW_MAX_DATA_SIZE_V01; in ath10k_qmi_bdf_dnld_send_sync()
268 req->data_len = remaining; in ath10k_qmi_bdf_dnld_send_sync()
269 req->end = 1; in ath10k_qmi_bdf_dnld_send_sync()
272 memcpy(req->data, temp, req->data_len); 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()
298 * scenario and treat it as non-fatal. in ath10k_qmi_bdf_dnld_send_sync()
301 !(req->end == 1 && in ath10k_qmi_bdf_dnld_send_sync()
303 ath10k_err(ar, "failed to download board data file: %d\n", in ath10k_qmi_bdf_dnld_send_sync()
305 ret = -EINVAL; in ath10k_qmi_bdf_dnld_send_sync()
309 remaining -= req->data_len; in ath10k_qmi_bdf_dnld_send_sync()
310 temp += req->data_len; in ath10k_qmi_bdf_dnld_send_sync()
311 req->seg_id++; in ath10k_qmi_bdf_dnld_send_sync()
328 struct ath10k *ar = qmi->ar; in ath10k_qmi_send_cal_report_req()
334 if (ar_snoc->xo_cal_supported) { in ath10k_qmi_send_cal_report_req()
336 req.xo_cal_data = ar_snoc->xo_cal_data; 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()
359 ath10k_err(ar, "failed to send calibration request: %d\n", ret); in ath10k_qmi_send_cal_report_req()
368 ath10k_err(ar, "calibration request rejected: %d\n", resp.resp.error); in ath10k_qmi_send_cal_report_req()
369 ret = -EINVAL; in ath10k_qmi_send_cal_report_req()
381 ath10k_qmi_mode_send_sync_msg(struct ath10k *ar, enum wlfw_driver_mode_enum_v01 mode) in ath10k_qmi_mode_send_sync_msg()
384 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_mode_send_sync_msg()
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()
416 ret = -EINVAL; in ath10k_qmi_mode_send_sync_msg()
428 ath10k_qmi_cfg_send_sync_msg(struct ath10k *ar, in ath10k_qmi_cfg_send_sync_msg()
433 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_cfg_send_sync_msg()
442 return -ENOMEM; in ath10k_qmi_cfg_send_sync_msg()
444 ret = qmi_txn_init(&qmi->qmi_hdl, &txn, in ath10k_qmi_cfg_send_sync_msg()
450 req->host_version_valid = 0; in ath10k_qmi_cfg_send_sync_msg()
452 req->tgt_cfg_valid = 1; in ath10k_qmi_cfg_send_sync_msg()
453 if (config->num_ce_tgt_cfg > QMI_WLFW_MAX_NUM_CE_V01) in ath10k_qmi_cfg_send_sync_msg()
454 req->tgt_cfg_len = QMI_WLFW_MAX_NUM_CE_V01; in ath10k_qmi_cfg_send_sync_msg()
456 req->tgt_cfg_len = config->num_ce_tgt_cfg; in ath10k_qmi_cfg_send_sync_msg()
457 for (i = 0; i < req->tgt_cfg_len; i++) { in ath10k_qmi_cfg_send_sync_msg()
458 req->tgt_cfg[i].pipe_num = config->ce_tgt_cfg[i].pipe_num; in ath10k_qmi_cfg_send_sync_msg()
459 req->tgt_cfg[i].pipe_dir = config->ce_tgt_cfg[i].pipe_dir; in ath10k_qmi_cfg_send_sync_msg()
460 req->tgt_cfg[i].nentries = config->ce_tgt_cfg[i].nentries; in ath10k_qmi_cfg_send_sync_msg()
461 req->tgt_cfg[i].nbytes_max = config->ce_tgt_cfg[i].nbytes_max; in ath10k_qmi_cfg_send_sync_msg()
462 req->tgt_cfg[i].flags = config->ce_tgt_cfg[i].flags; in ath10k_qmi_cfg_send_sync_msg()
465 req->svc_cfg_valid = 1; in ath10k_qmi_cfg_send_sync_msg()
466 if (config->num_ce_svc_pipe_cfg > QMI_WLFW_MAX_NUM_SVC_V01) in ath10k_qmi_cfg_send_sync_msg()
467 req->svc_cfg_len = QMI_WLFW_MAX_NUM_SVC_V01; in ath10k_qmi_cfg_send_sync_msg()
469 req->svc_cfg_len = config->num_ce_svc_pipe_cfg; in ath10k_qmi_cfg_send_sync_msg()
470 for (i = 0; i < req->svc_cfg_len; i++) { in ath10k_qmi_cfg_send_sync_msg()
471 req->svc_cfg[i].service_id = config->ce_svc_cfg[i].service_id; in ath10k_qmi_cfg_send_sync_msg()
472 req->svc_cfg[i].pipe_dir = config->ce_svc_cfg[i].pipe_dir; in ath10k_qmi_cfg_send_sync_msg()
473 req->svc_cfg[i].pipe_num = config->ce_svc_cfg[i].pipe_num; in ath10k_qmi_cfg_send_sync_msg()
476 req->shadow_reg_valid = 1; in ath10k_qmi_cfg_send_sync_msg()
477 if (config->num_shadow_reg_cfg > in ath10k_qmi_cfg_send_sync_msg()
479 req->shadow_reg_len = QMI_WLFW_MAX_NUM_SHADOW_REG_V01; in ath10k_qmi_cfg_send_sync_msg()
481 req->shadow_reg_len = config->num_shadow_reg_cfg; in ath10k_qmi_cfg_send_sync_msg()
483 memcpy(req->shadow_reg, config->shadow_reg_cfg, in ath10k_qmi_cfg_send_sync_msg()
484 sizeof(struct wlfw_shadow_reg_cfg_s_v01) * req->shadow_reg_len); in ath10k_qmi_cfg_send_sync_msg()
486 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_cfg_send_sync_msg()
502 ret = -EINVAL; in ath10k_qmi_cfg_send_sync_msg()
515 int ath10k_qmi_wlan_enable(struct ath10k *ar, in ath10k_qmi_wlan_enable()
540 int ath10k_qmi_wlan_disable(struct ath10k *ar) in ath10k_qmi_wlan_disable()
545 static void ath10k_qmi_add_wlan_ver_smem(struct ath10k *ar, const char *fw_build_id) in ath10k_qmi_add_wlan_ver_smem()
576 struct ath10k *ar = qmi->ar; in ath10k_qmi_cap_send_sync_msg()
583 return -ENOMEM; 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()
603 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { in ath10k_qmi_cap_send_sync_msg()
604 ath10k_err(ar, "capability req rejected: %d\n", resp->resp.error); in ath10k_qmi_cap_send_sync_msg()
605 ret = -EINVAL; in ath10k_qmi_cap_send_sync_msg()
609 if (resp->chip_info_valid) { 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()
616 if (resp->board_info_valid) 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()
621 if (resp->soc_info_valid) 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()
624 if (resp->fw_version_info_valid) { 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()
630 if (resp->fw_build_id_valid) in ath10k_qmi_cap_send_sync_msg()
631 strscpy(qmi->fw_build_id, resp->fw_build_id, in ath10k_qmi_cap_send_sync_msg()
634 if (!test_bit(ATH10K_SNOC_FLAG_REGISTERED, &ar_snoc->flags)) { 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()
639 qmi->fw_version, qmi->fw_build_timestamp, qmi->fw_build_id); in ath10k_qmi_cap_send_sync_msg()
642 if (resp->fw_build_id_valid) 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()
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()
671 if (test_bit(ATH10K_SNOC_FLAG_8BIT_HOST_CAP_QUIRK, &ar_snoc->flags)) in ath10k_qmi_host_cap_send_sync()
676 ret = qmi_send_request(&qmi->qmi_hdl, NULL, &txn, in ath10k_qmi_host_cap_send_sync()
694 ret = -EINVAL; in ath10k_qmi_host_cap_send_sync()
705 int ath10k_qmi_set_fw_log_mode(struct ath10k *ar, u8 fw_log_mode) in ath10k_qmi_set_fw_log_mode()
709 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_set_fw_log_mode()
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()
739 ret = -EINVAL; in ath10k_qmi_set_fw_log_mode()
755 struct ath10k *ar = qmi->ar; in ath10k_qmi_ind_register_send_sync_msg()
767 if (ar_snoc->xo_cal_supported) { 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()
793 ret = -EINVAL; in ath10k_qmi_ind_register_send_sync_msg()
799 qmi->fw_ready = true; in ath10k_qmi_ind_register_send_sync_msg()
810 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_server_arrive()
817 if (qmi->fw_ready) { in ath10k_qmi_event_server_arrive()
833 * violation, when running MPSS.AT.4.0.c2-01184-SDM845_GEN_PACK-1. in ath10k_qmi_event_server_arrive()
857 struct ath10k *ar = qmi->ar; in ath10k_qmi_fetch_board_file()
860 ar->hif.bus = ATH10K_BUS_SNOC; in ath10k_qmi_fetch_board_file()
861 ar->id.qmi_ids_valid = true; 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()
864 ar->hw_params.fw.dir = WCN3990_HW_1_0_FW_DIR; 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()
876 void *data) in ath10k_qmi_driver_event_post() argument
882 return -ENOMEM; in ath10k_qmi_driver_event_post()
884 event->type = type; in ath10k_qmi_driver_event_post()
885 event->data = data; in ath10k_qmi_driver_event_post()
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()
898 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_server_exit()
903 if (!test_bit(ATH10K_SNOC_FLAG_UNREGISTERING, &ar_snoc->flags) && in ath10k_qmi_event_server_exit()
904 !test_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags)) in ath10k_qmi_event_server_exit()
931 struct ath10k *ar = qmi->ar; in ath10k_qmi_event_fw_ready_ind()
941 struct qmi_txn *txn, const void *data) in ath10k_qmi_fw_ready_ind() argument
950 struct qmi_txn *txn, const void *data) in ath10k_qmi_msa_ready_ind() argument
979 struct sockaddr_qrtr *sq = &qmi->sq; in ath10k_qmi_new_server()
980 struct ath10k *ar = qmi->ar; in ath10k_qmi_new_server()
983 sq->sq_family = AF_QIPCRTR; in ath10k_qmi_new_server()
984 sq->sq_node = service->node; in ath10k_qmi_new_server()
985 sq->sq_port = service->port; 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()
1008 qmi->fw_ready = false; in ath10k_qmi_del_server()
1016 if (qmi->state == ATH10K_QMI_STATE_INIT_DONE) in ath10k_qmi_del_server()
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()
1037 list_del(&event->list); in ath10k_qmi_driver_event_work()
1038 spin_unlock(&qmi->event_lock); in ath10k_qmi_driver_event_work()
1040 switch (event->type) { in ath10k_qmi_driver_event_work()
1043 if (qmi->no_msa_ready_indicator) { in ath10k_qmi_driver_event_work()
1055 if (qmi->no_msa_ready_indicator) { in ath10k_qmi_driver_event_work()
1062 ath10k_warn(ar, "invalid event type: %d", event->type); 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()
1071 int ath10k_qmi_init(struct ath10k *ar, u32 msa_size) in ath10k_qmi_init()
1074 struct device *dev = ar->dev; in ath10k_qmi_init()
1080 return -ENOMEM; in ath10k_qmi_init()
1082 qmi->ar = ar; in ath10k_qmi_init()
1083 ar_snoc->qmi = qmi; in ath10k_qmi_init()
1085 if (of_property_read_bool(dev->of_node, "qcom,msa-fixed-perm")) in ath10k_qmi_init()
1086 qmi->msa_fixed_perm = true; in ath10k_qmi_init()
1088 if (of_property_read_bool(dev->of_node, "qcom,no-msa-ready-indicator")) 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()
1100 ret = -EFAULT; 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()
1127 int ath10k_qmi_deinit(struct ath10k *ar) in ath10k_qmi_deinit()
1130 struct ath10k_qmi *qmi = ar_snoc->qmi; in ath10k_qmi_deinit()
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()
1137 ar_snoc->qmi = NULL; in ath10k_qmi_deinit()