From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: AceLan Kao <acelan.kao@canonical.com>
Cc: Heikki Krogerus <heikki.krogerus@linux.intel.com>,
Benson Leung <bleung@chromium.org>,
Jameson Thies <jthies@google.com>,
Myrrh Periwinkle <myrrhperiwinkle@qtmlabs.xyz>,
Pooja Katiyar <pooja.katiyar@intel.com>,
Hsin-Te Yuan <yuanhsinte@chromium.org>,
Johan Hovold <johan@kernel.org>,
Dmitry Baryshkov <dmitry.baryshkov@oss.qualcomm.com>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2] usb: typec: ucsi: recover from silent PPM completion in sync_control
Date: Wed, 8 Jul 2026 07:09:54 +0200 [thread overview]
Message-ID: <2026070850-studied-dash-42e2@gregkh> (raw)
In-Reply-To: <20260708022420.3914391-1-acelan.kao@canonical.com>
On Wed, Jul 08, 2026 at 10:24:20AM +0800, AceLan Kao wrote:
> From: "Chia-Lin Kao (AceLan)" <acelan.kao@canonical.com>
>
> Some firmware completes UCSI commands and sets COMMAND_COMPLETE (or
> ACK_COMPLETE for ACK_CC_CI) in CCI but never fires the ACPI notify that
> would wake ucsi_sync_control_common(). The driver then times out after
> 5 seconds and returns -ETIMEDOUT, even though the EC finished the command
> successfully.
>
> Fix this by polling CCI once via poll_cci() on timeout. If the relevant
> completion bit is already set, the EC finished silently; fall through to
> out_clear_bit so the normal read_cci()/read_message_in() path retrieves
> the data and ucsi_run_command() issues ACK_CC_CI as usual. Only return
> -ETIMEDOUT when the EC has genuinely not completed the command.
>
> Guard the poll_cci() call with a NULL check: if a backend does not
> provide the op, skip the poll and keep reporting -ETIMEDOUT rather than
> dereferencing a NULL function pointer.
>
> Fixes: 584e8df58942 ("usb: typec: ucsi: extract common code for command handling")
> Cc: <stable@vger.kernel.org> # 6.14+
> Signed-off-by: Chia-Lin Kao (AceLan) <acelan.kao@canonical.com>
>
> ---
> v1 -> v2:
> - Add Cc: <stable@vger.kernel.org> # 6.14+ as flagged by Greg's patch bot:
> the Fixes: tag targets a commit already in released kernels, so the fix
> must be nominated for stable. Scoped to 6.14+ because poll_cci only
> exists from that release (absent in 6.11-6.13).
> - Guard the poll_cci() call with a NULL check to avoid dereferencing a
> NULL function pointer when a backend does not provide the op.
> ---
> drivers/usb/typec/ucsi/ucsi.c | 25 +++++++++++++++++++++++--
> 1 file changed, 23 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/usb/typec/ucsi/ucsi.c b/drivers/usb/typec/ucsi/ucsi.c
> index 9eeb38e7472c..deda7123b5d1 100644
> --- a/drivers/usb/typec/ucsi/ucsi.c
> +++ b/drivers/usb/typec/ucsi/ucsi.c
> @@ -91,8 +91,29 @@ int ucsi_sync_control_common(struct ucsi *ucsi, u64 command, u32 *cci,
> if (ret)
> goto out_clear_bit;
>
> - if (!wait_for_completion_timeout(&ucsi->complete, 5 * HZ))
> - ret = -ETIMEDOUT;
> + if (!wait_for_completion_timeout(&ucsi->complete, 5 * HZ)) {
> + u32 polled_cci = 0;
> +
> + /*
> + * Notification from EC did not arrive. Poll once to check
> + * whether the PPM actually finished without firing a notify.
> + * If poll_cci() is missing or fails, polled_cci stays 0 and we
> + * correctly report -ETIMEDOUT below.
> + */
> + if (ucsi->ops->poll_cci)
> + ucsi->ops->poll_cci(ucsi, &polled_cci);
> +
> + if ((ack && (polled_cci & UCSI_CCI_ACK_COMPLETE)) ||
> + (!ack && (polled_cci & UCSI_CCI_COMMAND_COMPLETE))) {
> + /*
> + * EC completed the command silently. Proceed to
> + * out_clear_bit which reads CCI+data normally, and
> + * ucsi_run_command() will issue ACK_CC_CI as usual.
> + */
> + } else {
> + ret = -ETIMEDOUT;
> + }
This is an odd way to write an if () statement, why not reverse it so
that there is no need for an else {} at all?
thanks,
greg k-h
prev parent reply other threads:[~2026-07-08 5:12 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-16 2:00 [PATCH] usb: typec: ucsi: recover from silent PPM completion in sync_control Chia-Lin Kao (AceLan)
2026-06-16 2:26 ` Greg KH
2026-07-08 2:17 ` [PATCH v2] " Chia-Lin Kao (AceLan)
2026-07-08 2:24 ` AceLan Kao
2026-07-08 5:09 ` Greg Kroah-Hartman [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=2026070850-studied-dash-42e2@gregkh \
--to=gregkh@linuxfoundation.org \
--cc=acelan.kao@canonical.com \
--cc=bleung@chromium.org \
--cc=dmitry.baryshkov@oss.qualcomm.com \
--cc=heikki.krogerus@linux.intel.com \
--cc=johan@kernel.org \
--cc=jthies@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=myrrhperiwinkle@qtmlabs.xyz \
--cc=pooja.katiyar@intel.com \
--cc=yuanhsinte@chromium.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.