Hi,

On Sun, Jun 21, 2026 at 10:06:38AM +0800, Peng Fan (OSS) wrote:
> From: Peng Fan <[email protected]>
> 
> After reaching SNK_READY or SRC_READY, the poll loop exits immediately.
> However, some PD sources send follow-up messages (e.g., Get_Sink_Cap,
> Get_Status) shortly after the explicit contract is established. Since
> the TCPCI hardware auto-sends GoodCRC for received messages, the
> source expects a timely response. If no response arrives within
> SenderResponseTimer (24-30ms), the source sends a Hard Reset,
> causing VBUS to drop and resetting VBUS-powered boards.
> 
> Add a 500ms settling period after reaching Ready state to process
> any follow-up messages from the source before entering low power
> mode and disabling PD message reception.
> 
> Signed-off-by: Peng Fan <[email protected]>
> ---

Reviewed-by: Sebastian Reichel <[email protected]>

Greetings,

-- Sebastian

>  drivers/usb/tcpm/tcpm.c | 10 ++++++++++
>  1 file changed, 10 insertions(+)
> 
> diff --git a/drivers/usb/tcpm/tcpm.c b/drivers/usb/tcpm/tcpm.c
> index 25ff0926cdf..d6af0fae7c1 100644
> --- a/drivers/usb/tcpm/tcpm.c
> +++ b/drivers/usb/tcpm/tcpm.c
> @@ -2252,6 +2252,16 @@ static void tcpm_poll_event(struct udevice *dev)
>               tcpm_check_and_run_delayed_work(dev);
>       }
>  
> +     if (port->state == SNK_READY || port->state == SRC_READY) {
> +             int settle;
> +
> +             for (settle = 0; settle < 1000; settle++) {
> +                     drvops->poll_event(dev);
> +                     udelay(500);
> +                     tcpm_check_and_run_delayed_work(dev);
> +             }
> +     }
> +
>       if (port->state != SNK_READY && port->state != SRC_READY)
>               dev_warn(dev, "TCPM: exit in state %s\n",
>                        tcpm_states[port->state]);
> 
> -- 
> 2.51.0
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to