Commit f92d74c1f5afaff7cd1ea14ade8f1ba6b519e422

Authored by Stephen M. Cameron
Committed by Bjorn Helgaas
1 parent fbeeb822f6

PCI: Warn on driver probe return value greater than zero

Ages ago, drivers could return values greater than zero from their probe
function and this would be regarded as success.

But after f3ec4f87d607 ("PCI: change device runtime PM settings for probe
and remove") and 967577b06241 ("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>

Showing 1 changed file with 10 additions and 2 deletions Side-by-side Diff

drivers/pci/pci-driver.c
... ... @@ -264,11 +264,19 @@
264 264 pm_runtime_get_sync(dev);
265 265 pci_dev->driver = pci_drv;
266 266 rc = pci_drv->probe(pci_dev, ddi->id);
267   - if (rc) {
  267 + if (!rc)
  268 + return rc;
  269 + if (rc < 0) {
268 270 pci_dev->driver = NULL;
269 271 pm_runtime_put_sync(dev);
  272 + return rc;
270 273 }
271   - return rc;
  274 + /*
  275 + * Probe function should return < 0 for failure, 0 for success
  276 + * Treat values > 0 as success, but warn.
  277 + */
  278 + dev_warn(dev, "Driver probe function unexpectedly returned %d\n", rc);
  279 + return 0;
272 280 }
273 281  
274 282 static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev,