mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
Merge "msm: ipa3: add modem BW voting change support"
This commit is contained in:
commit
44b48b1070
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
},
|
||||
};
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user