diff --git a/drivers/mailbox/msm_qmp.c b/drivers/mailbox/msm_qmp.c index 96384d420455..726f65677b5b 100644 --- a/drivers/mailbox/msm_qmp.c +++ b/drivers/mailbox/msm_qmp.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2017-2020, The Linux Foundation. All rights reserved. */ #include @@ -377,6 +377,7 @@ static int qmp_send_data(struct mbox_chan *chan, void *data) struct qmp_pkt *pkt = (struct qmp_pkt *)data; void __iomem *addr; unsigned long flags; + u32 size; int i; if (!mbox || !data || mbox->local_state != CHANNEL_CONNECTED) @@ -398,13 +399,15 @@ static int qmp_send_data(struct mbox_chan *chan, void *data) memcpy32_toio(addr + sizeof(pkt->size), pkt->data, pkt->size); iowrite32(pkt->size, addr); + /* readback to ensure write reflects in msgram */ + size = ioread32(addr); mbox->tx_sent = true; for (i = 0; i < mbox->ctrl.num_chans; i++) { if (chan == &mbox->ctrl.chans[i]) mbox->idx_in_flight = i; } QMP_INFO(mdev->ilc, "Copied buffer to msgram sz:%d i:%d\n", - pkt->size, mbox->idx_in_flight); + size, mbox->idx_in_flight); send_irq(mdev); qmp_schedule_tx_timeout(mbox); spin_unlock_irqrestore(&mbox->tx_lock, flags);