From: Chunkai Deng <chunkai.deng@oss.qualcomm.com>
To: Bjorn Andersson <andersson@kernel.org>,
Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>,
linux-arm-msm@vger.kernel.org, linux-remoteproc@vger.kernel.org,
linux-kernel@vger.kernel.org, chris.lew@oss.qualcomm.com,
tony.truong@oss.qualcomm.com, tao.zhang1@oss.qualcomm.com,
peter.chen@oss.qualcomm.com,
Chunkai Deng <chunkai.deng@oss.qualcomm.com>
Subject: [PATCH v2 1/2] rpmsg: glink: Split protocol start out of native_probe
Date: Mon, 24 Aug 2026 00:05:53 -0700 [thread overview]
Message-ID: <20260824-rpmsg-glink-split-protocol-start-v2-1-362d7c233f66@oss.qualcomm.com> (raw)
In-Reply-To: <20260824-rpmsg-glink-split-protocol-start-v2-0-362d7c233f66@oss.qualcomm.com>
The SMEM and RPM transports request their receive interrupt with
IRQF_NO_AUTOEN and enable it only once qcom_glink_native_probe() has
returned. But native_probe() sends the version command, so on a fast
remote the version ACK can land while the interrupt is still masked. The
ACK is dropped and the handshake never completes.
Move the version command and the chrdev registration into a new
qcom_glink_native_start(), leaving native_probe() to set up the glink
instance. Both transports enable their interrupt before calling
native_start().
Signed-off-by: Chunkai Deng <chunkai.deng@oss.qualcomm.com>
Assisted-by: Claude:claude-opus-5
---
drivers/rpmsg/qcom_glink_native.c | 32 ++++++++++++++++++++++++++++----
drivers/rpmsg/qcom_glink_native.h | 1 +
drivers/rpmsg/qcom_glink_rpm.c | 8 ++++++++
drivers/rpmsg/qcom_glink_smem.c | 8 ++++++++
4 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c
index d9d4468e4cbd..2a284b22a037 100644
--- a/drivers/rpmsg/qcom_glink_native.c
+++ b/drivers/rpmsg/qcom_glink_native.c
@@ -1928,17 +1928,41 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev,
if (ret)
dev_err(dev, "failed to add groups\n");
+ return glink;
+}
+EXPORT_SYMBOL_GPL(qcom_glink_native_probe);
+
+/**
+ * qcom_glink_native_start() - start the GLINK protocol handshake
+ * @glink: glink handle returned by qcom_glink_native_probe()
+ *
+ * Send the initial version command and register the chrdev. This is split
+ * out from qcom_glink_native_probe() so that a transport can enable its
+ * receive interrupt before the version handshake is initiated, ensuring the
+ * version ACK from the remote is not missed.
+ *
+ * Failure to register the chrdev is not fatal and only logged, matching the
+ * previous behaviour of qcom_glink_native_probe().
+ *
+ * Return: 0 on success, negative errno if sending the version command failed.
+ */
+int qcom_glink_native_start(struct qcom_glink *glink)
+{
+ int ret;
+
ret = qcom_glink_send_version(glink);
- if (ret)
- return ERR_PTR(ret);
+ if (ret) {
+ dev_err(glink->dev, "failed to send version: %d\n", ret);
+ return ret;
+ }
ret = qcom_glink_create_chrdev(glink);
if (ret)
dev_err(glink->dev, "failed to register chrdev\n");
- return glink;
+ return 0;
}
-EXPORT_SYMBOL_GPL(qcom_glink_native_probe);
+EXPORT_SYMBOL_GPL(qcom_glink_native_start);
static int qcom_glink_remove_device(struct device *dev, void *data)
{
diff --git a/drivers/rpmsg/qcom_glink_native.h b/drivers/rpmsg/qcom_glink_native.h
index 8dbec24de23e..783209980c3a 100644
--- a/drivers/rpmsg/qcom_glink_native.h
+++ b/drivers/rpmsg/qcom_glink_native.h
@@ -35,6 +35,7 @@ struct qcom_glink *qcom_glink_native_probe(struct device *dev,
struct qcom_glink_pipe *rx,
struct qcom_glink_pipe *tx,
bool intentless);
+int qcom_glink_native_start(struct qcom_glink *glink);
void qcom_glink_native_remove(struct qcom_glink *glink);
void qcom_glink_native_rx(struct qcom_glink *glink);
diff --git a/drivers/rpmsg/qcom_glink_rpm.c b/drivers/rpmsg/qcom_glink_rpm.c
index e3ba2c63a5fc..34f18c3e58c8 100644
--- a/drivers/rpmsg/qcom_glink_rpm.c
+++ b/drivers/rpmsg/qcom_glink_rpm.c
@@ -358,6 +358,14 @@ static int glink_rpm_probe(struct platform_device *pdev)
enable_irq(rpm->irq);
+ ret = qcom_glink_native_start(glink);
+ if (ret) {
+ disable_irq(rpm->irq);
+ qcom_glink_native_remove(glink);
+ mbox_free_channel(rpm->mbox_chan);
+ return ret;
+ }
+
return 0;
}
diff --git a/drivers/rpmsg/qcom_glink_smem.c b/drivers/rpmsg/qcom_glink_smem.c
index 62adc4db2317..28f6cfda6352 100644
--- a/drivers/rpmsg/qcom_glink_smem.c
+++ b/drivers/rpmsg/qcom_glink_smem.c
@@ -348,8 +348,16 @@ struct qcom_glink_smem *qcom_glink_smem_register(struct device *parent,
enable_irq(smem->irq);
+ ret = qcom_glink_native_start(glink);
+ if (ret)
+ goto err_disable_irq;
+
return smem;
+err_disable_irq:
+ disable_irq(smem->irq);
+ qcom_glink_native_remove(glink);
+
err_free_mbox:
mbox_free_channel(smem->mbox_chan);
--
2.43.0
next prev parent reply other threads:[~2026-08-24 7:06 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-24 7:05 [PATCH v2 0/2] rpmsg: glink: Fix version handshake race against a late RX interrupt Chunkai Deng
2026-08-24 7:05 ` Chunkai Deng [this message]
2026-08-24 7:05 ` [PATCH v2 2/2] rpmsg: glink: Request the RX interrupt already enabled Chunkai Deng
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260824-rpmsg-glink-split-protocol-start-v2-1-362d7c233f66@oss.qualcomm.com \
--to=chunkai.deng@oss.qualcomm.com \
--cc=andersson@kernel.org \
--cc=chris.lew@oss.qualcomm.com \
--cc=konrad.dybcio@oss.qualcomm.com \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
--cc=peter.chen@oss.qualcomm.com \
--cc=tao.zhang1@oss.qualcomm.com \
--cc=tony.truong@oss.qualcomm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®