]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
rpmsg: glink: Propagate TX failures in intentless mode as well
authorBjorn Andersson <quic_bjorande@quicinc.com>
Tue, 18 Apr 2023 16:30:17 +0000 (09:30 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 11 May 2023 14:11:07 +0000 (23:11 +0900)
[ Upstream commit 7a68f9fa97357a0f2073c9c31ed4101da4fce93e ]

As support for splitting transmission over several messages using
TX_DATA_CONT was introduced it does not immediately return the return
value of qcom_glink_tx().

The result is that in the intentless case (i.e. intent == NULL), the
code will continue to send all additional chunks. This is wasteful, and
it's possible that the send operation could incorrectly indicate
success, if the last chunk fits in the TX fifo.

Fix the condition.

Fixes: 8956927faed3 ("rpmsg: glink: Add TX_DATA_CONT command while sending")
Reviewed-by: Chris Lew <quic_clew@quicinc.com>
Signed-off-by: Bjorn Andersson <quic_bjorande@quicinc.com>
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
Link: https://lore.kernel.org/r/20230418163018.785524-2-quic_bjorande@quicinc.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/rpmsg/qcom_glink_native.c

index 35df1b0a515bf6ec27ebca3a9f9e3dc9fb218de7..67e7664efb0dc213463833b0d87d6c0cc2a122d8 100644 (file)
@@ -1348,8 +1348,9 @@ static int __qcom_glink_send(struct glink_channel *channel,
        ret = qcom_glink_tx(glink, &req, sizeof(req), data, chunk_size, wait);
 
        /* Mark intent available if we failed */
-       if (ret && intent) {
-               intent->in_use = false;
+       if (ret) {
+               if (intent)
+                       intent->in_use = false;
                return ret;
        }
 
@@ -1370,8 +1371,9 @@ static int __qcom_glink_send(struct glink_channel *channel,
                                    chunk_size, wait);
 
                /* Mark intent available if we failed */
-               if (ret && intent) {
-                       intent->in_use = false;
+               if (ret) {
+                       if (intent)
+                               intent->in_use = false;
                        break;
                }
        }