Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +88 −0 Original line number Diff line number Diff line Loading @@ -1468,6 +1468,41 @@ static void ipa3_q6_clnt_install_firewall_rules_ind_cb( } } static void ipa3_q6_clnt_bw_vhang_ind_cb(struct qmi_handle *handle, struct sockaddr_qrtr *sq, struct qmi_txn *txn, const void *data) { struct ipa_bw_change_ind_msg_v01 *qmi_ind; uint32_t bw_mbps = 0; if (handle != ipa_q6_clnt) { IPAWANERR("Wrong client\n"); return; } qmi_ind = (struct ipa_bw_change_ind_msg_v01 *) data; IPAWANDBG("Q6 BW change UL valid(%d):(%d)Kbps\n", qmi_ind->peak_bw_ul_valid, qmi_ind->peak_bw_ul); IPAWANDBG("Q6 BW change DL valid(%d):(%d)Kbps\n", qmi_ind->peak_bw_dl_valid, qmi_ind->peak_bw_dl); if (qmi_ind->peak_bw_ul_valid) bw_mbps += qmi_ind->peak_bw_ul/1000; if (qmi_ind->peak_bw_dl_valid) bw_mbps += qmi_ind->peak_bw_dl/1000; IPAWANDBG("vote modem BW (%u)\n", bw_mbps); if (ipa3_vote_for_bus_bw(&bw_mbps)) { IPAWANERR("Failed to vote BW (%u)\n", bw_mbps); } } static void ipa3_q6_clnt_svc_arrive(struct work_struct *work) { int rc; Loading Loading @@ -1695,6 +1730,14 @@ static struct qmi_msg_handler client_handlers[] = { QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_MAX_MSG_LEN_V01, .fn = ipa3_q6_clnt_install_firewall_rules_ind_cb, }, { .type = QMI_INDICATION, .msg_id = QMI_IPA_BW_CHANGE_INDICATION_V01, .ei = ipa_bw_change_ind_msg_v01_ei, .decoded_size = IPA_BW_CHANGE_IND_MSG_V01_MAX_MSG_LEN, .fn = ipa3_q6_clnt_bw_vhang_ind_cb, }, }; Loading Loading @@ -2061,6 +2104,51 @@ int ipa3_qmi_set_aggr_info(enum ipa_aggr_enum_type_v01 aggr_enum_type) resp.resp.error, "ipa_mhi_prime_aggr_info_req_msg_v01"); } int ipa3_qmi_req_ind(void) { struct ipa_indication_reg_req_msg_v01 req; struct ipa_indication_reg_resp_msg_v01 resp; struct ipa_msg_desc req_desc, resp_desc; int rc; memset(&req, 0, sizeof(struct ipa_indication_reg_req_msg_v01)); memset(&resp, 0, sizeof(struct ipa_indication_reg_resp_msg_v01)); req.bw_change_ind_valid = true; req.bw_change_ind = true; req_desc.max_msg_len = QMI_IPA_INDICATION_REGISTER_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INDICATION_REGISTER_REQ_V01; req_desc.ei_array = ipa3_indication_reg_req_msg_data_v01_ei; resp_desc.max_msg_len = QMI_IPA_INDICATION_REGISTER_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INDICATION_REGISTER_RESP_V01; resp_desc.ei_array = ipa3_indication_reg_resp_msg_data_v01_ei; IPAWANDBG_LOW("Sending QMI_IPA_INDICATION_REGISTER_REQ_V01\n"); if (unlikely(!ipa_q6_clnt)) return -ETIMEDOUT; rc = ipa3_qmi_send_req_wait(ipa_q6_clnt, &req_desc, &req, &resp_desc, &resp, QMI_SEND_STATS_REQ_TIMEOUT_MS); if (rc < 0) { IPAWANERR("QMI send Req %d failed, rc= %d\n", QMI_IPA_INDICATION_REGISTER_REQ_V01, rc); return rc; } IPAWANDBG_LOW("QMI_IPA_INDICATION_REGISTER_RESP_V01 received\n"); return ipa3_check_qmi_response(rc, QMI_IPA_INDICATION_REGISTER_REQ_V01, resp.resp.result, resp.resp.error, "ipa_indication_reg_req_msg_v01"); } int ipa3_qmi_stop_data_qouta(void) { struct ipa_stop_data_usage_quota_req_msg_v01 req; Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +3 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,7 @@ extern struct qmi_elem_info ipa_add_offload_connection_req_msg_v01_ei[]; extern struct qmi_elem_info ipa_add_offload_connection_resp_msg_v01_ei[]; extern struct qmi_elem_info ipa_remove_offload_connection_req_msg_v01_ei[]; extern struct qmi_elem_info ipa_remove_offload_connection_resp_msg_v01_ei[]; extern struct qmi_elem_info ipa_bw_change_ind_msg_v01_ei[]; /** * struct ipa3_rmnet_context - IPA rmnet context Loading Loading @@ -318,6 +319,8 @@ int ipa3_qmi_set_data_quota(struct ipa_set_data_usage_quota_req_msg_v01 *req); int ipa3_qmi_set_aggr_info( enum ipa_aggr_enum_type_v01 aggr_enum_type); int ipa3_qmi_req_ind(void); int ipa3_qmi_stop_data_qouta(void); void ipa3_q6_handshake_complete(bool ssr_bootup); Loading drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service_v01.c +66 −2 Original line number Diff line number Diff line Loading @@ -1349,6 +1349,16 @@ struct qmi_elem_info ipa3_indication_reg_req_msg_data_v01_ei[] = { struct ipa_indication_reg_req_msg_v01, ipa_mhi_ready_ind_valid), }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x12, .offset = offsetof( struct ipa_indication_reg_req_msg_v01, ipa_mhi_ready_ind), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, Loading @@ -1369,15 +1379,25 @@ struct qmi_elem_info ipa3_indication_reg_req_msg_data_v01_ei[] = { struct ipa_indication_reg_req_msg_v01, endpoint_desc_ind), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_indication_reg_req_msg_v01, bw_change_ind_valid), }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x12, .tlv_type = 0x14, .offset = offsetof( struct ipa_indication_reg_req_msg_v01, ipa_mhi_ready_ind), bw_change_ind), }, { .data_type = QMI_EOTI, Loading Loading @@ -5118,3 +5138,47 @@ struct qmi_elem_info ipa_remove_offload_connection_resp_msg_v01_ei[] = { .tlv_type = QMI_COMMON_TLV_TYPE, }, }; struct qmi_elem_info ipa_bw_change_ind_msg_v01_ei[] = { { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_ul_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(u32), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_ul), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_dl_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(u32), .array_type = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_dl), }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, }; drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +5 −22 Original line number Diff line number Diff line Loading @@ -1618,6 +1618,8 @@ static int handle3_egress_format(struct net_device *dev, rc = ipa3_qmi_set_aggr_info(DATA_AGGR_TYPE_QMAP_V01); } rmnet_ipa3_ctx->ipa_mhi_aggr_formet_set = true; /* register Q6 indication */ rc = ipa3_qmi_req_ind(); return rc; } Loading Loading @@ -2147,35 +2149,16 @@ static int rmnet_ipa_send_coalesce_notification(uint8_t qmap_id, int ipa3_wwan_set_modem_state(struct wan_ioctl_notify_wan_state *state) { uint32_t bw_mbps = 0; int ret = 0; if (!state) return -EINVAL; if (state->up) { if (rmnet_ipa3_ctx->ipa_config_is_apq) { bw_mbps = 5200; ret = ipa3_vote_for_bus_bw(&bw_mbps); if (ret) { IPAERR("Failed to vote for bus BW (%u)\n", bw_mbps); return ret; } } if (state->up) ret = ipa_pm_activate_sync(rmnet_ipa3_ctx->q6_teth_pm_hdl); } else { if (rmnet_ipa3_ctx->ipa_config_is_apq) { bw_mbps = 0; ret = ipa3_vote_for_bus_bw(&bw_mbps); if (ret) { IPAERR("Failed to vote for bus BW (%u)\n", bw_mbps); return ret; } } else ret = ipa_pm_deactivate_sync(rmnet_ipa3_ctx->q6_teth_pm_hdl); } return ret; } Loading drivers/platform/msm/ipa/ipa_v3/teth_bridge.c +0 −4 Original line number Diff line number Diff line Loading @@ -178,10 +178,6 @@ int ipa3_teth_bridge_connect(struct teth_bridge_connect_params *connect_params) TETH_ERR("fail to register with PM %d\n", res); return res; } /* vote for turbo in case of MHIP channels*/ if (ipa3_is_apq()) res = ipa_pm_set_throughput(ipa3_teth_ctx->modem_pm_hdl, 5200); res = ipa_pm_activate_sync(ipa3_teth_ctx->modem_pm_hdl); TETH_DBG_FUNC_EXIT(); Loading Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +88 −0 Original line number Diff line number Diff line Loading @@ -1468,6 +1468,41 @@ static void ipa3_q6_clnt_install_firewall_rules_ind_cb( } } static void ipa3_q6_clnt_bw_vhang_ind_cb(struct qmi_handle *handle, struct sockaddr_qrtr *sq, struct qmi_txn *txn, const void *data) { struct ipa_bw_change_ind_msg_v01 *qmi_ind; uint32_t bw_mbps = 0; if (handle != ipa_q6_clnt) { IPAWANERR("Wrong client\n"); return; } qmi_ind = (struct ipa_bw_change_ind_msg_v01 *) data; IPAWANDBG("Q6 BW change UL valid(%d):(%d)Kbps\n", qmi_ind->peak_bw_ul_valid, qmi_ind->peak_bw_ul); IPAWANDBG("Q6 BW change DL valid(%d):(%d)Kbps\n", qmi_ind->peak_bw_dl_valid, qmi_ind->peak_bw_dl); if (qmi_ind->peak_bw_ul_valid) bw_mbps += qmi_ind->peak_bw_ul/1000; if (qmi_ind->peak_bw_dl_valid) bw_mbps += qmi_ind->peak_bw_dl/1000; IPAWANDBG("vote modem BW (%u)\n", bw_mbps); if (ipa3_vote_for_bus_bw(&bw_mbps)) { IPAWANERR("Failed to vote BW (%u)\n", bw_mbps); } } static void ipa3_q6_clnt_svc_arrive(struct work_struct *work) { int rc; Loading Loading @@ -1695,6 +1730,14 @@ static struct qmi_msg_handler client_handlers[] = { QMI_IPA_INSTALL_UL_FIREWALL_RULES_IND_MAX_MSG_LEN_V01, .fn = ipa3_q6_clnt_install_firewall_rules_ind_cb, }, { .type = QMI_INDICATION, .msg_id = QMI_IPA_BW_CHANGE_INDICATION_V01, .ei = ipa_bw_change_ind_msg_v01_ei, .decoded_size = IPA_BW_CHANGE_IND_MSG_V01_MAX_MSG_LEN, .fn = ipa3_q6_clnt_bw_vhang_ind_cb, }, }; Loading Loading @@ -2061,6 +2104,51 @@ int ipa3_qmi_set_aggr_info(enum ipa_aggr_enum_type_v01 aggr_enum_type) resp.resp.error, "ipa_mhi_prime_aggr_info_req_msg_v01"); } int ipa3_qmi_req_ind(void) { struct ipa_indication_reg_req_msg_v01 req; struct ipa_indication_reg_resp_msg_v01 resp; struct ipa_msg_desc req_desc, resp_desc; int rc; memset(&req, 0, sizeof(struct ipa_indication_reg_req_msg_v01)); memset(&resp, 0, sizeof(struct ipa_indication_reg_resp_msg_v01)); req.bw_change_ind_valid = true; req.bw_change_ind = true; req_desc.max_msg_len = QMI_IPA_INDICATION_REGISTER_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INDICATION_REGISTER_REQ_V01; req_desc.ei_array = ipa3_indication_reg_req_msg_data_v01_ei; resp_desc.max_msg_len = QMI_IPA_INDICATION_REGISTER_RESP_MAX_MSG_LEN_V01; resp_desc.msg_id = QMI_IPA_INDICATION_REGISTER_RESP_V01; resp_desc.ei_array = ipa3_indication_reg_resp_msg_data_v01_ei; IPAWANDBG_LOW("Sending QMI_IPA_INDICATION_REGISTER_REQ_V01\n"); if (unlikely(!ipa_q6_clnt)) return -ETIMEDOUT; rc = ipa3_qmi_send_req_wait(ipa_q6_clnt, &req_desc, &req, &resp_desc, &resp, QMI_SEND_STATS_REQ_TIMEOUT_MS); if (rc < 0) { IPAWANERR("QMI send Req %d failed, rc= %d\n", QMI_IPA_INDICATION_REGISTER_REQ_V01, rc); return rc; } IPAWANDBG_LOW("QMI_IPA_INDICATION_REGISTER_RESP_V01 received\n"); return ipa3_check_qmi_response(rc, QMI_IPA_INDICATION_REGISTER_REQ_V01, resp.resp.result, resp.resp.error, "ipa_indication_reg_req_msg_v01"); } int ipa3_qmi_stop_data_qouta(void) { struct ipa_stop_data_usage_quota_req_msg_v01 req; Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +3 −0 Original line number Diff line number Diff line Loading @@ -213,6 +213,7 @@ extern struct qmi_elem_info ipa_add_offload_connection_req_msg_v01_ei[]; extern struct qmi_elem_info ipa_add_offload_connection_resp_msg_v01_ei[]; extern struct qmi_elem_info ipa_remove_offload_connection_req_msg_v01_ei[]; extern struct qmi_elem_info ipa_remove_offload_connection_resp_msg_v01_ei[]; extern struct qmi_elem_info ipa_bw_change_ind_msg_v01_ei[]; /** * struct ipa3_rmnet_context - IPA rmnet context Loading Loading @@ -318,6 +319,8 @@ int ipa3_qmi_set_data_quota(struct ipa_set_data_usage_quota_req_msg_v01 *req); int ipa3_qmi_set_aggr_info( enum ipa_aggr_enum_type_v01 aggr_enum_type); int ipa3_qmi_req_ind(void); int ipa3_qmi_stop_data_qouta(void); void ipa3_q6_handshake_complete(bool ssr_bootup); Loading
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service_v01.c +66 −2 Original line number Diff line number Diff line Loading @@ -1349,6 +1349,16 @@ struct qmi_elem_info ipa3_indication_reg_req_msg_data_v01_ei[] = { struct ipa_indication_reg_req_msg_v01, ipa_mhi_ready_ind_valid), }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x12, .offset = offsetof( struct ipa_indication_reg_req_msg_v01, ipa_mhi_ready_ind), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, Loading @@ -1369,15 +1379,25 @@ struct qmi_elem_info ipa3_indication_reg_req_msg_data_v01_ei[] = { struct ipa_indication_reg_req_msg_v01, endpoint_desc_ind), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x14, .offset = offsetof( struct ipa_indication_reg_req_msg_v01, bw_change_ind_valid), }, { .data_type = QMI_UNSIGNED_1_BYTE, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x12, .tlv_type = 0x14, .offset = offsetof( struct ipa_indication_reg_req_msg_v01, ipa_mhi_ready_ind), bw_change_ind), }, { .data_type = QMI_EOTI, Loading Loading @@ -5118,3 +5138,47 @@ struct qmi_elem_info ipa_remove_offload_connection_resp_msg_v01_ei[] = { .tlv_type = QMI_COMMON_TLV_TYPE, }, }; struct qmi_elem_info ipa_bw_change_ind_msg_v01_ei[] = { { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_ul_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(u32), .array_type = NO_ARRAY, .tlv_type = 0x10, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_ul), }, { .data_type = QMI_OPT_FLAG, .elem_len = 1, .elem_size = sizeof(u8), .array_type = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_dl_valid), }, { .data_type = QMI_UNSIGNED_4_BYTE, .elem_len = 1, .elem_size = sizeof(u32), .array_type = NO_ARRAY, .tlv_type = 0x11, .offset = offsetof(struct ipa_bw_change_ind_msg_v01, peak_bw_dl), }, { .data_type = QMI_EOTI, .array_type = NO_ARRAY, .tlv_type = QMI_COMMON_TLV_TYPE, }, };
drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +5 −22 Original line number Diff line number Diff line Loading @@ -1618,6 +1618,8 @@ static int handle3_egress_format(struct net_device *dev, rc = ipa3_qmi_set_aggr_info(DATA_AGGR_TYPE_QMAP_V01); } rmnet_ipa3_ctx->ipa_mhi_aggr_formet_set = true; /* register Q6 indication */ rc = ipa3_qmi_req_ind(); return rc; } Loading Loading @@ -2147,35 +2149,16 @@ static int rmnet_ipa_send_coalesce_notification(uint8_t qmap_id, int ipa3_wwan_set_modem_state(struct wan_ioctl_notify_wan_state *state) { uint32_t bw_mbps = 0; int ret = 0; if (!state) return -EINVAL; if (state->up) { if (rmnet_ipa3_ctx->ipa_config_is_apq) { bw_mbps = 5200; ret = ipa3_vote_for_bus_bw(&bw_mbps); if (ret) { IPAERR("Failed to vote for bus BW (%u)\n", bw_mbps); return ret; } } if (state->up) ret = ipa_pm_activate_sync(rmnet_ipa3_ctx->q6_teth_pm_hdl); } else { if (rmnet_ipa3_ctx->ipa_config_is_apq) { bw_mbps = 0; ret = ipa3_vote_for_bus_bw(&bw_mbps); if (ret) { IPAERR("Failed to vote for bus BW (%u)\n", bw_mbps); return ret; } } else ret = ipa_pm_deactivate_sync(rmnet_ipa3_ctx->q6_teth_pm_hdl); } return ret; } Loading
drivers/platform/msm/ipa/ipa_v3/teth_bridge.c +0 −4 Original line number Diff line number Diff line Loading @@ -178,10 +178,6 @@ int ipa3_teth_bridge_connect(struct teth_bridge_connect_params *connect_params) TETH_ERR("fail to register with PM %d\n", res); return res; } /* vote for turbo in case of MHIP channels*/ if (ipa3_is_apq()) res = ipa_pm_set_throughput(ipa3_teth_ctx->modem_pm_hdl, 5200); res = ipa_pm_activate_sync(ipa3_teth_ctx->modem_pm_hdl); TETH_DBG_FUNC_EXIT(); Loading