From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Omar Alzand Date: Fri, 7 Nov 2026 06:10:00 +0300 Subject: [PATCH] nvme-pci: add NVME_QUIRK_DMAPOOL_ALIGN_512 for Micron 2200 The Micron 2200 (1344:5410) corrupts the last page of reads of exactly 33 pages (132 KiB). Such a read uses a 32-entry PRP list, which exactly fills a 256-byte small-pool descriptor, and the final page is dropped while the read still returns success. On btrfs this appears as intermittent "csum failed" read errors that succeed on retry. A raw-device test (eight O_DIRECT readers of N pages into a 0xAA-filled buffer, plus mixed-size background load) isolates it to 33-page reads: pages reads bad pages 32 23515 0 33 17715 1001 (all at page 33, ~5.65%) 34 13735 0 Booting with nvme.quirks=1344:5410:dmapool_align_512 eliminates it (133280 reads at 33 pages, 0 bad) and clears the btrfs checksum errors. Splitting the read via max_sectors_kb=128 also avoids it; writes are unaffected. This is the same quirk the Micron 4100AT needed. Verified through the nvme.quirks module parameter on a single 2200V (Micron_2200V_MTFDHBA512TCK, firmware P1MA0V4); this adds the equivalent id_table entry. Suggested-by: Christoph Hellwig Signed-off-by: Omar Alzand --- 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 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -4426,6 +4426,8 @@ static const struct pci_device_id nvme_id_table[] = { NVME_QUIRK_IGNORE_DEV_SUBNQN, }, { PCI_DEVICE(0x1344, 0x5407), /* Micron Technology Inc NVMe SSD */ .driver_data = NVME_QUIRK_IGNORE_DEV_SUBNQN }, + { PCI_DEVICE(0x1344, 0x5410), /* Micron 2200 */ + .driver_data = NVME_QUIRK_DMAPOOL_ALIGN_512, }, { PCI_DEVICE(0x1344, 0x6001), /* Micron Nitro NVMe */ .driver_data = NVME_QUIRK_BOGUS_NID, }, { PCI_DEVICE(0x1344, 0x6004), /* Micron 4100AT */ -- 2.43.0