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

This commit is contained in:
qctecmdr 2019-10-28 04:52:48 -07:00 committed by Gerrit - the friendly Code Review server
commit 44b48b1070
6 changed files with 188 additions and 28 deletions

View File

@ -1480,6 +1480,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;
@ -1711,6 +1746,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,
},
};
@ -2077,6 +2120,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;

View File

@ -220,6 +220,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
@ -328,6 +329,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);

View File

@ -1377,6 +1377,26 @@ 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),
.is_array = 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),
.is_array = NO_ARRAY,
.tlv_type = 0x14,
.offset = offsetof(
struct ipa_indication_reg_req_msg_v01,
bw_change_ind),
},
{
.data_type = QMI_EOTI,
.is_array = NO_ARRAY,
@ -5116,3 +5136,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),
.is_array = 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),
.is_array = 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),
.is_array = 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),
.is_array = NO_ARRAY,
.tlv_type = 0x11,
.offset = offsetof(struct ipa_bw_change_ind_msg_v01,
peak_bw_dl),
},
{
.data_type = QMI_EOTI,
.is_array = NO_ARRAY,
.tlv_type = QMI_COMMON_TLV_TYPE,
},
};

View File

@ -1641,6 +1641,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;
}
@ -2232,7 +2234,6 @@ 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)
@ -2241,29 +2242,11 @@ int ipa3_wwan_set_modem_state(struct wan_ioctl_notify_wan_state *state)
if (!ipa_pm_is_used())
return 0;
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;
}

View File

@ -191,10 +191,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);
goto bail;
}

View File

@ -487,6 +487,19 @@ struct ipa_indication_reg_req_msg_v01 {
* message makes sense only when the QMI_IPA_INDICATION_REGISTER_REQ
* is being originated from the master driver.
*/
/* Optional */
/* BW CHANGE Indication */
uint8_t bw_change_ind_valid;
/* Must be set to true if bw_change_ind is being passed */
uint8_t bw_change_ind;
/*
* If set to TRUE, this field indicates that the client wants to
* receive indications for BW change information via
* QMI_IPA_BW_CHANGE_INDICATION. Setting this field in the request
* message makes sense only when the QMI_IPA_INDICATION_REGISTER_REQ
* is being originated from the master driver.
*/
}; /* Message */
@ -2655,6 +2668,19 @@ struct ipa_remove_offload_connection_resp_msg_v01 {
}; /* Message */
#define IPA_REMOVE_OFFLOAD_CONNECTION_RESP_MSG_V01_MAX_MSG_LEN 7
struct ipa_bw_change_ind_msg_v01 {
/* optional */
/* Must be set to true if peak_bw_ul is being passed*/
uint8_t peak_bw_ul_valid;
/* Kbps */
uint32_t peak_bw_ul;
/* Must be set to true if peak_bw_dl is being passed*/
uint8_t peak_bw_dl_valid;
/* Kbps */
uint32_t peak_bw_dl;
}; /* Message */
#define IPA_BW_CHANGE_IND_MSG_V01_MAX_MSG_LEN 14
/*Service Message Definition*/
#define QMI_IPA_INDICATION_REGISTER_REQ_V01 0x0020
#define QMI_IPA_INDICATION_REGISTER_RESP_V01 0x0020
@ -2709,12 +2735,12 @@ struct ipa_remove_offload_connection_resp_msg_v01 {
#define QMI_IPA_ADD_OFFLOAD_CONNECTION_RESP_V01 0x0041
#define QMI_IPA_REMOVE_OFFLOAD_CONNECTION_REQ_V01 0x0042
#define QMI_IPA_REMOVE_OFFLOAD_CONNECTION_RESP_V01 0x0042
#define QMI_IPA_BW_CHANGE_INDICATION_V01 0x0044
/* add for max length*/
#define QMI_IPA_INIT_MODEM_DRIVER_REQ_MAX_MSG_LEN_V01 162
#define QMI_IPA_INIT_MODEM_DRIVER_RESP_MAX_MSG_LEN_V01 25
#define QMI_IPA_INDICATION_REGISTER_REQ_MAX_MSG_LEN_V01 16
#define QMI_IPA_INDICATION_REGISTER_REQ_MAX_MSG_LEN_V01 20
#define QMI_IPA_INDICATION_REGISTER_RESP_MAX_MSG_LEN_V01 7
#define QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01 33705
#define QMI_IPA_INSTALL_FILTER_RULE_RESP_MAX_MSG_LEN_V01 783