]> mj.ucw.cz Git - pciutils.git/commitdiff
First attempt at printing Linux driver names.
authorMartin Mares <mj@ucw.cz>
Fri, 2 Nov 2007 17:31:53 +0000 (18:31 +0100)
committerMartin Mares <mj@ucw.cz>
Fri, 2 Nov 2007 17:31:53 +0000 (18:31 +0100)
lspci.c

diff --git a/lspci.c b/lspci.c
index 81192ee605ebae252fd39c16d734ec06a2fbb0ea..1a73fed88ff7b5b39cf7e54f36f0fbd023beda06 100644 (file)
--- 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 ***/