diff options
author | Kulikov Vasiliy <segooon@gmail.com> | 2010-08-03 11:44:23 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-22 13:16:42 -0400 |
commit | 1037246cacd45d951227c8798f181b3ba5c8bcbe (patch) | |
tree | dbf5580c239ddd84ec4bd6c8479a60d55a62f5d9 /drivers/uio | |
parent | d79d32440c33cf60f1e0efbeb8144b1647be0b50 (diff) |
uio: do not use PCI resources before pci_enable_device()
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>
Diffstat (limited to 'drivers/uio')
-rw-r--r-- | drivers/uio/uio_pci_generic.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/uio/uio_pci_generic.c b/drivers/uio/uio_pci_generic.c index 85c9884a67fd..fc22e1e6f215 100644 --- a/drivers/uio/uio_pci_generic.c +++ b/drivers/uio/uio_pci_generic.c | |||
@@ -128,12 +128,6 @@ static int __devinit probe(struct pci_dev *pdev, | |||
128 | struct uio_pci_generic_dev *gdev; | 128 | struct uio_pci_generic_dev *gdev; |
129 | int err; | 129 | int err; |
130 | 130 | ||
131 | if (!pdev->irq) { | ||
132 | dev_warn(&pdev->dev, "No IRQ assigned to device: " | ||
133 | "no support for interrupts?\n"); | ||
134 | return -ENODEV; | ||
135 | } | ||
136 | |||
137 | err = pci_enable_device(pdev); | 131 | err = pci_enable_device(pdev); |
138 | if (err) { | 132 | if (err) { |
139 | dev_err(&pdev->dev, "%s: pci_enable_device failed: %d\n", | 133 | dev_err(&pdev->dev, "%s: pci_enable_device failed: %d\n", |
@@ -141,6 +135,13 @@ static int __devinit probe(struct pci_dev *pdev, | |||
141 | return err; | 135 | return err; |
142 | } | 136 | } |
143 | 137 | ||
138 | if (!pdev->irq) { | ||
139 | dev_warn(&pdev->dev, "No IRQ assigned to device: " | ||
140 | "no support for interrupts?\n"); | ||
141 | pci_disable_device(pdev); | ||
142 | return -ENODEV; | ||
143 | } | ||
144 | |||
144 | err = verify_pci_2_3(pdev); | 145 | err = verify_pci_2_3(pdev); |
145 | if (err) | 146 | if (err) |
146 | goto err_verify; | 147 | goto err_verify; |