diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/Makefile | 1 | ||||
-rw-r--r-- | drivers/pci/pci-driver.c | 4 | ||||
-rw-r--r-- | drivers/pci/pci-sysfs.c | 3 | ||||
-rw-r--r-- | drivers/pci/xen-pcifront.c | 31 |
4 files changed, 26 insertions, 13 deletions
diff --git a/drivers/pci/Makefile b/drivers/pci/Makefile index bb1d3b2d81ec..98d61c8e984b 100644 --- a/drivers/pci/Makefile +++ b/drivers/pci/Makefile | |||
@@ -42,6 +42,7 @@ obj-$(CONFIG_PCI_IOV) += iov.o | |||
42 | obj-$(CONFIG_X86) += setup-bus.o | 42 | obj-$(CONFIG_X86) += setup-bus.o |
43 | obj-$(CONFIG_ALPHA) += setup-bus.o setup-irq.o | 43 | obj-$(CONFIG_ALPHA) += setup-bus.o setup-irq.o |
44 | obj-$(CONFIG_ARM) += setup-bus.o setup-irq.o | 44 | obj-$(CONFIG_ARM) += setup-bus.o setup-irq.o |
45 | obj-$(CONFIG_UNICORE32) += setup-bus.o setup-irq.o | ||
45 | obj-$(CONFIG_PARISC) += setup-bus.o | 46 | obj-$(CONFIG_PARISC) += setup-bus.o |
46 | obj-$(CONFIG_SUPERH) += setup-bus.o setup-irq.o | 47 | obj-$(CONFIG_SUPERH) += setup-bus.o setup-irq.o |
47 | obj-$(CONFIG_PPC) += setup-bus.o | 48 | obj-$(CONFIG_PPC) += setup-bus.o |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 88246dd46452..d86ea8b01137 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
@@ -431,7 +431,7 @@ static void pci_device_shutdown(struct device *dev) | |||
431 | pci_msix_shutdown(pci_dev); | 431 | pci_msix_shutdown(pci_dev); |
432 | } | 432 | } |
433 | 433 | ||
434 | #ifdef CONFIG_PM_OPS | 434 | #ifdef CONFIG_PM |
435 | 435 | ||
436 | /* Auxiliary functions used for system resume and run-time resume. */ | 436 | /* Auxiliary functions used for system resume and run-time resume. */ |
437 | 437 | ||
@@ -1059,7 +1059,7 @@ static int pci_pm_runtime_idle(struct device *dev) | |||
1059 | 1059 | ||
1060 | #endif /* !CONFIG_PM_RUNTIME */ | 1060 | #endif /* !CONFIG_PM_RUNTIME */ |
1061 | 1061 | ||
1062 | #ifdef CONFIG_PM_OPS | 1062 | #ifdef CONFIG_PM |
1063 | 1063 | ||
1064 | const struct dev_pm_ops pci_dev_pm_ops = { | 1064 | const struct dev_pm_ops pci_dev_pm_ops = { |
1065 | .prepare = pci_pm_prepare, | 1065 | .prepare = pci_pm_prepare, |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index cf2b3654b4a8..c85438a367d5 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -23,6 +23,7 @@ | |||
23 | #include <linux/mm.h> | 23 | #include <linux/mm.h> |
24 | #include <linux/fs.h> | 24 | #include <linux/fs.h> |
25 | #include <linux/capability.h> | 25 | #include <linux/capability.h> |
26 | #include <linux/security.h> | ||
26 | #include <linux/pci-aspm.h> | 27 | #include <linux/pci-aspm.h> |
27 | #include <linux/slab.h> | 28 | #include <linux/slab.h> |
28 | #include "pci.h" | 29 | #include "pci.h" |
@@ -368,7 +369,7 @@ pci_read_config(struct file *filp, struct kobject *kobj, | |||
368 | u8 *data = (u8*) buf; | 369 | u8 *data = (u8*) buf; |
369 | 370 | ||
370 | /* Several chips lock up trying to read undefined config space */ | 371 | /* Several chips lock up trying to read undefined config space */ |
371 | if (cap_raised(filp->f_cred->cap_effective, CAP_SYS_ADMIN)) { | 372 | if (security_capable(filp->f_cred, CAP_SYS_ADMIN) == 0) { |
372 | size = dev->cfg_size; | 373 | size = dev->cfg_size; |
373 | } else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) { | 374 | } else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) { |
374 | size = 128; | 375 | size = 128; |
diff --git a/drivers/pci/xen-pcifront.c b/drivers/pci/xen-pcifront.c index 3a5a6fcc0ead..492b7d807fe8 100644 --- a/drivers/pci/xen-pcifront.c +++ b/drivers/pci/xen-pcifront.c | |||
@@ -243,7 +243,7 @@ struct pci_ops pcifront_bus_ops = { | |||
243 | 243 | ||
244 | #ifdef CONFIG_PCI_MSI | 244 | #ifdef CONFIG_PCI_MSI |
245 | static int pci_frontend_enable_msix(struct pci_dev *dev, | 245 | static int pci_frontend_enable_msix(struct pci_dev *dev, |
246 | int **vector, int nvec) | 246 | int vector[], int nvec) |
247 | { | 247 | { |
248 | int err; | 248 | int err; |
249 | int i; | 249 | int i; |
@@ -277,18 +277,24 @@ static int pci_frontend_enable_msix(struct pci_dev *dev, | |||
277 | if (likely(!err)) { | 277 | if (likely(!err)) { |
278 | if (likely(!op.value)) { | 278 | if (likely(!op.value)) { |
279 | /* we get the result */ | 279 | /* we get the result */ |
280 | for (i = 0; i < nvec; i++) | 280 | for (i = 0; i < nvec; i++) { |
281 | *(*vector+i) = op.msix_entries[i].vector; | 281 | if (op.msix_entries[i].vector <= 0) { |
282 | return 0; | 282 | dev_warn(&dev->dev, "MSI-X entry %d is invalid: %d!\n", |
283 | i, op.msix_entries[i].vector); | ||
284 | err = -EINVAL; | ||
285 | vector[i] = -1; | ||
286 | continue; | ||
287 | } | ||
288 | vector[i] = op.msix_entries[i].vector; | ||
289 | } | ||
283 | } else { | 290 | } else { |
284 | printk(KERN_DEBUG "enable msix get value %x\n", | 291 | printk(KERN_DEBUG "enable msix get value %x\n", |
285 | op.value); | 292 | op.value); |
286 | return op.value; | ||
287 | } | 293 | } |
288 | } else { | 294 | } else { |
289 | dev_err(&dev->dev, "enable msix get err %x\n", err); | 295 | dev_err(&dev->dev, "enable msix get err %x\n", err); |
290 | return err; | ||
291 | } | 296 | } |
297 | return err; | ||
292 | } | 298 | } |
293 | 299 | ||
294 | static void pci_frontend_disable_msix(struct pci_dev *dev) | 300 | static void pci_frontend_disable_msix(struct pci_dev *dev) |
@@ -310,7 +316,7 @@ static void pci_frontend_disable_msix(struct pci_dev *dev) | |||
310 | dev_err(&dev->dev, "pci_disable_msix get err %x\n", err); | 316 | dev_err(&dev->dev, "pci_disable_msix get err %x\n", err); |
311 | } | 317 | } |
312 | 318 | ||
313 | static int pci_frontend_enable_msi(struct pci_dev *dev, int **vector) | 319 | static int pci_frontend_enable_msi(struct pci_dev *dev, int vector[]) |
314 | { | 320 | { |
315 | int err; | 321 | int err; |
316 | struct xen_pci_op op = { | 322 | struct xen_pci_op op = { |
@@ -324,7 +330,13 @@ static int pci_frontend_enable_msi(struct pci_dev *dev, int **vector) | |||
324 | 330 | ||
325 | err = do_pci_op(pdev, &op); | 331 | err = do_pci_op(pdev, &op); |
326 | if (likely(!err)) { | 332 | if (likely(!err)) { |
327 | *(*vector) = op.value; | 333 | vector[0] = op.value; |
334 | if (op.value <= 0) { | ||
335 | dev_warn(&dev->dev, "MSI entry is invalid: %d!\n", | ||
336 | op.value); | ||
337 | err = -EINVAL; | ||
338 | vector[0] = -1; | ||
339 | } | ||
328 | } else { | 340 | } else { |
329 | dev_err(&dev->dev, "pci frontend enable msi failed for dev " | 341 | dev_err(&dev->dev, "pci frontend enable msi failed for dev " |
330 | "%x:%x\n", op.bus, op.devfn); | 342 | "%x:%x\n", op.bus, op.devfn); |
@@ -733,8 +745,7 @@ static void free_pdev(struct pcifront_device *pdev) | |||
733 | 745 | ||
734 | pcifront_free_roots(pdev); | 746 | pcifront_free_roots(pdev); |
735 | 747 | ||
736 | /*For PCIE_AER error handling job*/ | 748 | cancel_work_sync(&pdev->op_work); |
737 | flush_scheduled_work(); | ||
738 | 749 | ||
739 | if (pdev->irq >= 0) | 750 | if (pdev->irq >= 0) |
740 | unbind_from_irqhandler(pdev->irq, pdev); | 751 | unbind_from_irqhandler(pdev->irq, pdev); |