From 63716d8cb4902e96ff4d2c8408e74421ea46f13f Mon Sep 17 00:00:00 2001 From: Sivaji Boddupilli Date: Fri, 28 Jul 2023 18:29:34 +0530 Subject: [PATCH] net: qrtr: Handle -EAGAIN from MHI layer Inifinite retry when MHI return -EAGAIN error instead of 5 times retry. This infinite wait QRTR MHI transport is performing based on the return value (-EAGAIN) from the MHI transport. This completion wait implementation will be replaced with waitqueues model. Change-Id: I1844214a3e45e744df3f547fbd8112ecf47bad63 Signed-off-by: Sivaji Boddupilli --- net/qrtr/mhi.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/net/qrtr/mhi.c b/net/qrtr/mhi.c index e288c7c39a88..0858da40b538 100644 --- a/net/qrtr/mhi.c +++ b/net/qrtr/mhi.c @@ -20,6 +20,7 @@ struct qrtr_mhi_dev { struct mhi_device *mhi_dev; struct device *dev; struct completion prepared; + struct completion ringfull; }; /* From MHI to QRTR */ @@ -43,10 +44,13 @@ static void qcom_mhi_qrtr_ul_callback(struct mhi_device *mhi_dev, struct mhi_result *mhi_res) { struct sk_buff *skb = mhi_res->buf_addr; + struct qrtr_mhi_dev *qdev = dev_get_drvdata(&mhi_dev->dev); if (skb->sk) sock_put(skb->sk); consume_skb(skb); + + complete_all(&qdev->ringfull); } /* Send data over MHI */ @@ -83,14 +87,16 @@ static int __qcom_mhi_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb) static int qcom_mhi_qrtr_send(struct qrtr_endpoint *ep, struct sk_buff *skb) { + struct qrtr_mhi_dev *qdev = container_of(ep, struct qrtr_mhi_dev, ep); int rc; - int retry = 5; do { rc = __qcom_mhi_qrtr_send(ep, skb); - if (rc == -EAGAIN) - usleep_range(1000, 2000); - } while (rc == -EAGAIN && --retry); + if (rc == -EAGAIN) { + reinit_completion(&qdev->ringfull); + wait_for_completion(&qdev->ringfull); + } + } while (rc == -EAGAIN); return rc; } @@ -139,6 +145,7 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev, qdev->dev = &mhi_dev->dev; qdev->ep.xmit = qcom_mhi_qrtr_send; init_completion(&qdev->prepared); + init_completion(&qdev->ringfull); dev_set_drvdata(&mhi_dev->dev, qdev);