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
next prev parent 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox