]> www.infradead.org Git - users/hch/misc.git/commitdiff
nvme-pci: qdepth 1 quirk
authorKeith Busch <kbusch@kernel.org>
Wed, 11 Sep 2024 17:39:59 +0000 (10:39 -0700)
committerKeith Busch <kbusch@kernel.org>
Fri, 13 Sep 2024 14:29:30 +0000 (07:29 -0700)
Another device has been reported to be unreliable if we have more than
one outstanding command. In this new case, data corruption may occur.
Since we have two devices now needing this quirky behavior, make a
generic quirk flag.

The same Apple quirk is clearly not "temporary", so update the comment
while moving it.

Link: https://lore.kernel.org/linux-nvme/191d810a4e3.fcc6066c765804.973611676137075390@collabora.com/
Reported-by: Robert Beckett <bob.beckett@collabora.com>
Reviewed-by: Christoph Hellwig hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/nvme.h
drivers/nvme/host/pci.c

index af22368800e771a85b1c2026d0baa3b0e084515b..69a3fb6de1e9c47cf62fb816abcbf9115f1e8da3 100644 (file)
@@ -90,6 +90,11 @@ enum nvme_quirks {
         */
        NVME_QUIRK_NO_DEEPEST_PS                = (1 << 5),
 
+       /*
+        *  Problems seen with concurrent commands
+        */
+       NVME_QUIRK_QDEPTH_ONE                   = (1 << 6),
+
        /*
         * Set MEDIUM priority on SQ creation
         */
index 6cd9395ba9ec3d8044b4eaf0e6665c7d739d718d..0ec0f3e5291cc4497fc735f0fb112d0cdfae8d60 100644 (file)
@@ -2557,15 +2557,8 @@ static int nvme_pci_enable(struct nvme_dev *dev)
        else
                dev->io_sqes = NVME_NVM_IOSQES;
 
-       /*
-        * Temporary fix for the Apple controller found in the MacBook8,1 and
-        * some MacBook7,1 to avoid controller resets and data loss.
-        */
-       if (pdev->vendor == PCI_VENDOR_ID_APPLE && pdev->device == 0x2001) {
+       if (dev->ctrl.quirks & NVME_QUIRK_QDEPTH_ONE) {
                dev->q_depth = 2;
-               dev_warn(dev->ctrl.device, "detected Apple NVMe controller, "
-                       "set queue depth=%u to work around controller resets\n",
-                       dev->q_depth);
        } else if (pdev->vendor == PCI_VENDOR_ID_SAMSUNG &&
                   (pdev->device == 0xa821 || pdev->device == 0xa822) &&
                   NVME_CAP_MQES(dev->ctrl.cap) == 0) {
@@ -3425,6 +3418,8 @@ static const struct pci_device_id nvme_id_table[] = {
                                NVME_QUIRK_BOGUS_NID, },
        { PCI_VDEVICE(REDHAT, 0x0010),  /* Qemu emulated controller */
                .driver_data = NVME_QUIRK_BOGUS_NID, },
+       { PCI_DEVICE(0x1217, 0x8760), /* O2 Micro 64GB Steam Deck */
+               .driver_data = NVME_QUIRK_QDEPTH_ONE },
        { PCI_DEVICE(0x126f, 0x2262),   /* Silicon Motion generic */
                .driver_data = NVME_QUIRK_NO_DEEPEST_PS |
                                NVME_QUIRK_BOGUS_NID, },
@@ -3559,7 +3554,12 @@ static const struct pci_device_id nvme_id_table[] = {
        { PCI_DEVICE(PCI_VENDOR_ID_AMAZON, 0xcd02),
                .driver_data = NVME_QUIRK_DMA_ADDRESS_BITS_48, },
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001),
-               .driver_data = NVME_QUIRK_SINGLE_VECTOR },
+               /*
+                * Fix for the Apple controller found in the MacBook8,1 and
+                * some MacBook7,1 to avoid controller resets and data loss.
+                */
+               .driver_data = NVME_QUIRK_SINGLE_VECTOR |
+                               NVME_QUIRK_QDEPTH_ONE },
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },
        { PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2005),
                .driver_data = NVME_QUIRK_SINGLE_VECTOR |