Re: [PATCH] usb: typec: tipd: don't send GAID when probe fails in APP mode

Heikki Krogerus <[email protected]>
Newsgroups org.kernel.vger.linux-usb,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Thu, Aug 06, 2026 at 11:53:02AM +0300, Marian Rotariu wrote:
> When probe fails after the chip was already in APP mode (booted from
> EEPROM), the err_reset_controller path unconditionally calls
> tps->data->reset(), which for tps25750 sends the GAID 4CC command.
> GAID transitions the chip from APP back to PTCH, causing a second
> probe attempt that sees PTCH mode and tries to load the firmware from
> /lib/firmware, instead of reading the EEPROM as it should.
> 
> The err_reset_controller path can be triggered by -EPROBE_DEFER from
> the probe sequence. GAID should only be sent when the controller
> actually loaded firmware at probe time.
> 
> The abnormal behavior was seen on a tps25751d that has an EEPROM
> connected to it.
> 
> Fixes: d49f90822015 ("usb: typec: tipd: add init and reset functions to tipd_data")
> Signed-off-by: Marian Rotariu <[email protected]>

This needs the CC stable tag.

Reviewed-by: Heikki Krogerus <[email protected]>

> ---
>  drivers/usb/typec/tipd/core.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/typec/tipd/core.c b/drivers/usb/typec/tipd/core.c
> index 522f56742aa9..c2b235f3c225 100644
> --- a/drivers/usb/typec/tipd/core.c
> +++ b/drivers/usb/typec/tipd/core.c
> @@ -1783,6 +1783,7 @@ static int tps6598x_probe(struct i2c_client *client)
>  	const struct tipd_data *data;
>  	struct tps6598x *tps;
>  	struct fwnode_handle *fwnode;
> +	bool patch_loaded = false;
>  	u32 status;
>  	u32 vid = 0;
>  	int ret;
> @@ -1838,6 +1839,7 @@ static int tps6598x_probe(struct i2c_client *client)
>  		return ret;
>  
>  	if (ret == TPS_MODE_PTCH) {
> +		patch_loaded = true;
>  		ret = tps->data->init(tps);
>  		if (ret)
>  			return ret;
> @@ -1928,7 +1930,8 @@ static int tps6598x_probe(struct i2c_client *client)
>  	tps6598x_write64(tps, TPS_REG_INT_MASK1, 0);
>  err_reset_controller:
>  	/* Reset PD controller to remove any applied patch */
> -	tps->data->reset(tps);
> +	if (patch_loaded)
> +		tps->data->reset(tps);
>  
>  	return ret;
>  }
> -- 
> 2.53.0

-- 
heikki
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.