All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benson Leung <bleung@google.com>
To: Andrei Kuchynski <akuchynski@chromium.org>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>,
	linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org,
	Madhu M <madhu.m@intel.corp-partner.google.com>
Subject: Re: [PATCH v2] usb: typec: thunderbolt: Set enter_vdo during initialization
Date: Fri, 27 Mar 2026 17:55:24 +0000	[thread overview]
Message-ID: <acbEjA9TjKPslH21@google.com> (raw)
In-Reply-To: <20260324103012.1417616-1-akuchynski@chromium.org>

[-- Attachment #1: Type: text/plain, Size: 3547 bytes --]

On Tue, Mar 24, 2026 at 10:30:12AM +0000, Andrei Kuchynski wrote:
> In the current implementation, if a cable's alternate mode enter operation
> is not supported, the tbt->plug[TYPEC_PLUG_SOP_P] pointer is cleared by the
> time tbt_enter_mode() is called. This prevents the driver from identifying
> the cable's VDO.
> 
> As a result, the Thunderbolt connection falls back to the default
> TBT_CABLE_USB3_PASSIVE speed, even if the cable supports higher speeds.
> To ensure the correct VDO value is used during mode entry, calculate and
> store the enter_vdo earlier during the initialization phase in tbt_ready().
> 
> Cc: stable@vger.kernel.org
> Fixes: 100e25738659 ("usb: typec: Add driver for Thunderbolt 3 Alternate Mode")
> Tested-by: Madhu M <madhu.m@intel.corp-partner.google.com>
> Signed-off-by: Andrei Kuchynski <akuchynski@chromium.org>
> Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

Reviewed-by: Benson Leung <bleung@chromium.org>

> ---
> Changes in V2:
> - Marked as a Fix
> 
>  drivers/usb/typec/altmodes/thunderbolt.c | 44 ++++++++++++------------
>  1 file changed, 22 insertions(+), 22 deletions(-)
> 
> diff --git a/drivers/usb/typec/altmodes/thunderbolt.c b/drivers/usb/typec/altmodes/thunderbolt.c
> index c4c5da6154da9..32250b94262a9 100644
> --- a/drivers/usb/typec/altmodes/thunderbolt.c
> +++ b/drivers/usb/typec/altmodes/thunderbolt.c
> @@ -39,28 +39,7 @@ static bool tbt_ready(struct typec_altmode *alt);
>  
>  static int tbt_enter_mode(struct tbt_altmode *tbt)
>  {
> -	struct typec_altmode *plug = tbt->plug[TYPEC_PLUG_SOP_P];
> -	u32 vdo;
> -
> -	vdo = tbt->alt->vdo & (TBT_VENDOR_SPECIFIC_B0 | TBT_VENDOR_SPECIFIC_B1);
> -	vdo |= tbt->alt->vdo & TBT_INTEL_SPECIFIC_B0;
> -	vdo |= TBT_MODE;
> -
> -	if (plug) {
> -		if (typec_cable_is_active(tbt->cable))
> -			vdo |= TBT_ENTER_MODE_ACTIVE_CABLE;
> -
> -		vdo |= TBT_ENTER_MODE_CABLE_SPEED(TBT_CABLE_SPEED(plug->vdo));
> -		vdo |= plug->vdo & TBT_CABLE_ROUNDED;
> -		vdo |= plug->vdo & TBT_CABLE_OPTICAL;
> -		vdo |= plug->vdo & TBT_CABLE_RETIMER;
> -		vdo |= plug->vdo & TBT_CABLE_LINK_TRAINING;
> -	} else {
> -		vdo |= TBT_ENTER_MODE_CABLE_SPEED(TBT_CABLE_USB3_PASSIVE);
> -	}
> -
> -	tbt->enter_vdo = vdo;
> -	return typec_altmode_enter(tbt->alt, &vdo);
> +	return typec_altmode_enter(tbt->alt, &tbt->enter_vdo);
>  }
>  
>  static void tbt_altmode_work(struct work_struct *work)
> @@ -337,6 +316,7 @@ static bool tbt_ready(struct typec_altmode *alt)
>  {
>  	struct tbt_altmode *tbt = typec_altmode_get_drvdata(alt);
>  	struct typec_altmode *plug;
> +	u32 vdo;
>  
>  	if (tbt->cable)
>  		return true;
> @@ -364,6 +344,26 @@ static bool tbt_ready(struct typec_altmode *alt)
>  		tbt->plug[i] = plug;
>  	}
>  
> +	vdo = tbt->alt->vdo & (TBT_VENDOR_SPECIFIC_B0 | TBT_VENDOR_SPECIFIC_B1);
> +	vdo |= tbt->alt->vdo & TBT_INTEL_SPECIFIC_B0;
> +	vdo |= TBT_MODE;
> +	plug = tbt->plug[TYPEC_PLUG_SOP_P];
> +
> +	if (plug) {
> +		if (typec_cable_is_active(tbt->cable))
> +			vdo |= TBT_ENTER_MODE_ACTIVE_CABLE;
> +
> +		vdo |= TBT_ENTER_MODE_CABLE_SPEED(TBT_CABLE_SPEED(plug->vdo));
> +		vdo |= plug->vdo & TBT_CABLE_ROUNDED;
> +		vdo |= plug->vdo & TBT_CABLE_OPTICAL;
> +		vdo |= plug->vdo & TBT_CABLE_RETIMER;
> +		vdo |= plug->vdo & TBT_CABLE_LINK_TRAINING;
> +	} else {
> +		vdo |= TBT_ENTER_MODE_CABLE_SPEED(TBT_CABLE_USB3_PASSIVE);
> +	}
> +
> +	tbt->enter_vdo = vdo;
> +
>  	return true;
>  }
>  
> -- 
> 2.53.0.983.g0bb29b3bc5-goog
> 
> 

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 228 bytes --]

      reply	other threads:[~2026-03-27 17:55 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-24 10:30 [PATCH v2] usb: typec: thunderbolt: Set enter_vdo during initialization Andrei Kuchynski
2026-03-27 17:55 ` Benson Leung [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=acbEjA9TjKPslH21@google.com \
    --to=bleung@google.com \
    --cc=akuchynski@chromium.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=heikki.krogerus@linux.intel.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=madhu.m@intel.corp-partner.google.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.