lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.13 306/351] firmware: arm_scmi: Reset Rx buffer to max size during async commands
    Date
    From: Cristian Marussi <cristian.marussi@arm.com>

    [ 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>
    ---
    drivers/firmware/arm_scmi/driver.c | 4 ++++
    1 file changed, 4 insertions(+)

    diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c
    index 66eb3f0e5daf..5e8e9337adc7 100644
    --- a/drivers/firmware/arm_scmi/driver.c
    +++ b/drivers/firmware/arm_scmi/driver.c
    @@ -335,6 +335,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);
    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-19 19:53    [W:4.069 / U:0.380 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site