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 cb9d08d17768..9b33863e69e6 100644 --- a/lib/proc.c +++ b/lib/proc.c @@ -11,6 +11,7 @@ #include <stdio.h> #include <string.h> #include <unistd.h> +#include <ctype.h> #include <errno.h> #include <fcntl.h> #include <sys/types.h> @@ -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.20.1