From 293f496db088f4a674f7246f64ca2968cfeab435 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 30 Jan 2018 19:09:19 +0100 Subject: [PATCH] pci: add function to get currently loaded kernel driver --- fpga/include/villas/kernel/pci.h | 3 +++ fpga/lib/kernel/pci.c | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/fpga/include/villas/kernel/pci.h b/fpga/include/villas/kernel/pci.h index d784cedf8..db6beb0e6 100644 --- a/fpga/include/villas/kernel/pci.h +++ b/fpga/include/villas/kernel/pci.h @@ -57,6 +57,9 @@ int pci_device_compare(const struct pci_device *d, const struct pci_device *f); struct pci_device * pci_lookup_device(struct pci *p, struct pci_device *filter); +/** Get currently loaded driver for device */ +int pci_get_driver(struct pci_device *d, char *buf, size_t buflen); + /** Bind a new LKM to the PCI device */ int pci_attach_driver(struct pci_device *d, const char *driver); diff --git a/fpga/lib/kernel/pci.c b/fpga/lib/kernel/pci.c index 56a8c17bd..e4d6793ba 100644 --- a/fpga/lib/kernel/pci.c +++ b/fpga/lib/kernel/pci.c @@ -254,10 +254,29 @@ struct pci_device * pci_lookup_device(struct pci *p, struct pci_device *f) return list_search(&p->devices, (cmp_cb_t) pci_device_compare, (void *) f); } +int pci_get_driver(struct pci_device *d, char *buf, size_t buflen) +{ + int ret; + char sysfs[1024], syml[1024]; + + snprintf(sysfs, sizeof(sysfs), "%s/bus/pci/devices/%04x:%02x:%02x.%x/driver", SYSFS_PATH, + d->slot.domain, d->slot.bus, d->slot.device, d->slot.function); + + ret = readlink(sysfs, syml, sizeof(syml)); + if (ret < 0) + return ret; + + char *driver = basename(syml); + + strncpy(buf, driver, buflen); + + return 0; +} + int pci_attach_driver(struct pci_device *d, const char *driver) { FILE *f; - char fn[256]; + char fn[1024]; /* Add new ID to driver */ snprintf(fn, sizeof(fn), "%s/bus/pci/drivers/%s/new_id", SYSFS_PATH, driver);