From a2420135bddf34c3c2a38ce08f8ad2ccda5fae12 Mon Sep 17 00:00:00 2001 From: Chris Lew Date: Tue, 17 Apr 2018 18:05:22 -0700 Subject: [PATCH] rpmsg: glink: Add pipe reset functionality Some remote procs do not initialize the pipe when they are started and assume the data in the pipe descriptors is valid. Add an optional handler to clear the pipe descriptors and call this during removal of the glink device to ensure a clean restart of glink. Change-Id: I62871cc5d6fd052e234843645299fdc87a71185f Signed-off-by: Chris Lew --- drivers/rpmsg/qcom_glink_native.c | 11 +++++++++++ drivers/rpmsg/qcom_glink_native.h | 2 ++ 2 files changed, 13 insertions(+) diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index 7294902c4274..905c7a134aee 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -326,6 +326,15 @@ static void qcom_glink_tx_write(struct qcom_glink *glink, glink->tx_pipe->write(glink->tx_pipe, hdr, hlen, data, dlen); } +static void qcom_glink_pipe_reset(struct qcom_glink *glink) +{ + if (glink->tx_pipe->reset) + glink->tx_pipe->reset(glink->tx_pipe); + + if (glink->rx_pipe->reset) + glink->rx_pipe->reset(glink->rx_pipe); +} + static void qcom_glink_send_read_notify(struct qcom_glink *glink) { struct glink_msg msg; @@ -1982,6 +1991,8 @@ void qcom_glink_native_remove(struct qcom_glink *glink) idr_destroy(&glink->lcids); idr_destroy(&glink->rcids); + + qcom_glink_pipe_reset(glink); mbox_free_channel(glink->mbox_chan); } EXPORT_SYMBOL_GPL(qcom_glink_native_remove); diff --git a/drivers/rpmsg/qcom_glink_native.h b/drivers/rpmsg/qcom_glink_native.h index 624184fc458e..51c8e0d2c3f6 100644 --- a/drivers/rpmsg/qcom_glink_native.h +++ b/drivers/rpmsg/qcom_glink_native.h @@ -22,6 +22,8 @@ struct qcom_glink_pipe { void (*write)(struct qcom_glink_pipe *glink_pipe, const void *hdr, size_t hlen, const void *data, size_t dlen); + + void (*reset)(struct qcom_glink_pipe *glink_pipe); }; struct qcom_glink;