Lines Matching full:qmi
9 #include "qmi.h"
2034 hw_id_base += partner_ab->qmi.num_radios; in ath12k_host_cap_hw_link_id_init()
2054 "MLO is disabled hence skip QMI MLO cap"); in ath12k_host_cap_parse_mlo()
2058 if (!ab->qmi.num_radios || ab->qmi.num_radios == U8_MAX) { in ath12k_host_cap_parse_mlo()
2062 "skip QMI MLO cap due to invalid num_radio %d\n", in ath12k_host_cap_parse_mlo()
2063 ab->qmi.num_radios); in ath12k_host_cap_parse_mlo()
2105 info->num_local_links = partner_ab->qmi.num_radios; in ath12k_host_cap_parse_mlo()
2167 req.mem_cfg_mode = ab->qmi.target_mem_mode; in ath12k_qmi_host_cap_send()
2178 req.cal_done = ab->qmi.cal_done; in ath12k_qmi_host_cap_send()
2207 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_host_cap_send()
2212 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_host_cap_send()
2244 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_phy_cap_send()
2249 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_phy_cap_send()
2277 ab->qmi.num_radios = resp.num_phy; in ath12k_qmi_phy_cap_send()
2289 ab->qmi.num_radios = ab->hw_params->def_num_link; in ath12k_qmi_phy_cap_send()
2293 ab->qmi.num_radios); in ath12k_qmi_phy_cap_send()
2300 struct qmi_handle *handle = &ab->qmi.handle; in ath12k_qmi_fw_ind_register_send()
2335 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_fw_ind_register_send()
2385 if (ab->qmi.target_mem_delayed) { in ath12k_qmi_respond_fw_mem_request()
2387 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi delays mem_request %d\n", in ath12k_qmi_respond_fw_mem_request()
2388 ab->qmi.mem_seg_count); in ath12k_qmi_respond_fw_mem_request()
2391 req->mem_seg_len = ab->qmi.mem_seg_count; in ath12k_qmi_respond_fw_mem_request()
2393 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr; in ath12k_qmi_respond_fw_mem_request()
2394 req->mem_seg[i].size = ab->qmi.target_mem[i].size; in ath12k_qmi_respond_fw_mem_request()
2395 req->mem_seg[i].type = ab->qmi.target_mem[i].type; in ath12k_qmi_respond_fw_mem_request()
2397 "qmi req mem_seg[%d] %pad %u %u\n", i, in ath12k_qmi_respond_fw_mem_request()
2398 &ab->qmi.target_mem[i].paddr, in ath12k_qmi_respond_fw_mem_request()
2399 ab->qmi.target_mem[i].size, in ath12k_qmi_respond_fw_mem_request()
2400 ab->qmi.target_mem[i].type); in ath12k_qmi_respond_fw_mem_request()
2404 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_respond_fw_mem_request()
2409 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_respond_fw_mem_request()
2415 ath12k_warn(ab, "qmi failed to respond memory request, err = %d\n", in ath12k_qmi_respond_fw_mem_request()
2422 ath12k_warn(ab, "qmi failed memory request, err = %d\n", ret); in ath12k_qmi_respond_fw_mem_request()
2481 for (i = 0, mlo_idx = 0; i < ab->qmi.mem_seg_count; i++) { in ath12k_qmi_free_target_mem_chunk()
2482 if (!ab->qmi.target_mem[i].v.addr) in ath12k_qmi_free_target_mem_chunk()
2485 if (ab->qmi.target_mem[i].type == MLO_GLOBAL_MEM_REGION_TYPE) { in ath12k_qmi_free_target_mem_chunk()
2487 &ab->qmi.target_mem[i], in ath12k_qmi_free_target_mem_chunk()
2491 ab->qmi.target_mem[i].prev_size, in ath12k_qmi_free_target_mem_chunk()
2492 ab->qmi.target_mem[i].v.addr, in ath12k_qmi_free_target_mem_chunk()
2493 ab->qmi.target_mem[i].paddr); in ath12k_qmi_free_target_mem_chunk()
2494 ab->qmi.target_mem[i].v.addr = NULL; in ath12k_qmi_free_target_mem_chunk()
2527 ab->qmi.target_mem_delayed = true; in ath12k_qmi_alloc_chunk()
2529 "qmi dma allocation failed (%d B type %u), will try later with small size\n", in ath12k_qmi_alloc_chunk()
2559 ab->qmi.target_mem_delayed = false; in ath12k_qmi_alloc_target_mem_chunk()
2561 for (i = 0, mlo_idx = 0; i < ab->qmi.mem_seg_count; i++) { in ath12k_qmi_alloc_target_mem_chunk()
2562 chunk = &ab->qmi.target_mem[i]; in ath12k_qmi_alloc_target_mem_chunk()
2581 …ath12k_err(ab, "QMI MLO memory allocation failure, requested size %d is more than allocated size %… in ath12k_qmi_alloc_target_mem_chunk()
2590 …ath12k_err(ab, "QMI MLO chunk memory allocation failure for index %d, requested size %d is more th… in ath12k_qmi_alloc_target_mem_chunk()
2621 ath12k_err(ab, "QMI MLO memory size error, expected size is %d but requested size is %d", in ath12k_qmi_alloc_target_mem_chunk()
2659 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_request_target_cap()
2664 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_request_target_cap()
2670 ath12k_warn(ab, "qmi failed to send target cap request, err = %d\n", in ath12k_qmi_request_target_cap()
2677 ath12k_warn(ab, "qmi failed target cap request %d\n", ret); in ath12k_qmi_request_target_cap()
2682 ath12k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n", in ath12k_qmi_request_target_cap()
2689 ab->qmi.target.chip_id = resp.chip_info.chip_id; in ath12k_qmi_request_target_cap()
2690 ab->qmi.target.chip_family = resp.chip_info.chip_family; in ath12k_qmi_request_target_cap()
2694 ab->qmi.target.board_id = resp.board_info.board_id; in ath12k_qmi_request_target_cap()
2696 ab->qmi.target.board_id = board_id; in ath12k_qmi_request_target_cap()
2699 ab->qmi.target.soc_id = resp.soc_info.soc_id; in ath12k_qmi_request_target_cap()
2702 ab->qmi.target.fw_version = resp.fw_version_info.fw_version; in ath12k_qmi_request_target_cap()
2703 strscpy(ab->qmi.target.fw_build_timestamp, in ath12k_qmi_request_target_cap()
2705 sizeof(ab->qmi.target.fw_build_timestamp)); in ath12k_qmi_request_target_cap()
2709 strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id, in ath12k_qmi_request_target_cap()
2710 sizeof(ab->qmi.target.fw_build_id)); in ath12k_qmi_request_target_cap()
2714 ab->qmi.dev_mem[i].start = in ath12k_qmi_request_target_cap()
2716 ab->qmi.dev_mem[i].size = in ath12k_qmi_request_target_cap()
2720 ab->qmi.dev_mem[i].start, in ath12k_qmi_request_target_cap()
2721 ab->qmi.dev_mem[i].size); in ath12k_qmi_request_target_cap()
2726 ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout; in ath12k_qmi_request_target_cap()
2727 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n"); in ath12k_qmi_request_target_cap()
2731 ab->qmi.target.chip_id, ab->qmi.target.chip_family, in ath12k_qmi_request_target_cap()
2732 ab->qmi.target.board_id, ab->qmi.target.soc_id); in ath12k_qmi_request_target_cap()
2735 ab->qmi.target.fw_version, in ath12k_qmi_request_target_cap()
2736 ab->qmi.target.fw_build_timestamp, in ath12k_qmi_request_target_cap()
2737 ab->qmi.target.fw_build_id); in ath12k_qmi_request_target_cap()
2764 req->file_id = ab->qmi.target.board_id; in ath12k_qmi_load_file_target_mem()
2789 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_load_file_target_mem()
2795 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf download req fixed addr type %d\n", in ath12k_qmi_load_file_target_mem()
2798 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_load_file_target_mem()
2812 ath12k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n", in ath12k_qmi_load_file_target_mem()
2825 "qmi bdf download request remaining %i\n", in ath12k_qmi_load_file_target_mem()
2854 ath12k_warn(ab, "qmi failed to load bdf:\n"); in ath12k_qmi_load_bdf_qmi()
2867 ath12k_warn(ab, "qmi failed to load regdb bin:\n"); in ath12k_qmi_load_bdf_qmi()
2873 if (ab->qmi.target.eeprom_caldata) { in ath12k_qmi_load_bdf_qmi()
2892 "qmi failed to load CAL data file:%s\n", in ath12k_qmi_load_bdf_qmi()
2904 ath12k_warn(ab, "qmi failed to load caldata\n"); in ath12k_qmi_load_bdf_qmi()
2908 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi caldata downloaded: type: %u\n", in ath12k_qmi_load_bdf_qmi()
2912 if (!ab->qmi.target.eeprom_caldata) in ath12k_qmi_load_bdf_qmi()
2920 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf_type %d\n", type); in ath12k_qmi_load_bdf_qmi()
2926 ath12k_warn(ab, "qmi failed to load bdf file\n"); in ath12k_qmi_load_bdf_qmi()
2930 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi BDF download sequence completed\n"); in ath12k_qmi_load_bdf_qmi()
2937 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; in ath12k_qmi_m3_free()
2950 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; in ath12k_qmi_m3_load()
3013 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; in ath12k_qmi_wlanfw_m3_info_send()
3028 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_wlanfw_m3_info_send()
3033 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_wlanfw_m3_info_send()
3039 ath12k_warn(ab, "qmi failed to send M3 information request, err = %d\n", in ath12k_qmi_wlanfw_m3_info_send()
3046 ath12k_warn(ab, "qmi failed M3 information request %d\n", ret); in ath12k_qmi_wlanfw_m3_info_send()
3051 ath12k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n", in ath12k_qmi_wlanfw_m3_info_send()
3072 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_wlanfw_mode_send()
3077 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_wlanfw_mode_send()
3083 ath12k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n", in ath12k_qmi_wlanfw_mode_send()
3094 ath12k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n", in ath12k_qmi_wlanfw_mode_send()
3119 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce; in ath12k_qmi_wlanfw_wlan_cfg_send()
3120 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map; in ath12k_qmi_wlanfw_wlan_cfg_send()
3132 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len; in ath12k_qmi_wlanfw_wlan_cfg_send()
3143 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len; in ath12k_qmi_wlanfw_wlan_cfg_send()
3154 ab->qmi.ce_cfg.shadow_reg_v3_len, in ath12k_qmi_wlanfw_wlan_cfg_send()
3156 memcpy(&req->shadow_reg_v3, ab->qmi.ce_cfg.shadow_reg_v3, in ath12k_qmi_wlanfw_wlan_cfg_send()
3162 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_wlanfw_wlan_cfg_send()
3167 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_wlanfw_wlan_cfg_send()
3173 ath12k_warn(ab, "qmi failed to send wlan config request, err = %d\n", in ath12k_qmi_wlanfw_wlan_cfg_send()
3180 ath12k_warn(ab, "qmi failed wlan config request, err = %d\n", ret); in ath12k_qmi_wlanfw_wlan_cfg_send()
3185 ath12k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n", in ath12k_qmi_wlanfw_wlan_cfg_send()
3206 ret = qmi_txn_init(&ab->qmi.handle, &txn, in ath12k_qmi_wlanfw_wlan_ini_send()
3211 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, in ath12k_qmi_wlanfw_wlan_ini_send()
3217 ath12k_warn(ab, "failed to send QMI wlan ini request: %d\n", in ath12k_qmi_wlanfw_wlan_ini_send()
3224 ath12k_warn(ab, "failed to receive QMI wlan ini request: %d\n", ret); in ath12k_qmi_wlanfw_wlan_ini_send()
3229 ath12k_warn(ab, "QMI wlan ini response failure: %d %d\n", in ath12k_qmi_wlanfw_wlan_ini_send()
3247 ath12k_warn(ab, "qmi failed to send wlan mode off\n"); in ath12k_qmi_firmware_stop()
3259 ath12k_warn(ab, "qmi failed to send wlan fw ini: %d\n", ret); in ath12k_qmi_firmware_start()
3265 ath12k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret); in ath12k_qmi_firmware_start()
3271 ath12k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret); in ath12k_qmi_firmware_start()
3279 ath12k_qmi_driver_event_post(struct ath12k_qmi *qmi, in ath12k_qmi_driver_event_post() argument
3292 spin_lock(&qmi->event_lock); in ath12k_qmi_driver_event_post()
3293 list_add_tail(&event->list, &qmi->event_list); in ath12k_qmi_driver_event_post()
3294 spin_unlock(&qmi->event_lock); in ath12k_qmi_driver_event_post()
3296 queue_work(qmi->event_wq, &qmi->event_work); in ath12k_qmi_driver_event_post()
3303 struct ath12k_qmi *qmi = &ab->qmi; in ath12k_qmi_trigger_host_cap() local
3305 spin_lock(&qmi->event_lock); in ath12k_qmi_trigger_host_cap()
3307 if (ath12k_qmi_get_event_block(qmi)) in ath12k_qmi_trigger_host_cap()
3308 ath12k_qmi_set_event_block(qmi, false); in ath12k_qmi_trigger_host_cap()
3310 spin_unlock(&qmi->event_lock); in ath12k_qmi_trigger_host_cap()
3315 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_HOST_CAP, NULL); in ath12k_qmi_trigger_host_cap()
3326 if (!(ab && ab->qmi.num_radios != U8_MAX)) in ath12k_qmi_hw_group_host_cap_ready()
3345 spin_lock(&ab->qmi.event_lock); in ath12k_qmi_hw_group_find_blocked()
3347 if (ath12k_qmi_get_event_block(&ab->qmi)) { in ath12k_qmi_hw_group_find_blocked()
3348 spin_unlock(&ab->qmi.event_lock); in ath12k_qmi_hw_group_find_blocked()
3352 spin_unlock(&ab->qmi.event_lock); in ath12k_qmi_hw_group_find_blocked()
3360 int ath12k_qmi_event_server_arrive(struct ath12k_qmi *qmi) in ath12k_qmi_event_server_arrive() argument
3362 struct ath12k_base *ab = qmi->ab, *block_ab; in ath12k_qmi_event_server_arrive()
3370 ath12k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret); in ath12k_qmi_event_server_arrive()
3374 spin_lock(&qmi->event_lock); in ath12k_qmi_event_server_arrive()
3376 ath12k_qmi_set_event_block(qmi, true); in ath12k_qmi_event_server_arrive()
3378 spin_unlock(&qmi->event_lock); in ath12k_qmi_event_server_arrive()
3397 int ath12k_qmi_event_mem_request(struct ath12k_qmi *qmi) in ath12k_qmi_event_mem_request() argument
3399 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_event_mem_request()
3404 ath12k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret); in ath12k_qmi_event_mem_request()
3413 int ath12k_qmi_event_load_bdf(struct ath12k_qmi *qmi) in ath12k_qmi_event_load_bdf() argument
3415 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_event_load_bdf()
3420 ath12k_warn(ab, "qmi failed to req target capabilities:%d\n", ret); in ath12k_qmi_event_load_bdf()
3426 ath12k_warn(ab, "qmi failed to load regdb file:%d\n", ret); in ath12k_qmi_event_load_bdf()
3432 ath12k_warn(ab, "qmi failed to load board data file:%d\n", ret); in ath12k_qmi_event_load_bdf()
3439 ath12k_warn(ab, "qmi failed to load calibrated data :%d\n", ret); in ath12k_qmi_event_load_bdf()
3444 ath12k_warn(ab, "qmi failed to send m3 info req:%d\n", ret); in ath12k_qmi_event_load_bdf()
3456 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); in ath12k_qmi_msg_mem_request_cb() local
3457 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_msg_mem_request_cb()
3461 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware request memory request\n"); in ath12k_qmi_msg_mem_request_cb()
3468 ab->qmi.mem_seg_count = msg->mem_seg_len; in ath12k_qmi_msg_mem_request_cb()
3470 for (i = 0; i < qmi->mem_seg_count ; i++) { in ath12k_qmi_msg_mem_request_cb()
3471 ab->qmi.target_mem[i].type = msg->mem_seg[i].type; in ath12k_qmi_msg_mem_request_cb()
3472 ab->qmi.target_mem[i].size = msg->mem_seg[i].size; in ath12k_qmi_msg_mem_request_cb()
3473 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi mem seg type %d size %d\n", in ath12k_qmi_msg_mem_request_cb()
3479 ath12k_warn(ab, "qmi failed to alloc target memory: %d\n", in ath12k_qmi_msg_mem_request_cb()
3484 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_REQUEST_MEM, NULL); in ath12k_qmi_msg_mem_request_cb()
3492 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); in ath12k_qmi_msg_mem_ready_cb() local
3493 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_msg_mem_ready_cb()
3495 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware memory ready indication\n"); in ath12k_qmi_msg_mem_ready_cb()
3496 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_MEM_READY, NULL); in ath12k_qmi_msg_mem_ready_cb()
3504 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); in ath12k_qmi_msg_fw_ready_cb() local
3505 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_msg_fw_ready_cb()
3507 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware ready\n"); in ath12k_qmi_msg_fw_ready_cb()
3508 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_READY, NULL); in ath12k_qmi_msg_fw_ready_cb()
3541 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); in ath12k_qmi_ops_new_server() local
3542 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_ops_new_server()
3543 struct sockaddr_qrtr *sq = &qmi->sq; in ath12k_qmi_ops_new_server()
3553 ath12k_warn(ab, "qmi failed to connect to remote service %d\n", ret); in ath12k_qmi_ops_new_server()
3557 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw qmi service connected\n"); in ath12k_qmi_ops_new_server()
3558 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_ARRIVE, NULL); in ath12k_qmi_ops_new_server()
3566 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); in ath12k_qmi_ops_del_server() local
3567 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_ops_del_server()
3569 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw del server\n"); in ath12k_qmi_ops_del_server()
3570 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_EXIT, NULL); in ath12k_qmi_ops_del_server()
3578 static int ath12k_qmi_event_host_cap(struct ath12k_qmi *qmi) in ath12k_qmi_event_host_cap() argument
3580 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_event_host_cap()
3585 ath12k_warn(ab, "failed to send qmi host cap for device id %d: %d\n", in ath12k_qmi_event_host_cap()
3595 struct ath12k_qmi *qmi = container_of(work, struct ath12k_qmi, in ath12k_qmi_driver_event_work() local
3598 struct ath12k_base *ab = qmi->ab; in ath12k_qmi_driver_event_work()
3601 spin_lock(&qmi->event_lock); in ath12k_qmi_driver_event_work()
3602 while (!list_empty(&qmi->event_list)) { in ath12k_qmi_driver_event_work()
3603 event = list_first_entry(&qmi->event_list, in ath12k_qmi_driver_event_work()
3606 spin_unlock(&qmi->event_lock); in ath12k_qmi_driver_event_work()
3613 ret = ath12k_qmi_event_server_arrive(qmi); in ath12k_qmi_driver_event_work()
3621 ret = ath12k_qmi_event_mem_request(qmi); in ath12k_qmi_driver_event_work()
3626 ret = ath12k_qmi_event_load_bdf(qmi); in ath12k_qmi_driver_event_work()
3650 ret = ath12k_qmi_event_host_cap(qmi); in ath12k_qmi_driver_event_work()
3661 spin_lock(&qmi->event_lock); in ath12k_qmi_driver_event_work()
3663 spin_unlock(&qmi->event_lock); in ath12k_qmi_driver_event_work()
3670 memset(&ab->qmi.target, 0, sizeof(struct target_info)); in ath12k_qmi_init_service()
3671 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk)); in ath12k_qmi_init_service()
3672 ab->qmi.ab = ab; in ath12k_qmi_init_service()
3674 ab->qmi.target_mem_mode = ATH12K_QMI_TARGET_MEM_MODE_DEFAULT; in ath12k_qmi_init_service()
3675 ret = qmi_handle_init(&ab->qmi.handle, ATH12K_QMI_RESP_LEN_MAX, in ath12k_qmi_init_service()
3678 ath12k_warn(ab, "failed to initialize qmi handle\n"); in ath12k_qmi_init_service()
3682 ab->qmi.event_wq = alloc_ordered_workqueue("ath12k_qmi_driver_event", 0); in ath12k_qmi_init_service()
3683 if (!ab->qmi.event_wq) { in ath12k_qmi_init_service()
3688 INIT_LIST_HEAD(&ab->qmi.event_list); in ath12k_qmi_init_service()
3689 spin_lock_init(&ab->qmi.event_lock); in ath12k_qmi_init_service()
3690 INIT_WORK(&ab->qmi.event_work, ath12k_qmi_driver_event_work); in ath12k_qmi_init_service()
3692 ret = qmi_add_lookup(&ab->qmi.handle, ATH12K_QMI_WLFW_SERVICE_ID_V01, in ath12k_qmi_init_service()
3694 ab->qmi.service_ins_id); in ath12k_qmi_init_service()
3696 ath12k_warn(ab, "failed to add qmi lookup\n"); in ath12k_qmi_init_service()
3697 destroy_workqueue(ab->qmi.event_wq); in ath12k_qmi_init_service()
3706 if (!ab->qmi.ab) in ath12k_qmi_deinit_service()
3709 qmi_handle_release(&ab->qmi.handle); in ath12k_qmi_deinit_service()
3710 cancel_work_sync(&ab->qmi.event_work); in ath12k_qmi_deinit_service()
3711 destroy_workqueue(ab->qmi.event_wq); in ath12k_qmi_deinit_service()
3714 ab->qmi.ab = NULL; in ath12k_qmi_deinit_service()