Commit fceb072b authored by Daniel Verkamp's avatar Daniel Verkamp
Browse files

pci: refactor Linux pci_device_has_non_uio_driver()



Use /sys/bus/pci/devices/.../driver to determine which driver is loaded
for a particular device.

Change-Id: I5859a776e524033e1c6d6ec3796b7e11bdcf0bc4
Signed-off-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 04074235
Loading
Loading
Loading
Loading
+21 −30
Original line number Diff line number Diff line
@@ -96,39 +96,36 @@ pci_device_get_serial_number(struct pci_device *dev, char *sn, int len)
}

#ifdef __linux__
static int
pci_device_has_uio_driver(struct pci_device *dev)
int
pci_device_has_non_uio_driver(struct pci_device *dev)
{
	struct dirent *e;
	DIR *dir;
	char dirname[SPDK_PCI_PATH_MAX];
	char linkname[SPDK_PCI_PATH_MAX];
	char driver[SPDK_PCI_PATH_MAX];
	ssize_t driver_len;
	char *driver_begin;

	snprintf(dirname, sizeof(dirname),
		 SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/uio",
	snprintf(linkname, sizeof(linkname),
		 SYSFS_PCI_DEVICES "/" PCI_PRI_FMT "/driver",
		 dev->domain, dev->bus, dev->dev, dev->func);

	dir = opendir(dirname);
	if (!dir) {
		snprintf(dirname, sizeof(dirname),
			 SYSFS_PCI_DEVICES "/" PCI_PRI_FMT,
			 dev->domain, dev->bus, dev->dev, dev->func);
		dir = opendir(dirname);
		if (!dir)
			return 0;
	}
	driver_len = readlink(linkname, driver, sizeof(driver));

	while ((e = readdir(dir)) != NULL) {
		if (strncmp(e->d_name, "uio", 3) == 0) {
			break;
		}
	if (driver_len < 0 || driver_len >= SPDK_PCI_PATH_MAX) {
		return 0;
	}

	closedir(dir);
	driver[driver_len] = '\0'; /* readlink() doesn't null terminate, so we have to */

	if (!e)
		return 0;
	driver_begin = strrchr(driver, '/');
	if (driver_begin) {
		/* Advance to the character after the slash */
		driver_begin++;
	} else {
		/* This shouldn't normally happen - driver should be a relative path with slashes */
		driver_begin = driver;
	}

	return 1;
	return strcmp(driver_begin, "uio_pci_generic") != 0;
}
#endif

@@ -183,12 +180,6 @@ pci_device_has_non_uio_driver(struct pci_device *dev)
		return 1;
	}
}
#else
int
pci_device_has_non_uio_driver(struct pci_device *dev)
{
	return pci_device_has_kernel_driver(dev) && !pci_device_has_uio_driver(dev);
}
#endif

int