]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
i3c: mipi-i3c-hci: Wait for DMA ring restart to complete
authorAdrian Hunter <adrian.hunter@intel.com>
Wed, 3 Jun 2026 09:07:41 +0000 (12:07 +0300)
committerAlexandre Belloni <alexandre.belloni@bootlin.com>
Sun, 14 Jun 2026 15:21:33 +0000 (17:21 +0200)
Although hci_dma_dequeue_xfer() is serialized against itself via
control_mutex, this does not guarantee that a DMA ring restart
triggered by a previous invocation has fully completed.

When the function is called again in rapid succession, the DMA ring may
still be transitioning back to the running state, which may confound or
disrupt further state changes.

Address this by waiting for the DMA ring restart to complete before
continuing.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20260603090754.16252-5-adrian.hunter@intel.com
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
drivers/i3c/master/mipi-i3c-hci/dma.c

index c3da6eab8eaec8bd604ed14054a75d89cc28f577..3b14bc87bdf6103fa60354f97592bc7121d92d99 100644 (file)
@@ -617,6 +617,7 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci,
        }
 
        /* restart the ring */
+       reinit_completion(&rh->op_done);
        mipi_i3c_hci_resume(hci);
        rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE);
        rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE | RING_CTRL_RUN_STOP);
@@ -625,6 +626,8 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci,
 
        spin_unlock_irq(&hci->lock);
 
+       wait_for_completion_timeout(&rh->op_done, HZ);
+
        return did_unqueue;
 }