Thanks, and I applied the fix to v6.15 and please help test it, once it
passes the test, I will try to submit the patch to upstream and CC Intel
engineers.

https://people.canonical.com/~hwang4/lp2111521/test11

diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 4b8693ec9e4c..848fa0e6cf60 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1270,7 +1270,8 @@ static void pci_enable_rrs_sv(struct pci_dev *pdev)
        if (root_cap & PCI_EXP_RTCAP_RRS_SV) {
                pcie_capability_set_word(pdev, PCI_EXP_RTCTL,
                                         PCI_EXP_RTCTL_RRS_SVE);
-               pdev->config_rrs_sv = 1;
+               if (!(pdev->dev_flags & PCI_DEV_FLAGS_NO_RRS_SV))
+                       pdev->config_rrs_sv = 1;
        }
 }
 
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index cf483d82572c..519e48ff6448 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -6336,3 +6336,21 @@ static void pci_mask_replay_timer_timeout(struct pci_dev 
*pdev)
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_GLI, 0x9750, 
pci_mask_replay_timer_timeout);
 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_GLI, 0x9755, 
pci_mask_replay_timer_timeout);
 #endif
+
+/*
+ * Although the root port device claims to support RRS, some devices don't work
+ * with RRS polling, when reading the Vendor ID, they just return ~0 if config
+ * access is not ready, this will break the pci_dev_wait(). Here disable the 
RRS
+ * forcibly for this type of device.
+ */
+static void quirk_no_rrs_sv(struct pci_dev *dev)
+{
+       struct pci_dev *root;
+
+       root = pcie_find_root_port(dev);
+       if (root) {
+               root->dev_flags |= PCI_DEV_FLAGS_NO_RRS_SV;
+               root->config_rrs_sv = 0;
+       }
+}
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x0a54, quirk_no_rrs_sv);
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 05e68f35f392..f4dd9ada12e4 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -247,6 +247,8 @@ enum pci_dev_flags {
        PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12),
        /* Device requires write to PCI_MSIX_ENTRY_DATA before any MSIX reads */
        PCI_DEV_FLAGS_MSIX_TOUCH_ENTRY_DATA_FIRST = (__force pci_dev_flags_t) 
(1 << 13),
+       /* Do not use Configuration Request Retry Status polling in 
pci_dev_wait() */
+       PCI_DEV_FLAGS_NO_RRS_SV = (__force pci_dev_flags_t) (1 << 14),
 };
 
 enum pci_irq_reroute_variant {

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2111521

Title:
  nvme no longer detected on boot after upgrade to 6.8.0-60

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/2111521/+subscriptions


-- 
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to