]> mj.ucw.cz Git - pciutils.git/commitdiff
libpci: generic: Implement SUBSYS also for PCI_HEADER_TYPE_BRIDGE
authorPali Rohár <pali@kernel.org>
Mon, 20 Dec 2021 21:56:33 +0000 (22:56 +0100)
committerMartin Mares <mj@ucw.cz>
Thu, 10 Feb 2022 12:49:35 +0000 (13:49 +0100)
Subsystem ids for PCI Bridges are stored in extended capability
PCI_CAP_ID_SSVID.

lib/generic.c

index 1c1f8a3ff1a81b305b0102d4e32b7c6455104804..d178a4427ef4c94c6d87fd3b577d835db45d35f1 100644 (file)
@@ -86,6 +86,7 @@ void
 pci_generic_fill_info(struct pci_dev *d, unsigned int flags)
 {
   struct pci_access *a = d->access;
+  struct pci_cap *cap;
 
   if (want_fill(d, flags, PCI_FILL_IDENT))
     {
@@ -110,6 +111,14 @@ pci_generic_fill_info(struct pci_dev *d, unsigned int flags)
           d->subsys_vendor_id = pci_read_word(d, PCI_SUBSYSTEM_VENDOR_ID);
           d->subsys_id = pci_read_word(d, PCI_SUBSYSTEM_ID);
           break;
+        case PCI_HEADER_TYPE_BRIDGE:
+          cap = pci_find_cap(d, PCI_CAP_ID_SSVID, PCI_CAP_NORMAL);
+          if (cap)
+            {
+              d->subsys_vendor_id = pci_read_word(d, cap->addr + PCI_SSVID_VENDOR);
+              d->subsys_id = pci_read_word(d, cap->addr + PCI_SSVID_DEVICE);
+            }
+          break;
         case PCI_HEADER_TYPE_CARDBUS:
           d->subsys_vendor_id = pci_read_word(d, PCI_CB_SUBSYSTEM_VENDOR_ID);
           d->subsys_id = pci_read_word(d, PCI_CB_SUBSYSTEM_ID);