aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPali Rohár <pali@kernel.org>2021-12-20 22:56:33 +0100
committerMartin Mares <mj@ucw.cz>2022-02-10 13:49:35 +0100
commit4fd10eb90b479748a6b5268701d8383b8579981f (patch)
treebeb9ec1df0ba13fcf4013b390fc00099cca5b499
parent2dc7b53bc955ac51a56706fc305779ef0cf78dcd (diff)
downloadpciutils-4fd10eb90b479748a6b5268701d8383b8579981f.tar.gz
libpci: generic: Implement SUBSYS also for PCI_HEADER_TYPE_BRIDGE
Subsystem ids for PCI Bridges are stored in extended capability PCI_CAP_ID_SSVID.
-rw-r--r--lib/generic.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/lib/generic.c b/lib/generic.c
index 1c1f8a3..d178a44 100644
--- a/lib/generic.c
+++ b/lib/generic.c
@@ -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);