OSDN Git Service

Implement the kernel_has_driver() method for NetBSD.
authorMatthew Green <mrg@NetBSD.org>
Sat, 26 Jul 2014 20:09:30 +0000 (22:09 +0200)
committerThomas Klausner <wiz@NetBSD.org>
Sat, 30 Aug 2014 20:45:18 +0000 (22:45 +0200)
This has the benefit of stopping the "vesa" driver from loading on
hardware that has been claimed by a kernel driver and thus shouldn't
be using "vesa".

Reviewed-by: Matthieu Herrb <matthieu@herrb.eu>
Signed-off-by: Thomas Klausner <wiz@NetBSD.org>
src/netbsd_pci.c

index e6dae4c..52591b0 100644 (file)
@@ -843,6 +843,29 @@ pci_device_netbsd_unmap_legacy(struct pci_device *dev, void *addr,
        return pci_device_netbsd_unmap_range(dev, &map);
 }
 
+static int
+pci_device_netbsd_has_kernel_driver(struct pci_device *dev)
+{
+#ifdef PCI_IOC_DRVNAME
+       /*
+        * NetBSD PCI_IOC_DRVNAME appears at the same time as pci_drvname(3)
+        */
+       char drvname[16];
+
+       if (dev->bus >= nbuses)
+               return 0;
+
+       /*
+        * vga(4) should be considered "not bound".
+        */
+       if (pci_drvname(buses[dev->bus].fd, dev->dev, dev->func,
+                       drvname, sizeof drvname) == 0 &&
+           strncmp(drvname, "vga", 3) != 0)
+               return 1;
+#endif
+       return 0;
+}
+
 static const struct pci_system_methods netbsd_pci_methods = {
        .destroy = pci_system_netbsd_destroy,
        .destroy_device = NULL,
@@ -867,6 +890,7 @@ static const struct pci_system_methods netbsd_pci_methods = {
        .write8 = pci_device_netbsd_write8,
        .map_legacy = pci_device_netbsd_map_legacy,
        .unmap_legacy = pci_device_netbsd_unmap_legacy,
+       .has_kernel_driver = pci_device_netbsd_has_kernel_driver,
 };
 
 int