From: Martin Mares Date: Fri, 2 Nov 2007 17:31:53 +0000 (+0100) Subject: First attempt at printing Linux driver names. X-Git-Tag: v3.0.0~8^2~5 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=d085bbefec42b873ba9b68ebeb5bce21ff5fb800;p=pciutils.git First attempt at printing Linux driver names. --- diff --git a/lspci.c b/lspci.c index 81192ee..1a73fed 100644 --- a/lspci.c +++ b/lspci.c @@ -1771,6 +1771,39 @@ show_htype2(struct device *d) printf("\t16-bit legacy interface ports at %04x\n", exca); } +static void +show_driver(struct device *d) +{ + struct pci_dev *dev = d->dev; + char *base = dev->access->method_params[PCI_ACCESS_SYS_BUS_PCI]; + char name[1024], driver[1024], *drv; + int n; + + if (dev->access->method != PCI_ACCESS_SYS_BUS_PCI) + return; + + n = snprintf(name, sizeof(name), "%s/devices/%04x:%02x:%02x.%d/driver", + base, dev->domain, dev->bus, dev->dev, dev->func); + if (n < 0 || n >= 1024) + die("show_driver: sysfs device name too long, why?"); + + n = readlink(name, driver, sizeof(driver)); + if (n < 0) + return; + if (n >= (int)sizeof(driver)) + { + printf("\t!!! Driver name too long\n"); + return; + } + driver[n] = 0; + + if (drv = strrchr(driver, '/')) + drv++; + else + drv = driver; + printf("\tKernel driver: %s\n", drv); +} + static void show_verbose(struct device *d) { @@ -1923,6 +1956,8 @@ show_verbose(struct device *d) show_htype2(d); break; } + + show_driver(d); } /*** Machine-readable dumps ***/