From 45c428101136c2b96aa1ba628fd259dc34091621 Mon Sep 17 00:00:00 2001 From: Deepak Kumar Singh Date: Fri, 16 Oct 2020 13:50:37 +0530 Subject: [PATCH] rpmsg: glink: do not break from interrupt handler If receive callback fails, returning error can cause interrupt handler to exit. if old interrupts have been missed glink may not read new packets from rx fifo. Print error message if callback fails but do not return any error to interrupt handler so that it can continue reading pending data in rx fifo even if old interrupts were missed and no new interrupt is coming from remote host. Change-Id: I1adec1e2ba7337008ecc2d71bf5f96c331a22695 Signed-off-by: Deepak Kumar Singh --- drivers/rpmsg/qcom_glink_native.c | 21 +++++++++++++++------ net/qrtr/smd.c | 7 +++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 26844dae39e5..492ba74f65d1 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -41,12 +41,19 @@ do { \ ch->lcid, ch->rcid, __func__, ##__VA_ARGS__); \ } while (0) - #define GLINK_ERR(ctxt, x, ...) \ do { \ pr_err_ratelimited("[%s]: "x, __func__, ##__VA_ARGS__); \ if (ctxt) \ ipc_log_string(ctxt, "[%s]: "x, __func__, ##__VA_ARGS__); \ + +#define CH_ERR(ch, x, ...) \ +do { \ + if (ch->glink) { \ + ipc_log_string(ch->glink->ilc, "%s[%d:%d] %s: "x, ch->name, \ + ch->lcid, ch->rcid, __func__, ##__VA_ARGS__); \ + dev_err(ch->glink->dev, "[%s]: "x, __func__, ##__VA_ARGS__); \ + } \ } while (0) #define GLINK_NAME_SIZE 32 @@ -1054,12 +1061,14 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) intent->offset, channel->ept.priv, RPMSG_ADDR_ANY); - if (ret < 0) - CH_INFO(channel, - "glink:callback error ret = %d\n", ret); + + if (ret < 0) { + CH_ERR(channel, + "callback error ret = %d\n", ret); + ret = 0; + } } else { - CH_INFO(channel, "callback not present\n"); - dev_err(glink->dev, "glink:callback not present\n"); + CH_ERR(channel, "callback not present\n"); } spin_unlock(&channel->recv_lock); diff --git a/net/qrtr/smd.c b/net/qrtr/smd.c index aec36db4e4ef..4b08f4e79a6a 100644 --- a/net/qrtr/smd.c +++ b/net/qrtr/smd.c @@ -24,7 +24,7 @@ static int qcom_smd_qrtr_callback(struct rpmsg_device *rpdev, int rc; if (!qdev) { - pr_err("%d:Not ready\n", __func__); + pr_err("%s:Not ready\n", __func__); return -EAGAIN; } @@ -64,7 +64,7 @@ static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) u32 net_id; bool rt; int rc; - pr_err("%d:Entered\n", __func__); + pr_info("%s:Entered\n", __func__); qdev = devm_kzalloc(&rpdev->dev, sizeof(*qdev), GFP_KERNEL); if (!qdev) @@ -86,8 +86,7 @@ static int qcom_smd_qrtr_probe(struct rpmsg_device *rpdev) dev_set_drvdata(&rpdev->dev, qdev); - pr_err("%d:SMD QRTR driver probed\n", __func__); - dev_dbg(&rpdev->dev, "SMD QRTR driver probed\n"); + pr_info("%s:SMD QRTR driver probed\n", __func__); return 0; }