Merge tag 'vfio-v5.15-rc1' of git://github.com/awilliam/linux-vfio
[linux-2.6-microblaze.git] / drivers / pci / pci-driver.c
index a061539..2761ab8 100644 (file)
@@ -136,7 +136,7 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
                                                    struct pci_dev *dev)
 {
        struct pci_dynid *dynid;
-       const struct pci_device_id *found_id = NULL;
+       const struct pci_device_id *found_id = NULL, *ids;
 
        /* When driver_override is set, only bind to the matching driver */
        if (dev->driver_override && strcmp(dev->driver_override, drv->name))
@@ -152,14 +152,28 @@ static const struct pci_device_id *pci_match_device(struct pci_driver *drv,
        }
        spin_unlock(&drv->dynids.lock);
 
-       if (!found_id)
-               found_id = pci_match_id(drv->id_table, dev);
+       if (found_id)
+               return found_id;
 
-       /* driver_override will always match, send a dummy id */
-       if (!found_id && dev->driver_override)
-               found_id = &pci_device_id_any;
+       for (ids = drv->id_table; (found_id = pci_match_id(ids, dev));
+            ids = found_id + 1) {
+               /*
+                * The match table is split based on driver_override.
+                * In case override_only was set, enforce driver_override
+                * matching.
+                */
+               if (found_id->override_only) {
+                       if (dev->driver_override)
+                               return found_id;
+               } else {
+                       return found_id;
+               }
+       }
 
-       return found_id;
+       /* driver_override will always match, send a dummy id */
+       if (dev->driver_override)
+               return &pci_device_id_any;
+       return NULL;
 }
 
 /**