Received: by 2002:a05:7412:8598:b0:f9:33c2:5753 with SMTP id n24csp537301rdh; Tue, 19 Dec 2023 06:31:45 -0800 (PST) X-Google-Smtp-Source: AGHT+IH0N75npyjRJjN/3eyrOpAtiNhlftLaaXZvZkVxXG/OqX0wTojzMnFb6jKJKPb8D7V0CD67 X-Received: by 2002:a05:620a:800a:b0:77f:8bd:7308 with SMTP id ee10-20020a05620a800a00b0077f08bd7308mr22104543qkb.157.1702996305252; Tue, 19 Dec 2023 06:31:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702996305; cv=none; d=google.com; s=arc-20160816; b=YSmbhS6VPnnrgFtDhB/6+agBSCQLDp3rb0E7kh3tJvBEWWrk2Mn+xA6iqAZtVNct5y 51SRzUDa3ADaw5CjI0rtjOzOqlKkBMi+lGoYazEsTF8+p3OHryo/J1rnn5w/czWZn3Su L9U2ffEkSxekJzmFClTXR71BFoxeQaKHBmh+UF6Q2hGxCxdI1oxlTP6ZJZcMGnT/do8u mvfuXAqycFeKI0lHZmw4vux55VA/2F5Ifgf6M134DjC3rnRAKcP6rGrBA7N3M6sgEfOO Yyl78fEXs9yJn75uuJw1eTAy3hM4FgqudLesGnZgqlb9OCNKwzfucNvOOh3SpP0J0fDe VZsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature; bh=T8mJ4s0+oIEH1Vx6yswmWewYhNKEmd3psKV/S3Ug72k=; fh=+mOxChHccjSODygiHZulvC2wWQHtOLOc3+c+fn6v4mM=; b=JvZ8M1Rke/wwy0VBpQcJbrqslli22CN2/Lb38SVCX6lBP+wTEmyGmN4uvafMXngcwh DYY6NkmTti42L3y5znRN12vyk4eOd2rF87JGfD75d2X3xvitf0hy7uvHE5X+rhG+XVJ1 EkvcZRdqNOL4WAxpgDA9xtK3GpmnyZomgmnHsgXQLXexFpsiqsd6w3vPTYpxTdDbyNfE fDF/ubBrE+Mdrlu2ppomwJ+kITxdFUx4/8MmoMpKHH7fSg06DTKpaL25QzDlqJMdyH9M 5g6FwWJt3xb11Ng2zDBtNoQc5HSWHCuoQjiBsVdlPBvZlJXeCU4tiyVjzg81p60MlSog 8QTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Zrqj5KUe; spf=pass (google.com: domain of linux-kernel+bounces-5370-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-5370-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id p6-20020a05620a22a600b007725a68ea34si15177111qkh.89.2023.12.19.06.31.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Dec 2023 06:31:45 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-5370-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Zrqj5KUe; spf=pass (google.com: domain of linux-kernel+bounces-5370-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-5370-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id E85AE1C210C3 for ; Tue, 19 Dec 2023 14:31:44 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 189BA36B13; Tue, 19 Dec 2023 14:27:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=intel.com header.i=@intel.com header.b="Zrqj5KUe" X-Original-To: linux-kernel@vger.kernel.org Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.31]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 28AD1374FA; Tue, 19 Dec 2023 14:26:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.intel.com Authentication-Results: smtp.subspace.kernel.org; spf=none smtp.mailfrom=linux.intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1702996018; x=1734532018; h=date:from:to:cc:subject:message-id:references: mime-version:in-reply-to; bh=NMTALL5LaLth0gU3WHVwSBfrCq2Dr+XUdfUtUbJYJx4=; b=Zrqj5KUeT1y5o9UKt3BtVf8aKxnWQO4cuHJPWbXZLkY3vUZqUQ2h/azh PZDHQAkvxG+r+Ih8Z9FwrueWzgfJgycF8d8x0w2sB34rpia4uPrbmTMNI YMGarM7Ndgqn783ervelxX62xDdLmlVm8d2vMuwzLWK11mCH3F+/eK8tf fvCBfAcKewNRKg9yI6ukn6DR0A9J7DhGfxDyJdmvjK+Zl3wiufHLiz5q8 y328WfTDRH7Nn4WaEcCZJZPfGZBooawzTErE/qrXoxFue8tEpbGdZfRmC 3QF1ENI3hnh2vTaHR1+6e3CpFnM8jTqj/uRJwo8JZG46JC+crcqE/74wD g==; X-IronPort-AV: E=McAfee;i="6600,9927,10929"; a="460006287" X-IronPort-AV: E=Sophos;i="6.04,288,1695711600"; d="scan'208";a="460006287" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Dec 2023 06:26:57 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10929"; a="894310521" X-IronPort-AV: E=Sophos;i="6.04,288,1695711600"; d="scan'208";a="894310521" Received: from kuha.fi.intel.com ([10.237.72.185]) by fmsmga002.fm.intel.com with SMTP; 19 Dec 2023 06:26:54 -0800 Received: by kuha.fi.intel.com (sSMTP sendmail emulation); Tue, 19 Dec 2023 16:26:53 +0200 Date: Tue, 19 Dec 2023 16:26:53 +0200 From: Heikki Krogerus To: RD Babiera 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 Message-ID: References: <20231214230850.379863-14-rdbabiera@google.com> <20231214230850.379863-23-rdbabiera@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 > --- Reviewed-by: Heikki Krogerus > 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