diff --git a/ipa/ipa_v3/ipa_qmi_service.c b/ipa/ipa_v3/ipa_qmi_service.c index 3dca52b22c..82565376cd 100644 --- a/ipa/ipa_v3/ipa_qmi_service.c +++ b/ipa/ipa_v3/ipa_qmi_service.c @@ -2162,6 +2162,22 @@ int ipa3_qmi_send_mhi_cleanup_request(struct ipa_mhi_cleanup_req_msg_v01 *req) resp.resp.error, "ipa_mhi_cleanup_req_msg"); } +int ipa3_qmi_send_rsc_pipe_indication( + struct ipa_endp_desc_indication_msg_v01 *req) +{ + IPAWANDBG("Sending QMI_IPA_ENDP_DESC_INDICATION_V01\n"); + + if (unlikely(!ipa3_svc_handle)) + return -ETIMEDOUT; + + return qmi_send_indication(ipa3_svc_handle, + &ipa3_qmi_ctx->client_sq, + QMI_IPA_ENDP_DESC_INDICATION_V01, + IPA_ENDP_DESC_INDICATION_MSG_V01_MAX_MSG_LEN, + ipa_endp_desc_indication_msg_v01_ei, + req); +} + void ipa3_qmi_init(void) { mutex_init(&ipa3_qmi_lock); diff --git a/ipa/ipa_v3/ipa_qmi_service.h b/ipa/ipa_v3/ipa_qmi_service.h index efb976abb5..f5973439d6 100644 --- a/ipa/ipa_v3/ipa_qmi_service.h +++ b/ipa/ipa_v3/ipa_qmi_service.h @@ -333,6 +333,9 @@ int ipa3_qmi_get_per_client_packet_stats( int ipa3_qmi_send_mhi_ready_indication( struct ipa_mhi_ready_indication_msg_v01 *req); +int ipa3_qmi_send_rsc_pipe_indication( + struct ipa_endp_desc_indication_msg_v01 *req); + int ipa3_qmi_send_mhi_cleanup_request(struct ipa_mhi_cleanup_req_msg_v01 *req); void ipa3_qmi_init(void); @@ -475,6 +478,12 @@ static inline int ipa3_qmi_send_mhi_ready_indication( return -EPERM; } +static int ipa3_qmi_send_rsc_pipe_indication( + struct ipa_endp_desc_indication_msg_v01 *req) +{ + return -EPERM; +} + static inline int ipa3_qmi_send_mhi_cleanup_request( struct ipa_mhi_cleanup_req_msg_v01 *req) { diff --git a/ipa/ipa_v3/rmnet_ipa.c b/ipa/ipa_v3/rmnet_ipa.c index 329dabd779..ec6e1cb4e5 100644 --- a/ipa/ipa_v3/rmnet_ipa.c +++ b/ipa/ipa_v3/rmnet_ipa.c @@ -1427,6 +1427,26 @@ static void apps_ipa_packet_receive_notify(void *priv, } } +/* Send RSC endpoint info to modem using QMI indication message */ + +static int ipa_send_rsc_pipe_ind_to_modem(void) +{ + struct ipa_endp_desc_indication_msg_v01 req; + struct ipa_ep_id_type_v01 *ep_info; + + memset(&req, 0, sizeof(struct ipa_endp_desc_indication_msg_v01)); + req.ep_info_len = 1; + req.ep_info_valid = true; + req.num_eps_valid = true; + req.num_eps = 1; + ep_info = &req.ep_info[req.ep_info_len - 1]; + ep_info->ep_id = rmnet_ipa3_ctx->ipa3_to_apps_hdl; + ep_info->ic_type = DATA_IC_TYPE_AP_V01; + ep_info->ep_type = DATA_EP_DESC_TYPE_RSC_PROD_V01; + ep_info->ep_status = DATA_EP_STATUS_CONNECTED_V01; + return ipa3_qmi_send_rsc_pipe_indication(&req); +} + static int handle3_ingress_format(struct net_device *dev, struct rmnet_ioctl_extended_s *in) { @@ -1528,6 +1548,9 @@ static int handle3_ingress_format(struct net_device *dev, if (ret) ipa3_del_a7_qmap_hdr(); + /* Sending QMI indication message share RSC pipe details*/ + if (dev->features & NETIF_F_GRO_HW) + ipa_send_rsc_pipe_ind_to_modem(); end: if (ret) IPAWANERR("failed to configure ingress\n");