diff options
Diffstat (limited to 'src/hardware')
-rw-r--r-- | src/hardware/PCIDev.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/src/hardware/PCIDev.c b/src/hardware/PCIDev.c index ead54a9..83f2cf2 100644 --- a/src/hardware/PCIDev.c +++ b/src/hardware/PCIDev.c @@ -61,16 +61,21 @@ void cleanup_pci_access(struct pci_access **acc) void get_subid(struct pci_dev *d, u16 *subvp, u16 *subdp) { + *subvp = *subdp = 0xffff; u8 htype = pci_read_byte(d, PCI_HEADER_TYPE) & 0x7f; if (htype == PCI_HEADER_TYPE_NORMAL) { *subvp = pci_read_word(d, PCI_SUBSYSTEM_VENDOR_ID); *subdp = pci_read_word(d, PCI_SUBSYSTEM_ID); + } else if (htype == PCI_HEADER_TYPE_BRIDGE) { + struct pci_cap *cap = pci_find_cap(d, PCI_CAP_ID_SSVID, PCI_CAP_NORMAL); + if (cap) { + *subvp = pci_read_word(d, cap->addr + PCI_SSVID_VENDOR); + *subdp = pci_read_word(d, cap->addr + PCI_SSVID_DEVICE); + } } else if (htype == PCI_HEADER_TYPE_CARDBUS) { *subvp = pci_read_word(d, PCI_CB_SUBSYSTEM_VENDOR_ID); *subdp = pci_read_word(d, PCI_CB_SUBSYSTEM_ID); - } else { - *subvp = *subdp = 0xffff; } } |