/* sending filter-install-request to modem*/ int qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) { struct ipa_install_fltr_rule_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc; /* check if the filter rules from IPACM is valid */ if (req->filter_spec_list_len == 0) { IPAWANDBG("IPACM pass zero rules to Q6\n"); } else { IPAWANDBG("IPACM pass %d rules to Q6\n", req->filter_spec_list_len); } req_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_REQ_V01; req_desc.ei_array = ipa_install_fltr_rule_req_msg_data_v01_ei; memset(&resp, 0, sizeof(struct ipa_install_fltr_rule_resp_msg_v01)); resp_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_RESP_V01; resp_desc.ei_array = ipa_install_fltr_rule_resp_msg_data_v01_ei; rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req, sizeof(struct ipa_install_fltr_rule_req_msg_v01), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); return ipa_check_qmi_response(rc, QMI_IPA_INSTALL_FILTER_RULE_REQ_V01, resp.resp.result, resp.resp.error, "ipa_install_filter"); }
/* sending filter-installed-notify-request to modem*/ int qmi_filter_notify_send(struct ipa_fltr_installed_notif_req_msg_v01 *req) { struct ipa_fltr_installed_notif_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc = 0, i = 0; /* check if the filter rules from IPACM is valid */ if (req->filter_index_list_len == 0) { IPAWANERR(" delete UL filter rule for pipe %d\n", req->source_pipe_index); return -EINVAL; } else if (req->filter_index_list[0].filter_index == 0 && req->source_pipe_index != ipa_get_ep_mapping(IPA_CLIENT_APPS_LAN_WAN_PROD)) { IPAWANERR(" get index wrong for pipe %d\n", req->source_pipe_index); for (i = 0; i < req->filter_index_list_len; i++) IPAWANERR(" %d-st handle %d index %d\n", i, req->filter_index_list[i].filter_handle, req->filter_index_list[i].filter_index); return -EINVAL; } mutex_lock(&ipa_qmi_lock); if (ipa_qmi_ctx != NULL) { /* cache the qmi_filter_request */ memcpy(&(ipa_qmi_ctx->ipa_fltr_installed_notif_req_msg_cache[ ipa_qmi_ctx->num_ipa_fltr_installed_notif_req_msg]), req, sizeof(struct ipa_fltr_installed_notif_req_msg_v01)); ipa_qmi_ctx->num_ipa_fltr_installed_notif_req_msg++; ipa_qmi_ctx->num_ipa_fltr_installed_notif_req_msg %= 10; } mutex_unlock(&ipa_qmi_lock); req_desc.max_msg_len = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01; req_desc.ei_array = ipa_fltr_installed_notif_req_msg_data_v01_ei; memset(&resp, 0, sizeof(struct ipa_fltr_installed_notif_resp_msg_v01)); resp_desc.max_msg_len = QMI_IPA_FILTER_INSTALLED_NOTIF_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_FILTER_INSTALLED_NOTIF_RESP_V01; resp_desc.ei_array = ipa_fltr_installed_notif_resp_msg_data_v01_ei; rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, req, sizeof(struct ipa_fltr_installed_notif_req_msg_v01), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); return ipa_check_qmi_response(rc, QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_V01, resp.resp.result, resp.resp.error, "ipa_fltr_installed_notif_resp"); }
static int qmi_init_modem_send_sync_msg(void) { struct ipa_init_modem_driver_req_msg_v01 req; struct ipa_init_modem_driver_resp_msg_v01 resp; struct msg_desc req_desc, resp_desc; int rc; u16 smem_restr_bytes = ipa_get_smem_restr_bytes(); memset(&req, 0, sizeof(struct ipa_init_modem_driver_req_msg_v01)); memset(&resp, 0, sizeof(struct ipa_init_modem_driver_resp_msg_v01)); req.platform_type_valid = true; req.platform_type = ipa_wan_platform; req.hdr_tbl_info_valid = true; req.hdr_tbl_info.modem_offset_start = IPA_MEM_PART(modem_hdr_ofst) + smem_restr_bytes; req.hdr_tbl_info.modem_offset_end = IPA_MEM_PART(modem_hdr_ofst) + smem_restr_bytes + IPA_MEM_PART(modem_hdr_size) - 1; req.v4_route_tbl_info_valid = true; req.v4_route_tbl_info.route_tbl_start_addr = IPA_MEM_PART(v4_rt_ofst) + smem_restr_bytes; req.v4_route_tbl_info.num_indices = IPA_MEM_PART(v4_modem_rt_index_hi); req.v6_route_tbl_info_valid = true; req.v6_route_tbl_info.route_tbl_start_addr = IPA_MEM_PART(v6_rt_ofst) + smem_restr_bytes; req.v6_route_tbl_info.num_indices = IPA_MEM_PART(v6_modem_rt_index_hi); req.v4_filter_tbl_start_addr_valid = true; req.v4_filter_tbl_start_addr = IPA_MEM_PART(v4_flt_ofst) + smem_restr_bytes; req.v6_filter_tbl_start_addr_valid = true; req.v6_filter_tbl_start_addr = IPA_MEM_PART(v6_flt_ofst) + smem_restr_bytes; req.modem_mem_info_valid = true; req.modem_mem_info.block_start_addr = IPA_MEM_PART(modem_ofst) + smem_restr_bytes; req.modem_mem_info.size = IPA_MEM_PART(modem_size); req.ctrl_comm_dest_end_pt_valid = true; req.ctrl_comm_dest_end_pt = ipa_get_ep_mapping(IPA_CLIENT_APPS_WAN_CONS); req.hdr_proc_ctx_tbl_info_valid = true; req.hdr_proc_ctx_tbl_info.modem_offset_start = IPA_MEM_PART(modem_hdr_proc_ctx_ofst) + smem_restr_bytes; req.hdr_proc_ctx_tbl_info.modem_offset_end = IPA_MEM_PART(modem_hdr_proc_ctx_ofst) + IPA_MEM_PART(modem_hdr_proc_ctx_size) + smem_restr_bytes - 1; if (is_load_uc) { /* First time boot */ req.is_ssr_bootup_valid = false; req.is_ssr_bootup = 0; } else { /* After SSR boot */ req.is_ssr_bootup_valid = true; req.is_ssr_bootup = 1; } IPAWANDBG("platform_type %d\n", req.platform_type); IPAWANDBG("hdr_tbl_info.modem_offset_start %d\n", req.hdr_tbl_info.modem_offset_start); IPAWANDBG("hdr_tbl_info.modem_offset_end %d\n", req.hdr_tbl_info.modem_offset_end); IPAWANDBG("v4_route_tbl_info.route_tbl_start_addr %d\n", req.v4_route_tbl_info.route_tbl_start_addr); IPAWANDBG("v4_route_tbl_info.num_indices %d\n", req.v4_route_tbl_info.num_indices); IPAWANDBG("v6_route_tbl_info.route_tbl_start_addr %d\n", req.v6_route_tbl_info.route_tbl_start_addr); IPAWANDBG("v6_route_tbl_info.num_indices %d\n", req.v6_route_tbl_info.num_indices); IPAWANDBG("v4_filter_tbl_start_addr %d\n", req.v4_filter_tbl_start_addr); IPAWANDBG("v6_filter_tbl_start_addr %d\n", req.v6_filter_tbl_start_addr); IPAWANDBG("modem_mem_info.block_start_addr %d\n", req.modem_mem_info.block_start_addr); IPAWANDBG("modem_mem_info.size %d\n", req.modem_mem_info.size); IPAWANDBG("ctrl_comm_dest_end_pt %d\n", req.ctrl_comm_dest_end_pt); IPAWANDBG("is_ssr_bootup %d\n", req.is_ssr_bootup); req_desc.max_msg_len = QMI_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INIT_MODEM_DRIVER_REQ_V01; req_desc.ei_array = ipa_init_modem_driver_req_msg_data_v01_ei; resp_desc.max_msg_len = QMI_IPA_INIT_MODEM_DRIVER_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INIT_MODEM_DRIVER_RESP_V01; resp_desc.ei_array = ipa_init_modem_driver_resp_msg_data_v01_ei; pr_info("Sending QMI_IPA_INIT_MODEM_DRIVER_REQ_V01\n"); rc = qmi_send_req_wait(ipa_q6_clnt, &req_desc, &req, sizeof(req), &resp_desc, &resp, sizeof(resp), QMI_SEND_REQ_TIMEOUT_MS); pr_info("QMI_IPA_INIT_MODEM_DRIVER_REQ_V01 response received\n"); return ipa_check_qmi_response(rc, QMI_IPA_INIT_MODEM_DRIVER_REQ_V01, resp.resp.result, resp.resp.error, "ipa_init_modem_driver_resp_msg_v01"); }