Blame SOURCES/0031-Fix-another-buggy-fake-acpi-pci-root-driver.patch

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