summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Marussi <cristian.marussi@arm.com>2021-06-01 11:24:17 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2021-07-20 16:02:25 +0200
commit3819aedd4533bda0483572630316266be1b05ecb (patch)
treeb1e6df50f31126dc3930bdc5719b6ff9b4ae2224
parent7e17ac2049626f0d385b015318696577198f0e4c (diff)
downloadlinux-stable-3819aedd4533bda0483572630316266be1b05ecb.tar.gz
linux-stable-3819aedd4533bda0483572630316266be1b05ecb.tar.bz2
linux-stable-3819aedd4533bda0483572630316266be1b05ecb.zip
firmware: arm_scmi: Reset Rx buffer to max size during async commands
[ Upstream commit 0cb7af474e0dbb2f500c67aa62b6db9fafa74de2 ] During an async commands execution the Rx buffer length is at first set to max_msg_sz when the synchronous part of the command is first sent. However once the synchronous part completes the transport layer waits for the delayed response which will be processed using the same xfer descriptor initially allocated. Since synchronous response received at the end of the xfer will shrink the Rx buffer length to the effective payload response length, it needs to be reset again. Raise the Rx buffer length again to max_msg_sz before fetching the delayed response to ensure full response is read correctly from the shared memory. Link: https://lore.kernel.org/r/20210601102421.26581-2-cristian.marussi@arm.com Fixes: 58ecdf03dbb9 ("firmware: arm_scmi: Add support for asynchronous commands and delayed response") Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> [sudeep.holla: moved reset to scmi_handle_response as it could race with do_xfer_with_response] Signed-off-by: Sudeep Holla <sudeep.holla@arm.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
-rw-r--r--drivers/firmware/arm_scmi/driver.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index cacdf1589b10..9485e0f1f05f 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -268,6 +268,10 @@ static void scmi_handle_response(struct scmi_chan_info *cinfo,
return;
}
+ /* rx.len could be shrunk in the sync do_xfer, so reset to maxsz */
+ if (msg_type == MSG_TYPE_DELAYED_RESP)
+ xfer->rx.len = info->desc->max_msg_size;
+
scmi_dump_header_dbg(dev, &xfer->hdr);
info->desc->ops->fetch_response(cinfo, xfer);