From: "Ben Gardner" pci_find_present() is only matching the last item in the list of ids. The break after the match is found only escapes the for loop, not the while loop, so found gets reset to NULL on the next pass. Signed-off-by: Ben Gardner Cc: Alan Cox Cc: Greg KH Signed-off-by: Andrew Morton --- drivers/pci/search.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff -puN drivers/pci/search.c~fix-pci_find_present drivers/pci/search.c --- a/drivers/pci/search.c~fix-pci_find_present +++ a/drivers/pci/search.c @@ -403,10 +403,11 @@ const struct pci_device_id *pci_find_pre while (ids->vendor || ids->subvendor || ids->class_mask) { list_for_each_entry(dev, &pci_devices, global_list) { if ((found = pci_match_one_device(ids, dev)) != NULL) - break; + goto exit; } ids++; } +exit: up_read(&pci_bus_sem); return found; } _