From 1579c198ae9ddbb92a9ebc29f76eec169397fdd4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pali=20Roh=C3=A1r?= Date: Mon, 27 Dec 2021 14:05:32 +0100 Subject: [PATCH] libpci: proc: Implement support for PCI_FILL_DRIVER File /proc/bus/pci/devices contains optional driver name in the last 18th field. --- lib/proc.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/proc.c b/lib/proc.c index cb9d08d..9b33863 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -69,9 +70,11 @@ proc_scan(struct pci_access *a) { struct pci_dev *d = pci_alloc_dev(a); unsigned int dfn, vend, cnt, known; + char *driver; + int offset; #define F " " PCIADDR_T_FMT - cnt = sscanf(buf, "%x %x %x" F F F F F F F F F F F F F F, + cnt = sscanf(buf, "%x %x %x" F F F F F F F F F F F F F F "%n", &dfn, &vend, &d->irq, @@ -88,7 +91,8 @@ proc_scan(struct pci_access *a) &d->size[3], &d->size[4], &d->size[5], - &d->rom_size); + &d->rom_size, + &offset); #undef F if (cnt != 9 && cnt != 10 && cnt != 17) a->error("proc: parse error (read only %d items)", cnt); @@ -106,6 +110,20 @@ proc_scan(struct pci_access *a) if (cnt >= 17) known |= PCI_FILL_SIZES; } + if (cnt >= 17) + { + while (buf[offset] && isspace(buf[offset])) + ++offset; + driver = &buf[offset]; + while (buf[offset] && !isspace(buf[offset])) + ++offset; + buf[offset] = '\0'; + if (driver[0]) + { + pci_set_property(d, PCI_FILL_DRIVER, driver); + known |= PCI_FILL_DRIVER; + } + } d->known_fields = known; pci_link_dev(a, d); } -- 2.39.2