From: sashiko-bot@kernel.org
To: "Louis-Alexis Eyraud" <louisalexis.eyraud@collabora.com>
Cc: linux-phy@lists.infradead.org, devicetree@vger.kernel.org,
linux-scsi@vger.kernel.org, robh@kernel.org, conor+dt@kernel.org,
vkoul@kernel.org, neil.armstrong@linaro.org, olteanv@gmail.com
Subject: Re: [PATCH v14 14/23] scsi: ufs: mediatek: Use the common PHY framework
Date: Fri, 16 Oct 2026 12:50:59 +0000 [thread overview]
Message-ID: <sashiko-outbox-174338@kernel.org> (raw)
In-Reply-To: <20261016-mt8196-ufs-v14-14-e8d565e0cd45@collabora.com>
Thank you for your contribution! Sashiko AI review found 4 potential issue(s) to consider:
- [High] ufs/mediatek: PM state machine desync on PHY power-off failure
- [High] scsi: ufs: mediatek: PHY incorrectly powered off during active link runtime suspend
- [Medium] ufs/mediatek: resource leak of PHY initialization on error path
- [Medium] ufs/mediatek: PHY state desynchronization on regulator disable failure
--
commit d74957280789302bafd051c97a8d0add4f2d400a
Author: Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
scsi: ufs: mediatek: Use the common PHY framework
This patch transitions the Mediatek UFS driver to use the common PHY framework
instead of custom OF parsing and manual PHY device power management. It updates
ufs_mtk_init() to acquire and initialize the PHY via standard APIs and replaces
pm_runtime_get_sync()/put_sync() calls with direct PHY power control.
> diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c
> index 41e2e9f867013..808365b880fd7 100644
> --- a/drivers/ufs/host/ufs-mediatek.c
> +++ b/drivers/ufs/host/ufs-mediatek.c
[ ... ]
> @@ -1319,11 +1289,22 @@ static int ufs_mtk_init(struct ufs_hba *hba)
>
> return 0;
>
> +out_phy_exit:
> + phy_exit(host->mphy);
> out_variant_clear:
> ufshcd_set_variant(hba, NULL);
> return err;
> }
[Severity: Medium]
Does this error path bypass phy_exit() if ufs_mtk_mphy_power_on() fails?
Earlier in ufs_mtk_init(), phy_init(host->mphy) is called successfully. Later
in the same function, if ufs_mtk_mphy_power_on(hba, true) fails, the code
jumps directly to out_variant_clear:
err = ufs_mtk_mphy_power_on(hba, true);
if (err)
goto out_variant_clear;
Since out_variant_clear is physically below out_phy_exit, this skips the
newly introduced phy_exit(host->mphy) call, leaking the PHY initialization.
[ ... ]
> @@ -2533,8 +2477,11 @@ static int ufs_mtk_runtime_suspend(struct device *dev)
> if (ufs_mtk_is_rtff_mtcmos(hba))
> ufs_mtk_mtcmos_ctrl(false, res);
>
> - if (host->phy_dev)
> - pm_runtime_put_sync(host->phy_dev);
> + ret = ufs_mtk_mphy_power_on(hba, false);
> + if (ret) {
> + dev_err(dev, "Failed to power off PHY: %pe\n", ERR_PTR(ret));
> + return ret;
> + }
>
> return 0;
> }
[Severity: High]
Does returning an error here break the runtime PM contract?
Before reaching this code, ufshcd_runtime_suspend(dev) has already suspended
the UFS controller, and ufs_mtk_dev_vreg_set_lpm() has put regulators into
low-power mode. Returning an error signals failure to the PM core, which
aborts the suspend transition and leaves the device status as RPM_ACTIVE.
Because the underlying hardware is already powered off, subsequent I/O
requests will bypass runtime_resume() and access unpowered hardware. This
can lead to bus timeouts or kernel crashes.
[Severity: High]
Does this unconditional power down break configurations where the UFS link
is meant to remain active during runtime PM?
If the system is configured to keep the link active during runtime suspend,
the host controller can still be suspended once the device WLUN is suspended.
Previously, pm_runtime_put_sync() would not physically power off the PHY
because the Mediatek PHY driver lacks runtime PM ops. Instead, PHY power was
safely managed by ufs_mtk_pwr_ctrl() which explicitly checks the link state
and skips power-down if the link is active.
By replacing this with an unconditional ufs_mtk_mphy_power_on(hba, false),
this function blindly calls phy_power_off() regardless of the link state.
This forces the PHY off while the MAC/SCSI layers expect it to remain active,
causing UFS access to hang on wake.
[Severity: Medium]
Can this call lead to a state desynchronization if the regulator disable
fails?
Inside the ufs_mtk_mphy_power_on(hba, false) helper function, the code powers
down the hardware and then disables the regulators:
} else {
phy_power_off(mphy);
ret = ufs_mtk_09v_off(host, true);
if (ret)
return ret;
}
host->mphy_powered_on = on;
If ufs_mtk_09v_off() fails, it returns early. This skips the assignment
of host->mphy_powered_on = on (which would be false). Software will retain
the belief that the PHY is still powered on.
When the device subsequently resumes, ufs_mtk_mphy_power_on(hba, true) checks
if (on == host->mphy_powered_on) which evaluates to true == true, returning 0
without calling phy_power_on(mphy). This leaves the hardware physically off
while the driver expects it to be on, causing the UFS link to fail.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261016-mt8196-ufs-v14-0-e8d565e0cd45@collabora.com?part=14
next prev parent reply other threads:[~2026-10-16 12:51 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-16 12:32 [PATCH v14 00/23] MediaTek UFS Cleanup and MT8196 Enablement Louis-Alexis Eyraud
2026-10-16 12:32 ` [PATCH v14 01/23] dt-bindings: phy: Add mediatek,mt8196-ufsphy variant Louis-Alexis Eyraud
2026-10-16 12:32 ` [PATCH v14 02/23] dt-bindings: ufs: mediatek,ufs: Complete the binding Louis-Alexis Eyraud
2026-10-16 12:46 ` sashiko-bot
2026-10-16 12:32 ` [PATCH v14 03/23] dt-bindings: ufs: mediatek,ufs: Add mt8196 variant Louis-Alexis Eyraud
2026-10-16 12:32 ` [PATCH v14 04/23] scsi: ufs: mediatek: Move MTK_SIP_UFS_CONTROL to mtk_sip_svc.h Louis-Alexis Eyraud
2026-10-16 12:32 ` [PATCH v14 05/23] phy: mediatek: ufs: Add support for resets Louis-Alexis Eyraud
2026-10-16 12:46 ` sashiko-bot
2026-10-16 12:32 ` [PATCH v14 06/23] scsi: ufs: mediatek: Rework resets Louis-Alexis Eyraud
2026-10-16 12:32 ` [PATCH v14 07/23] scsi: ufs: mediatek: Rework 0.9V regulator Louis-Alexis Eyraud
2026-10-16 12:44 ` sashiko-bot
2026-10-16 12:33 ` [PATCH v14 08/23] scsi: ufs: mediatek: Add dual 0.9V supply support Louis-Alexis Eyraud
2026-10-16 12:43 ` sashiko-bot
2026-10-16 12:33 ` [PATCH v14 09/23] scsi: ufs: mediatek: Rework init function Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 10/23] scsi: ufs: mediatek: Rework the crypt-boost stuff Louis-Alexis Eyraud
2026-10-16 12:43 ` sashiko-bot
2026-10-16 12:33 ` [PATCH v14 11/23] scsi: ufs: mediatek: Handle misc host voltage regulators Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 12/23] scsi: ufs: mediatek: Remove undocumented downstream reset cruft Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 13/23] scsi: ufs: mediatek: Remove vendor kernel quirks cruft Louis-Alexis Eyraud
2026-10-16 12:43 ` sashiko-bot
2026-10-16 12:33 ` [PATCH v14 14/23] scsi: ufs: mediatek: Use the common PHY framework Louis-Alexis Eyraud
2026-10-16 12:50 ` sashiko-bot [this message]
2026-10-16 12:33 ` [PATCH v14 15/23] scsi: ufs: mediatek: Remove mediatek,ufs-broken-rtc property Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 16/23] scsi: ufs: mediatek: Rework _ufs_mtk_clk_scale error paths Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 17/23] scsi: ufs: mediatek: Clean up logging prints Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 18/23] scsi: ufs: mediatek: Rework ufs_mtk_wait_idle_state Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 19/23] scsi: ufs: mediatek: Don't acquire dvfsrc-vcore twice Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 20/23] scsi: ufs: mediatek: Rework hardware version reading Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 21/23] scsi: ufs: mediatek: Remove ret local from link_startup_notify Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 22/23] scsi: ufs: mediatek: Remove undocumented "clk-scale-up-vcore-min" Louis-Alexis Eyraud
2026-10-16 12:33 ` [PATCH v14 23/23] scsi: ufs: mediatek: Add MT8196 compatible, update copyright Louis-Alexis Eyraud
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=sashiko-outbox-174338@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=linux-phy@lists.infradead.org \
--cc=linux-scsi@vger.kernel.org \
--cc=louisalexis.eyraud@collabora.com \
--cc=neil.armstrong@linaro.org \
--cc=olteanv@gmail.com \
--cc=robh@kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
--cc=vkoul@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox