uio: do not use PCI resources before pci_enable_device()
Kulikov Vasiliy [Tue, 3 Aug 2010 15:44:23 +0000 (19:44 +0400)]
IRQ and resource[] may not have correct values until
after PCI hotplug setup occurs at pci_enable_device() time.

The semantic match that finds this problem is as follows:

// <smpl>
@@
identifier x;
identifier request ~= "pci_request.*|pci_resource.*";
@@

(
* x->irq
|
* x->resource
|
* request(x, ...)
)
 ...
*pci_enable_device(x)
// </smpl>

Signed-off-by: Kulikov Vasiliy <segooon@gmail.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Hans J. Koch <hjk@linutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

drivers/uio/uio_pci_generic.c

index 85c9884..fc22e1e 100644 (file)
@@ -128,12 +128,6 @@ static int __devinit probe(struct pci_dev *pdev,
        struct uio_pci_generic_dev *gdev;
        int err;
 
-       if (!pdev->irq) {
-               dev_warn(&pdev->dev, "No IRQ assigned to device: "
-                        "no support for interrupts?\n");
-               return -ENODEV;
-       }
-
        err = pci_enable_device(pdev);
        if (err) {
                dev_err(&pdev->dev, "%s: pci_enable_device failed: %d\n",
@@ -141,6 +135,13 @@ static int __devinit probe(struct pci_dev *pdev,
                return err;
        }
 
+       if (!pdev->irq) {
+               dev_warn(&pdev->dev, "No IRQ assigned to device: "
+                        "no support for interrupts?\n");
+               pci_disable_device(pdev);
+               return -ENODEV;
+       }
+
        err = verify_pci_2_3(pdev);
        if (err)
                goto err_verify;