On 6/17/26 10:23, Peng Fan (OSS) wrote:
From: Peng Fan <[email protected]>The read_poll_timeout() macro breaks out of its loop when the condition evaluates to true. The current code uses "!tx_complete" as the condition, which means it exits immediately when tx_complete is false (i.e., transmission has NOT completed yet), rather than waiting for completion. Fix the condition to "tx_complete" so that the poll loop waits until the TCPC signals transmission success/failure/discard before proceeding. Without this fix, tcpm_pd_transmit() returns before the TCPC has finished transmitting, causing the PD state machine to proceed with stale tx_status values. Fixes: 1db4c0ac77e3 ("usb: tcpm: add core framework") Signed-off-by: Peng Fan <[email protected]> --- drivers/usb/tcpm/tcpm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c index 3061b466d7c..d6c0be82333 100644 --- a/drivers/usb/tcpm/tcpm.c +++ b/drivers/usb/tcpm/tcpm.c @@ -207,7 +207,7 @@ static int tcpm_pd_transmit(struct udevice *dev, */ timeout_us *= 5; ret = read_poll_timeout(tcpm_transmit_helper, tx_complete, - !tx_complete, false, timeout_us, dev); + tx_complete, false, timeout_us, dev); if (ret < 0) { dev_err(dev, "TCPM: PD transmit data failed: %d\n", ret); return ret;
I just figured out the similar patch sent last year was never applied: https://lore.kernel.org/all/[email protected]/ Whichever patch is applied it fine for me: Reviewed-by: Neil Armstrong <[email protected]> Neil

