From 0d0937200823d4efd69d743b89aaac0c299b7303 Mon Sep 17 00:00:00 2001 From: Subash Abhinov Kasiviswanathan Date: Wed, 20 Nov 2019 21:08:24 -0700 Subject: [PATCH] soc: qcom: wda: Conditionally register for dl marker dl marker is enabled always if the power collapse feature is enabled. However, dl marker may not be required in certain configurations. CRs-fixed: 2560817 Change-Id: I3a251a3bf8cbab4434e2aa055783b4a3c3d1103a Signed-off-by: Subash Abhinov Kasiviswanathan --- .../ethernet/qualcomm/rmnet/rmnet_config.c | 11 ++++++++ drivers/soc/qcom/wda_qmi.c | 25 +++++++++++++++---- include/soc/qcom/rmnet_qmi.h | 6 +++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c index b215129e2811..0e2f69b40133 100644 --- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c @@ -711,6 +711,17 @@ struct net_device *rmnet_get_real_dev(void *port) } EXPORT_SYMBOL(rmnet_get_real_dev); +int rmnet_get_dlmarker_info(void *port) +{ + if (!port) + return 0; + + return ((struct rmnet_port *)port)->data_format & + (RMNET_INGRESS_FORMAT_DL_MARKER_V1 | + RMNET_INGRESS_FORMAT_DL_MARKER_V2); +} +EXPORT_SYMBOL(rmnet_get_dlmarker_info); + #endif /* Startup/Shutdown */ diff --git a/drivers/soc/qcom/wda_qmi.c b/drivers/soc/qcom/wda_qmi.c index 89cb1f738237..10f667211df6 100644 --- a/drivers/soc/qcom/wda_qmi.c +++ b/drivers/soc/qcom/wda_qmi.c @@ -250,7 +250,8 @@ out: return ret; } -static int wda_set_powersave_config_req(struct qmi_handle *wda_handle) +static int wda_set_powersave_config_req(struct qmi_handle *wda_handle, + int dl_marker) { struct wda_qmi_data *data = container_of(wda_handle, struct wda_qmi_data, handle); @@ -280,7 +281,8 @@ static int wda_set_powersave_config_req(struct qmi_handle *wda_handle) req->ep_id.ep_type = data->svc.ep_type; req->ep_id.iface_id = data->svc.iface_id; req->req_data_cfg_valid = 1; - req->req_data_cfg = WDA_DATA_POWERSAVE_CONFIG_ALL_MASK_V01; + req->req_data_cfg = dl_marker ? WDA_DATA_POWERSAVE_CONFIG_ALL_MASK_V01 : + WDA_DATA_POWERSAVE_CONFIG_FLOW_CTL_V01; ret = qmi_send_request(wda_handle, &data->ssctl, &txn, QMI_WDA_SET_POWERSAVE_CONFIG_REQ_V01, QMI_WDA_SET_POWERSAVE_CONFIG_REQ_V01_MAX_MSG_LEN, @@ -312,11 +314,22 @@ static void wda_svc_config(struct work_struct *work) struct wda_qmi_data *data = container_of(work, struct wda_qmi_data, svc_arrive); struct qmi_info *qmi; - int rc; + int rc, dl_marker = 0; + + while (!rtnl_trylock()) { + if (!data->restart_state) + cond_resched(); + else + return; + } + + dl_marker = rmnet_get_dlmarker_info(data->rmnet_port); + rtnl_unlock(); if (data->restart_state == 1) return; - rc = wda_set_powersave_config_req(&data->handle); + + rc = wda_set_powersave_config_req(&data->handle, dl_marker); if (rc < 0) { pr_err("%s Failed to init service, err[%d]\n", __func__, rc); return; @@ -330,6 +343,7 @@ static void wda_svc_config(struct work_struct *work) else return; } + qmi = (struct qmi_info *)rmnet_get_qmi_pt(data->rmnet_port); if (!qmi) { rtnl_unlock(); @@ -344,7 +358,8 @@ static void wda_svc_config(struct work_struct *work) rtnl_unlock(); - pr_info("Connection established with the WDA Service\n"); + pr_info("Connection established with the WDA Service, DL Marker %s\n", + dl_marker ? "enabled" : "disabled"); } static int wda_svc_arrive(struct qmi_handle *qmi, struct qmi_service *svc) diff --git a/include/soc/qcom/rmnet_qmi.h b/include/soc/qcom/rmnet_qmi.h index ffcef3f12653..843c557d7d9b 100644 --- a/include/soc/qcom/rmnet_qmi.h +++ b/include/soc/qcom/rmnet_qmi.h @@ -25,6 +25,7 @@ void rmnet_clear_powersave_format(void *port); void rmnet_get_packets(void *port, u64 *rx, u64 *tx); int rmnet_get_powersave_notif(void *port); struct net_device *rmnet_get_real_dev(void *port); +int rmnet_get_dlmarker_info(void *port); #else static inline void *rmnet_get_qmi_pt(void *port) { @@ -81,5 +82,10 @@ static inline struct net_device *rmnet_get_real_dev(void *port) { return NULL; } + +static inline int rmnet_get_dlmarker_info(void *port) +{ + return 0; +} #endif /* CONFIG_QCOM_QMI_RMNET */ #endif /*_RMNET_QMI_H*/