All of lore.kernel.org
 help / color / mirror / Atom feed
From: Heikki Krogerus <heikki.krogerus@linux.intel.com>
To: RD Babiera <rdbabiera@google.com>
Cc: linux@roeck-us.net, gregkh@linuxfoundation.org,
	linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org,
	badhri@google.com, bryan.odonoghue@linaro.org, agross@kernel.org,
	andersson@kernel.org, konrad.dybcio@linaro.org
Subject: Re: [PATCH v2 09/12] usb: typec: tcpm: add state machine support for SRC_VDM_IDENTITY_REQUEST
Date: Tue, 19 Dec 2023 16:26:53 +0200	[thread overview]
Message-ID: <ZYGoLTm2VyU8cWfD@kuha.fi.intel.com> (raw)
In-Reply-To: <20231214230850.379863-23-rdbabiera@google.com>

On Thu, Dec 14, 2023 at 11:08:53PM +0000, RD Babiera wrote:
> Add SRC_VDM_IDENTITY_REQUEST state which first enters after SRC_STARTUP.
> The state sends Discover Identity on SOP' and transitions to
> SRC_SEND_CAPABILITIES. SRC_SEND_CAPABILITIES will transition back into
> SRC_VDM_IDENTITY_REQUEST instead of retrying immediately.
> 
> Signed-off-by: RD Babiera <rdbabiera@google.com>
> ---

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>

