65 lines
2.8 KiB
Diff
65 lines
2.8 KiB
Diff
|
From da30e9f2eee235ce11d47bb2e32f976b8c187e5d Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Jones <pjones@redhat.com>
|
||
|
Date: Mon, 10 Sep 2018 15:00:03 -0400
|
||
|
Subject: [PATCH 31/39] Fix another buggy fake acpi pci root driver
|
||
|
|
||
|
In this case, the platform driver that creates the PCI(e) root device
|
||
|
doesn't fill in its driver link, so we can't look up what driver is in
|
||
|
use - but since it's the root, it *really* doesn't matter. And in
|
||
|
general, we only really care if it's the last node in our path, because
|
||
|
that'll be the controller for the boot device anyway.
|
||
|
|
||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||
|
---
|
||
|
src/linux-pci.c | 24 +++++++++++++++++-------
|
||
|
1 file changed, 17 insertions(+), 7 deletions(-)
|
||
|
|
||
|
diff --git a/src/linux-pci.c b/src/linux-pci.c
|
||
|
index e7c864b2d33..f63f5914d9f 100644
|
||
|
--- a/src/linux-pci.c
|
||
|
+++ b/src/linux-pci.c
|
||
|
@@ -67,7 +67,9 @@ parse_pci(struct device *dev, const char *current, const char *root)
|
||
|
uint8_t bus, device, function;
|
||
|
struct pci_dev_info *pci_dev;
|
||
|
unsigned int i = dev->n_pci_devs;
|
||
|
+ struct stat statbuf;
|
||
|
|
||
|
+ debug("devpart is \"%s\"", devpart);
|
||
|
pos = 0;
|
||
|
debug("searching for 0000:00:00.0/");
|
||
|
rc = sscanf(devpart, "%hx:%hhx:%hhx.%hhx/%n",
|
||
|
@@ -100,15 +102,23 @@ parse_pci(struct device *dev, const char *current, const char *root)
|
||
|
return -1;
|
||
|
}
|
||
|
tmp[devpart - root] = '\0';
|
||
|
- rc = sysfs_readlink(&linkbuf, "class/block/%s/driver", tmp);
|
||
|
- if (rc < 0 || !linkbuf) {
|
||
|
- efi_error("Could not find driver for pci device %s", tmp);
|
||
|
- free(tmp);
|
||
|
- return -1;
|
||
|
+ rc = sysfs_stat(&statbuf, "class/block/%s/driver", tmp);
|
||
|
+ if (rc < 0 && errno == ENOENT) {
|
||
|
+ debug("No driver link for /sys/class/block/%s", tmp);
|
||
|
+ debug("Assuming this is just a buggy platform core driver");
|
||
|
+ dev->pci_dev[i].driverlink = NULL;
|
||
|
+ } else {
|
||
|
+ rc = sysfs_readlink(&linkbuf, "class/block/%s/driver", tmp);
|
||
|
+ if (rc < 0 || !linkbuf) {
|
||
|
+ efi_error("Could not find driver for pci device %s", tmp);
|
||
|
+ free(tmp);
|
||
|
+ return -1;
|
||
|
+ } else {
|
||
|
+ dev->pci_dev[i].driverlink = strdup(linkbuf);
|
||
|
+ debug("driver:%s\n", linkbuf);
|
||
|
+ }
|
||
|
}
|
||
|
free(tmp);
|
||
|
- dev->pci_dev[i].driverlink = strdup(linkbuf);
|
||
|
- debug("driver:%s\n", linkbuf);
|
||
|
dev->n_pci_devs += 1;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.17.1
|
||
|
|