Procházet zdrojové kódy

Merge "msm: ipa3: add modem BW voting change support"

qctecmdr před 3 roky
rodič
revize
bb51a5e7a5

+ 88 - 0
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c

@@ -1497,6 +1497,42 @@ 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;
@@ -1742,6 +1778,13 @@ static struct qmi_msg_handler client_handlers[] = {
 			struct ipa_configure_ul_firewall_rules_ind_msg_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,
+	},
 };
 
 
@@ -2108,6 +2151,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_quota(struct ipa_stop_data_usage_quota_req_msg_v01 *req)
 {
 	struct ipa_stop_data_usage_quota_resp_msg_v01 resp;

+ 3 - 0
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h

@@ -219,6 +219,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
@@ -333,6 +334,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_quota(struct ipa_stop_data_usage_quota_req_msg_v01 *req);
 
 void ipa3_q6_handshake_complete(bool ssr_bootup);

+ 67 - 2
drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service_v01.c

@@ -1339,6 +1339,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,
@@ -1359,15 +1369,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,
@@ -5225,3 +5245,48 @@ 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,
+
+	},
+};

+ 4 - 22
drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c

@@ -1734,6 +1734,8 @@ static int handle3_egress_format(struct net_device *dev,
 		/* send aggr_info_qmi */
 		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;
 	}
 
@@ -2990,7 +2992,6 @@ static int rmnet_ipa_send_set_mtu_notification(char *if_name,
 
 int ipa3_wwan_set_modem_state(struct wan_ioctl_notify_wan_state *state)
 {
-	uint32_t bw_mbps = 0;
 	int ret = 0;
 	char alert_msg[IPA_UPSTREAM_ALERT_MAX_SIZE];
 	char wan_iface[IPA_UPSTREAM_ALERT_MAX_SIZE];
@@ -3002,29 +3003,10 @@ int ipa3_wwan_set_modem_state(struct wan_ioctl_notify_wan_state *state)
 	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);
-	}
 
 	/* Send upstream state uevent if RSC/RSB is enabled. */
 	if (IPA_NETDEV() && (IPA_NETDEV()->features & NETIF_F_GRO_HW)) {

+ 0 - 6
drivers/platform/msm/ipa/ipa_v3/teth_bridge.c

@@ -208,12 +208,6 @@ int ipa3_teth_bridge_connect(struct teth_bridge_connect_params *connect_params)
 	}
 	res = ipa_pm_activate_sync(*pm);
 
-	/* vote for turbo in case of MHIP channels*/
-	if (ipa3_is_apq())
-		res = ipa_pm_set_throughput(*pm,
-			5200);
-	res = ipa_pm_activate_sync(*pm);
-
 	TETH_DBG_FUNC_EXIT();
 	return res;
 }