>  drivers/usb/typec/tcpm/tcpm.c | 49 ++++++++++++++++++++++++++++++-----
>  1 file changed, 43 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c
> index 5924e359e14d..e21bc2eea3fc 100644
> --- a/drivers/usb/typec/tcpm/tcpm.c
> +++ b/drivers/usb/typec/tcpm/tcpm.c
> @@ -146,7 +146,9 @@
>  	S(PORT_RESET_WAIT_OFF),			\
>  						\
>  	S(AMS_START),				\
> -	S(CHUNK_NOT_SUPP)
> +	S(CHUNK_NOT_SUPP),			\
> +						\
> +	S(SRC_VDM_IDENTITY_REQUEST)
>  
>  #define FOREACH_AMS(S)				\
>  	S(NONE_AMS),				\
> @@ -1956,6 +1958,7 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
>  					ret = tcpm_ams_start(port, VCONN_SWAP);
>  					if (!ret)
>  						return 0;
> +					/* Cannot perform Vconn swap */
>  					port->upcoming_state = INVALID_STATE;
>  					port->send_discover_prime = false;
>  				}
> @@ -1987,6 +1990,16 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
>  				 * the svdm_version for the cable moving forward.
>  				 */
>  				svdm_consume_identity_sop_prime(port, p, cnt);
> +
> +				/*
> +				 * If received in SRC_VDM_IDENTITY_REQUEST, continue
> +				 * to SRC_SEND_CAPABILITIES
> +				 */
> +				if (port->state == SRC_VDM_IDENTITY_REQUEST) {
> +					tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
> +					return 0;
> +				}
> +
>  				*response_tx_sop_type = TCPC_TX_SOP;
>  				response[0] = VDO(USB_SID_PD, 1,
>  						  typec_get_negotiated_svdm_version(typec),
> @@ -2281,7 +2294,8 @@ static void vdm_run_state_machine(struct tcpm_port *port)
>  		 * if there's traffic or we're not in PDO ready state don't send
>  		 * a VDM.
>  		 */
> -		if (port->state != SRC_READY && port->state != SNK_READY) {
> +		if (port->state != SRC_READY && port->state != SNK_READY &&
> +		    port->state != SRC_VDM_IDENTITY_REQUEST) {
>  			port->vdm_sm_running = false;
>  			break;
>  		}
> @@ -2357,13 +2371,22 @@ static void vdm_run_state_machine(struct tcpm_port *port)
>  			tcpm_ams_finish(port);
>  		break;
>  	case VDM_STATE_ERR_SEND:
> +		/*
> +		 * When sending Discover Identity to SOP' before establishing an
> +		 * explicit contract, do not retry. Instead, weave sending
> +		 * Source_Capabilities over SOP and Discover Identity over SOP'.
> +		 */
> +		if (port->state == SRC_VDM_IDENTITY_REQUEST) {
> +			tcpm_ams_finish(port);
> +			port->vdm_state = VDM_STATE_DONE;
> +			tcpm_set_state(port, SRC_SEND_CAPABILITIES, 0);
>  		/*
>  		 * A partner which does not support USB PD will not reply,
>  		 * so this is not a fatal error. At the same time, some
>  		 * devices may not return GoodCRC under some circumstances,
>  		 * so we need to retry.
>  		 */
> -		if (port->vdm_retries < 3) {
> +		} else if (port->vdm_retries < 3) {
>  			tcpm_log(port, "VDM Tx error, retry");
>  			port->vdm_retries++;
>  			port->vdm_state = VDM_STATE_READY;
> @@ -4477,8 +4500,12 @@ static void run_state_machine(struct tcpm_port *port)
>  		}
>  		ret = tcpm_pd_send_source_caps(port);
>  		if (ret < 0) {
> -			tcpm_set_state(port, SRC_SEND_CAPABILITIES,
> -				       PD_T_SEND_SOURCE_CAP);
> +			if (tcpm_can_communicate_sop_prime(port) &&
> +			    IS_ERR_OR_NULL(port->cable))
> +				tcpm_set_state(port, SRC_VDM_IDENTITY_REQUEST, 0);
> +			else
> +				tcpm_set_state(port, SRC_SEND_CAPABILITIES,
> +					       PD_T_SEND_SOURCE_CAP);
>  		} else {
>  			/*
>  			 * Per standard, we should clear the reset counter here.
> @@ -5393,6 +5420,15 @@ static void run_state_machine(struct tcpm_port *port)
>  		tcpm_pd_send_control(port, PD_CTRL_NOT_SUPP, TCPC_TX_SOP);
>  		tcpm_set_state(port, port->pwr_role == TYPEC_SOURCE ? SRC_READY : SNK_READY, 0);
>  		break;
> +
> +	/* Cable states */
> +	case SRC_VDM_IDENTITY_REQUEST:
> +		port->send_discover_prime = true;
> +		port->tx_sop_type = TCPC_TX_SOP_PRIME;
> +		mod_send_discover_delayed_work(port, 0);
> +		port->upcoming_state = SRC_SEND_CAPABILITIES;
> +		break;
> +
>  	default:
>  		WARN(1, "Unexpected port state %d\n", port->state);
>  		break;
> @@ -6118,7 +6154,8 @@ static void tcpm_send_discover_work(struct kthread_work *work)
>  	}
>  
>  	/* Retry if the port is not idle */
> -	if ((port->state != SRC_READY && port->state != SNK_READY) || port->vdm_sm_running) {
> +	if ((port->state != SRC_READY && port->state != SNK_READY &&
> +	     port->state != SRC_VDM_IDENTITY_REQUEST) || port->vdm_sm_running) {
>  		mod_send_discover_delayed_work(port, SEND_DISCOVER_RETRY_MS);
>  		goto unlock;
>  	}
> -- 
> 2.43.0.472.g3155946c3a-goog

-- 
heikki

  reply	other threads:[~2023-12-19 14:26 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-14 23:08 [PATCH v2 00/12] usb: typec: add SOP' support to the tcpm and alt mode drivers RD Babiera
2023-12-14 23:08 ` [PATCH v2 01/12] usb: typec: altmodes: add typec_cable_ops to typec_altmode RD Babiera
2023-12-16  2:21   ` kernel test robot
2023-12-17 15:11   ` kernel test robot
2023-12-14 23:08 ` [PATCH v2 02/12] usb: typec: altmodes: add svdm version info for typec cables RD Babiera
2023-12-19 13:54   ` Heikki Krogerus
2023-12-14 23:08 ` [PATCH v2 03/12] usb: typec: tcpci: add cable_comm_capable attribute RD Babiera
2023-12-19 13:55   ` Heikki Krogerus
2023-12-14 23:08 ` [PATCH v2 04/12] usb: typec: tcpci: add tcpm_transmit_type to tcpm_pd_receive RD Babiera
2023-12-19 13:59   ` Heikki Krogerus
2023-12-14 23:08 ` [PATCH v2 05/12] usb: typec: tcpm: process receive and transmission of sop' messages RD Babiera
2023-12-19 14:07   ` Heikki Krogerus
2024-01-08 19:13     ` RD Babiera
2023-12-14 23:08 ` [PATCH v2 06/12] usb: typec: tcpm: add control message support to sop' RD Babiera
2023-12-19 14:12   ` Heikki Krogerus
2023-12-14 23:08 ` [PATCH v2 07/12] usb: typec: tcpci: add attempt_vconn_swap_discovery callback RD Babiera
2023-12-19 14:17   ` Heikki Krogerus
2023-12-14 23:08 ` [PATCH v2 08/12] usb: typec: tcpm: add discover identity support for SOP' RD Babiera
2023-12-19 14:26   ` Heikki Krogerus
2023-12-14 23:08 ` [PATCH v2 09/12] usb: typec: tcpm: add state machine support for SRC_VDM_IDENTITY_REQUEST RD Babiera
2023-12-19 14:26   ` Heikki Krogerus [this message]
2023-12-14 23:08 ` [PATCH v2 10/12] usb: typec: tcpm: add discover svids and discover modes support for sop' RD Babiera
2023-12-19 14:32   ` Heikki Krogerus
2024-01-08 19:02     ` RD Babiera
2023-12-14 23:08 ` [PATCH v2 11/12] usb: typec: tcpm: add alt mode enter/exit/vdm " RD Babiera
2023-12-14 23:08 ` [PATCH v2 12/12] usb: typec: altmodes/displayport: add SOP' support RD Babiera
2024-01-02 14:02   ` Dan Carpenter

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=ZYGoLTm2VyU8cWfD@kuha.fi.intel.com \
    --to=heikki.krogerus@linux.intel.com \
    --cc=agross@kernel.org \
    --cc=andersson@kernel.org \
    --cc=badhri@google.com \
    --cc=bryan.odonoghue@linaro.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=konrad.dybcio@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-usb@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=rdbabiera@google.com \
    /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.