PCI: Warn on driver probe return value greater than zero
authorStephen M. Cameron <scameron@beardog.cce.hp.com>
Fri, 1 Nov 2013 19:34:55 +0000 (14:34 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Wed, 6 Nov 2013 23:08:17 +0000 (16:08 -0700)
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>
drivers/pci/pci-driver.c

index b60fe67..0929ae3 100644 (file)
@@ -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,