[PATCH] nvme-pci: avoid the deepest sleep state on Transcend MTE672A SSDs
Amber Gao via B4 Relay
devnull+ambergao.apptronik.com at kernel.org
Wed Sep 30 10:08:04 PDT 2026
From: Amber Gao <ambergao at apptronik.com>
The Transcend MTE672A (PCI ID 1d79:2263, Silicon Motion SM2263XT
controller) stops responding after it has been idle long enough to
enter its deepest APST power state. This reproduces without any
workload: on every boot observed, a write issued about 16 s after the
kernel starts never completes, and about 45 s in the kernel reports
nvme nvme0: I/O tag 191 (30bf) opcode 0x1 (I/O Cmd) QID 2 timeout,
aborting req_op:WRITE(1) size:131072
nvme nvme0: I/O tag 191 (30bf) opcode 0x1 (I/O Cmd) QID 2 timeout,
reset controller
nvme nvme0: Abort status: 0x371
The abort is not completed either; the drive only comes back once the
controller has been reset. If the hang occurs while many I/Os are
queued, that reset can time out as well; the driver then gives up and
removes the NVMe device from the system. On the affected system this
has happened twice, both times during a firmware update, leaving the
ext4 root filesystem unusable.
Booting with nvme_core.default_ps_max_latency_us=10000, which excludes
only PS4 (the deepest state), makes the boot-time timeout disappear. With
NVME_QUIRK_NO_DEEPEST_PS applied instead, on a stock command line, no
timeout has been seen on any boot since, including six multi-GB A/B
firmware updates.
The same controller is already quirked for this under other vendors'
IDs: Kingston A2000 (2646:2263), Kingston SKC2000 (2646:2262) and the
Silicon Motion generic IDs 126f:2262 and 126f:1001.
Tested on a 6.8-based vendor kernel; the patch is against mainline,
where the surrounding code is unchanged, but has not been retested
there.
vid : 0x1d79
ssvid : 0x1d79
mn : TS2TMTE672AI-VS1
fr : X0122B3
[...]
ps 0 : mp:6.00W operational enlat:0 exlat:0 rrt:0 rrl:0
rwt:0 rwl:0 idle_power:- active_power:-
ps 1 : mp:3.00W operational enlat:0 exlat:0 rrt:1 rrl:1
rwt:1 rwl:1 idle_power:- active_power:-
ps 2 : mp:1.50W operational enlat:0 exlat:0 rrt:2 rrl:2
rwt:2 rwl:2 idle_power:- active_power:-
ps 3 : mp:0.0450W non-operational enlat:3000 exlat:3000 rrt:3 rrl:3
rwt:3 rwl:3 idle_power:- active_power:-
ps 4 : mp:0.0040W non-operational enlat:25000 exlat:25000 rrt:4 rrl:4
rwt:4 rwl:4 idle_power:- active_power:-
Assisted-by: LLM
Signed-off-by: Amber Gao <ambergao at apptronik.com>
---
Two-line device-ID addition. The affected drive hangs in PS4 shortly after boot;
NVME_QUIRK_NO_DEEPEST_PS is the same quirk already applied to the Kingston A2000 and
SKC2000 and the Silicon Motion generic IDs, which share this controller.
Tested on a 6.8-based vendor kernel; not retested on mainline, where the surrounding
table is unchanged.
---
drivers/nvme/host/pci.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 5440cf18b..1a3353782 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -4221,6 +4221,8 @@ static const struct pci_device_id nvme_id_table[] = {
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
{ PCI_DEVICE(0x2646, 0x2263), /* KINGSTON A2000 NVMe SSD */
.driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
+ { PCI_DEVICE(0x1d79, 0x2263), /* Transcend MTE672A */
+ .driver_data = NVME_QUIRK_NO_DEEPEST_PS, },
{ PCI_DEVICE(0x2646, 0x5013), /* Kingston KC3000, Kingston FURY Renegade */
.driver_data = NVME_QUIRK_NO_SECONDARY_TEMP_THRESH, },
{ PCI_DEVICE(0x2646, 0x5018), /* KINGSTON OM8SFP4xxxxP OS21012 NVMe SSD */
---
base-commit: 551c722f40809618230001baccf219193e22fc5a
change-id: 20260930-nvme-transcend-mte672a-908bee62e05e
Best regards,
--
Amber Gao <ambergao at apptronik.com>
More information about the Linux-nvme
mailing list