summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorCristian Marussi <cristian.marussi@arm.com>2022-02-24 15:24:04 +0000
committerSudeep Holla <sudeep.holla@arm.com>2022-04-04 08:25:58 +0100
commit98f0d68f94ea21541e0050cc64fa108ade779839 (patch)
tree528a55b27844662aa99f78a08f93a5f2dc582fdb /drivers
parent3123109284176b1532874591f7c81f3837bbdc17 (diff)
downloadlinux-98f0d68f94ea21541e0050cc64fa108ade779839.tar.bz2
firmware: arm_scmi: Remove clear channel call on the TX channel
On SCMI transports whose channels are based on a shared resource the TX channel area has to be acquired by the agent before placing the desired command into the channel and it will be then relinquished by the platform once the related reply has been made available into the channel. On an RX channel the logic is reversed with the platform acquiring the channel area and the agent reliquishing it once done by calling the scmi_clear_channel() helper. As a consequence, even in case of error, the agent must never try to clear a TX channel from its side: restrict the existing clear channel call on the the reply path only to delayed responses since they are indeed coming from the RX channel. Link: https://lore.kernel.org/r/20220224152404.12877-1-cristian.marussi@arm.com Fixes: e9b21c96181c ("firmware: arm_scmi: Make .clear_channel optional") Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/firmware/arm_scmi/driver.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
index 46118300a4d1..e17c6568344d 100644
--- a/drivers/firmware/arm_scmi/driver.c
+++ b/drivers/firmware/arm_scmi/driver.c
@@ -679,7 +679,8 @@ static void scmi_handle_response(struct scmi_chan_info *cinfo,
xfer = scmi_xfer_command_acquire(cinfo, msg_hdr);
if (IS_ERR(xfer)) {
- scmi_clear_channel(info, cinfo);
+ if (MSG_XTRACT_TYPE(msg_hdr) == MSG_TYPE_DELAYED_RESP)
+ scmi_clear_channel(info, cinfo);
return;
}