From: Frank Wunderlich <linux@fw-web.de>
To: Stephen Boyd <sboyd@kernel.org>,
Brian Masney <bmasney+clk@redhat.com>,
Jerome Brunet <jbrunet+clk@baylibre.com>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>,
Mathias Nyman <mathias.nyman@intel.com>,
Chunfeng Yun <chunfeng.yun@mediatek.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: "Frank Wunderlich" <frank.wunderlich@linux.dev>,
Frank Wunderlich <frank-w@public-files.de>,
Daniel Golle <daniel@makrotopia.org>,
Mihai Ordean <research@mihaiordean.com>,
Chen-Yu Tsai <wenst@chromium.org>,
linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org, linux-usb@vger.kernel.org
Subject: [PATCH 2/2] usb: xhci-mtk: power down u3 ports skipped by u3p-dis-msk
Date: Sat, 19 Sep 2026 13:47:41 +0200 [thread overview]
Message-ID: <20260919114744.46777-3-linux@fw-web.de> (raw)
In-Reply-To: <20260919114744.46777-1-linux@fw-web.de>
From: Mihai Ordean <research@mihaiordean.com>
xhci_mtk_host_enable() skips ports flagged in "mediatek,u3p-dis-msk"
entirely: it neither powers them up nor powers them down, leaving them
in their power-on/bootloader default state, which on MediaTek IPPC is
powered up and host-selected. The mask exists precisely for ports whose
USB3 PHY is not usable - on BPI-R4 Pro (MT7988A) ssusb0's U3 SerDes
lane is shared with (and muxed to) PCIe2, so the board DT masks U3 port
0 and omits the xphy U3 port from "phys".
The result on that board is a U3 port that is powered and host-selected
but has no initialized PHY and a MAC clock domain that is never
released from reset (the driver deliberately excludes STS1_U3_MAC_RST
from its stability poll for masked ports). This holds the controller's
level interrupt permanently asserted with a status the xHCI interrupt
handler cannot acknowledge:
[ 2.455798] xhci-mtk 11190000.usb: irq 120, io mem 0x11190000
[ 2.861314] irq 120: nobody cared (try booting with the "irqpoll" option)
[ 3.242105] [<0000000014dcb6ae>] usb_hcd_irq
[ 3.246371] Disabling IRQ #120
Once the spurious-IRQ detector disables the line, the fully functional
USB2 bus on the same controller dies with it: xHC commands are queued
but their completions never interrupt, the first hub_event needing a
command parks in D state holding the hub lock
[ 126.053644] Workqueue: usb_hub_wq hub_event
[ 126.053742] xhci_disable_slot+0xb4/0x188
[ 126.053757] xhci_free_dev+0xfc/0x2a4
[ 126.053771] hub_event+0x1364/0x1a0c
and device_shutdown() blocks behind it on reboot, hanging the system.
Explicitly park masked ports by setting CTRL_U3_PORT_PDN and
CTRL_U3_PORT_DIS, mirroring what host_enable() does in reverse for
active ports. xhci_mtk_host_disable() already skips masked ports, which
remains correct as they are now already down.
Signed-off-by: Mihai Ordean <research@mihaiordean.com>
Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
---
drivers/usb/host/xhci-mtk.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c
index 60af5fe29bd4..016a4902fc4c 100644
--- a/drivers/usb/host/xhci-mtk.c
+++ b/drivers/usb/host/xhci-mtk.c
@@ -219,6 +219,19 @@ static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk)
/* power on and enable u3 ports except skipped ones */
for (i = 0; i < mtk->num_u3_ports; i++) {
if ((0x1 << i) & mtk->u3p_dis_msk) {
+ /*
+ * Park skipped ports instead of leaving them in
+ * their power-on default state: the port's PHY may
+ * be uninitialized or its SerDes lane owned by
+ * another controller (e.g. PCIe), in which case a
+ * powered-up port whose MAC clock domain is never
+ * released from reset can hold the interrupt line
+ * asserted, getting it disabled by the spurious
+ * IRQ detector and killing the whole host.
+ */
+ value = readl(&ippc->u3_ctrl_p[i]);
+ value |= CTRL_U3_PORT_PDN | CTRL_U3_PORT_DIS;
+ writel(value, &ippc->u3_ctrl_p[i]);
u3_ports_disabled++;
continue;
}
--
2.53.0
WARNING: multiple messages have this Message-ID (diff)
From: Frank Wunderlich <linux@fw-web.de>
To: Stephen Boyd <sboyd@kernel.org>,
Brian Masney <bmasney+clk@redhat.com>,
Jerome Brunet <jbrunet+clk@baylibre.com>,
Matthias Brugger <matthias.bgg@gmail.com>,
AngeloGioacchino Del Regno
<angelogioacchino.delregno@collabora.com>,
Mathias Nyman <mathias.nyman@intel.com>,
Chunfeng Yun <chunfeng.yun@mediatek.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Frank Wunderlich <frank.wunderlich@linux.dev>,
linux-usb@vger.kernel.org, Daniel Golle <daniel@makrotopia.org>,
linux-kernel@vger.kernel.org, linux-mediatek@lists.infradead.org,
Chen-Yu Tsai <wenst@chromium.org>,
Mihai Ordean <research@mihaiordean.com>,
linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/2] usb: xhci-mtk: power down u3 ports skipped by u3p-dis-msk
Date: Sat, 19 Sep 2026 13:47:41 +0200 [thread overview]
Message-ID: <20260919114744.46777-3-linux@fw-web.de> (raw)
In-Reply-To: <20260919114744.46777-1-linux@fw-web.de>
From: Mihai Ordean <research@mihaiordean.com>
xhci_mtk_host_enable() skips ports flagged in "mediatek,u3p-dis-msk"
entirely: it neither powers them up nor powers them down, leaving them
in their power-on/bootloader default state, which on MediaTek IPPC is
powered up and host-selected. The mask exists precisely for ports whose
USB3 PHY is not usable - on BPI-R4 Pro (MT7988A) ssusb0's U3 SerDes
lane is shared with (and muxed to) PCIe2, so the board DT masks U3 port
0 and omits the xphy U3 port from "phys".
The result on that board is a U3 port that is powered and host-selected
but has no initialized PHY and a MAC clock domain that is never
released from reset (the driver deliberately excludes STS1_U3_MAC_RST
from its stability poll for masked ports). This holds the controller's
level interrupt permanently asserted with a status the xHCI interrupt
handler cannot acknowledge:
[ 2.455798] xhci-mtk 11190000.usb: irq 120, io mem 0x11190000
[ 2.861314] irq 120: nobody cared (try booting with the "irqpoll" option)
[ 3.242105] [<0000000014dcb6ae>] usb_hcd_irq
[ 3.246371] Disabling IRQ #120
Once the spurious-IRQ detector disables the line, the fully functional
USB2 bus on the same controller dies with it: xHC commands are queued
but their completions never interrupt, the first hub_event needing a
command parks in D state holding the hub lock
[ 126.053644] Workqueue: usb_hub_wq hub_event
[ 126.053742] xhci_disable_slot+0xb4/0x188
[ 126.053757] xhci_free_dev+0xfc/0x2a4
[ 126.053771] hub_event+0x1364/0x1a0c
and device_shutdown() blocks behind it on reboot, hanging the system.
Explicitly park masked ports by setting CTRL_U3_PORT_PDN and
CTRL_U3_PORT_DIS, mirroring what host_enable() does in reverse for
active ports. xhci_mtk_host_disable() already skips masked ports, which
remains correct as they are now already down.
Signed-off-by: Mihai Ordean <research@mihaiordean.com>
Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
---
drivers/usb/host/xhci-mtk.c | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c
index 60af5fe29bd4..016a4902fc4c 100644
--- a/drivers/usb/host/xhci-mtk.c
+++ b/drivers/usb/host/xhci-mtk.c
@@ -219,6 +219,19 @@ static int xhci_mtk_host_enable(struct xhci_hcd_mtk *mtk)
/* power on and enable u3 ports except skipped ones */
for (i = 0; i < mtk->num_u3_ports; i++) {
if ((0x1 << i) & mtk->u3p_dis_msk) {
+ /*
+ * Park skipped ports instead of leaving them in
+ * their power-on default state: the port's PHY may
+ * be uninitialized or its SerDes lane owned by
+ * another controller (e.g. PCIe), in which case a
+ * powered-up port whose MAC clock domain is never
+ * released from reset can hold the interrupt line
+ * asserted, getting it disabled by the spurious
+ * IRQ detector and killing the whole host.
+ */
+ value = readl(&ippc->u3_ctrl_p[i]);
+ value |= CTRL_U3_PORT_PDN | CTRL_U3_PORT_DIS;
+ writel(value, &ippc->u3_ctrl_p[i]);
u3_ports_disabled++;
continue;
}
--
2.53.0
next prev parent reply other threads:[~2026-09-19 11:47 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-19 11:47 [RFC PATCH 0/2] Fix mt7988 usb with shared phy Frank Wunderlich
2026-09-19 11:47 ` Frank Wunderlich
2026-09-19 11:47 ` [PATCH 1/2] clk: mediatek: mt7988: keep combo-lane U3 PHY ref clock enabled Frank Wunderlich
2026-09-19 11:47 ` Frank Wunderlich
2026-09-21 9:59 ` AngeloGioacchino Del Regno
2026-09-21 9:59 ` AngeloGioacchino Del Regno
2026-09-21 11:16 ` Frank Wunderlich
2026-09-21 11:16 ` Frank Wunderlich
2026-09-19 11:47 ` Frank Wunderlich [this message]
2026-09-19 11:47 ` [PATCH 2/2] usb: xhci-mtk: power down u3 ports skipped by u3p-dis-msk Frank Wunderlich
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=20260919114744.46777-3-linux@fw-web.de \
--to=linux@fw-web.de \
--cc=angelogioacchino.delregno@collabora.com \
--cc=bmasney+clk@redhat.com \
--cc=chunfeng.yun@mediatek.com \
--cc=daniel@makrotopia.org \
--cc=frank-w@public-files.de \
--cc=frank.wunderlich@linux.dev \
--cc=gregkh@linuxfoundation.org \
--cc=jbrunet+clk@baylibre.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-clk@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=matthias.bgg@gmail.com \
--cc=research@mihaiordean.com \
--cc=sboyd@kernel.org \
--cc=wenst@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.