Skip to content

Commit

Permalink
PCI: Warn on driver probe return value greater than zero
Browse files Browse the repository at this point in the history
Ages ago, drivers could return values greater than zero from their probe
function and this would be regarded as success.

But after f3ec4f8 ("PCI: change device runtime PM settings for probe
and remove") and 967577b ("PCI/PM: Keep runtime PM enabled for unbound
PCI devices"), we set dev->driver to NULL if the driver's probe function
returns a value greater than zero.

__pci_device_probe() treats this as success, and drivers can still mostly
work even with dev->driver == NULL, but PCI power management doesn't work,
and we don't call the driver's remove function on rmmod.

To help catch these driver problems, issue a warning in this case.

[bhelgaas: changelog]
Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
  • Loading branch information
Stephen M. Cameron authored and Bjorn Helgaas committed Nov 6, 2013
1 parent fbeeb82 commit f92d74c
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions drivers/pci/pci-driver.c
Original file line number Diff line number Diff line change
Expand Up @@ -264,11 +264,19 @@ static long local_pci_probe(void *_ddi)
pm_runtime_get_sync(dev);
pci_dev->driver = pci_drv;
rc = pci_drv->probe(pci_dev, ddi->id);
if (rc) {
if (!rc)
return rc;
if (rc < 0) {
pci_dev->driver = NULL;
pm_runtime_put_sync(dev);
return rc;
}
return rc;
/*
* Probe function should return < 0 for failure, 0 for success
* Treat values > 0 as success, but warn.
*/
dev_warn(dev, "Driver probe function unexpectedly returned %d\n", rc);
return 0;
}

static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,
Expand Down

0 comments on commit f92d74c

Please sign in to comment.