diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/pci/host/pci-mvebu.c | 5 | ||||
| -rw-r--r-- | drivers/pci/pci-driver.c | 38 | ||||
| -rw-r--r-- | drivers/pci/remove.c | 4 |
3 files changed, 38 insertions, 9 deletions
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c index c269e430c760..2aa7b77c7c88 100644 --- a/drivers/pci/host/pci-mvebu.c +++ b/drivers/pci/host/pci-mvebu.c | |||
| @@ -447,6 +447,11 @@ static int mvebu_sw_pci_bridge_read(struct mvebu_pcie_port *port, | |||
| 447 | *value = 0; | 447 | *value = 0; |
| 448 | break; | 448 | break; |
| 449 | 449 | ||
| 450 | case PCI_INTERRUPT_LINE: | ||
| 451 | /* LINE PIN MIN_GNT MAX_LAT */ | ||
| 452 | *value = 0; | ||
| 453 | break; | ||
| 454 | |||
| 450 | default: | 455 | default: |
| 451 | *value = 0xffffffff; | 456 | *value = 0xffffffff; |
| 452 | return PCIBIOS_BAD_REGISTER_NUMBER; | 457 | return PCIBIOS_BAD_REGISTER_NUMBER; |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 9042fdbd7244..25f0bc659164 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -19,6 +19,7 @@ | |||
| 19 | #include <linux/cpu.h> | 19 | #include <linux/cpu.h> |
| 20 | #include <linux/pm_runtime.h> | 20 | #include <linux/pm_runtime.h> |
| 21 | #include <linux/suspend.h> | 21 | #include <linux/suspend.h> |
| 22 | #include <linux/kexec.h> | ||
| 22 | #include "pci.h" | 23 | #include "pci.h" |
| 23 | 24 | ||
| 24 | struct pci_dynid { | 25 | struct pci_dynid { |
| @@ -288,12 +289,27 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, | |||
| 288 | int error, node; | 289 | int error, node; |
| 289 | struct drv_dev_and_id ddi = { drv, dev, id }; | 290 | struct drv_dev_and_id ddi = { drv, dev, id }; |
| 290 | 291 | ||
| 291 | /* Execute driver initialization on node where the device's | 292 | /* |
| 292 | bus is attached to. This way the driver likely allocates | 293 | * Execute driver initialization on node where the device is |
| 293 | its local memory on the right node without any need to | 294 | * attached. This way the driver likely allocates its local memory |
| 294 | change it. */ | 295 | * on the right node. |
| 296 | */ | ||
| 295 | node = dev_to_node(&dev->dev); | 297 | node = dev_to_node(&dev->dev); |
| 296 | if (node >= 0) { | 298 | |
| 299 | /* | ||
| 300 | * On NUMA systems, we are likely to call a PF probe function using | ||
| 301 | * work_on_cpu(). If that probe calls pci_enable_sriov() (which | ||
| 302 | * adds the VF devices via pci_bus_add_device()), we may re-enter | ||
| 303 | * this function to call the VF probe function. Calling | ||
| 304 | * work_on_cpu() again will cause a lockdep warning. Since VFs are | ||
| 305 | * always on the same node as the PF, we can work around this by | ||
| 306 | * avoiding work_on_cpu() when we're already on the correct node. | ||
| 307 | * | ||
| 308 | * Preemption is enabled, so it's theoretically unsafe to use | ||
| 309 | * numa_node_id(), but even if we run the probe function on the | ||
| 310 | * wrong node, it should be functionally correct. | ||
| 311 | */ | ||
| 312 | if (node >= 0 && node != numa_node_id()) { | ||
| 297 | int cpu; | 313 | int cpu; |
| 298 | 314 | ||
| 299 | get_online_cpus(); | 315 | get_online_cpus(); |
| @@ -305,6 +321,7 @@ static int pci_call_probe(struct pci_driver *drv, struct pci_dev *dev, | |||
| 305 | put_online_cpus(); | 321 | put_online_cpus(); |
| 306 | } else | 322 | } else |
| 307 | error = local_pci_probe(&ddi); | 323 | error = local_pci_probe(&ddi); |
| 324 | |||
| 308 | return error; | 325 | return error; |
| 309 | } | 326 | } |
| 310 | 327 | ||
| @@ -399,12 +416,17 @@ static void pci_device_shutdown(struct device *dev) | |||
| 399 | pci_msi_shutdown(pci_dev); | 416 | pci_msi_shutdown(pci_dev); |
| 400 | pci_msix_shutdown(pci_dev); | 417 | pci_msix_shutdown(pci_dev); |
| 401 | 418 | ||
| 419 | #ifdef CONFIG_KEXEC | ||
| 402 | /* | 420 | /* |
| 403 | * Turn off Bus Master bit on the device to tell it to not | 421 | * If this is a kexec reboot, turn off Bus Master bit on the |
| 404 | * continue to do DMA. Don't touch devices in D3cold or unknown states. | 422 | * device to tell it to not continue to do DMA. Don't touch |
| 423 | * devices in D3cold or unknown states. | ||
| 424 | * If it is not a kexec reboot, firmware will hit the PCI | ||
| 425 | * devices with big hammer and stop their DMA any way. | ||
| 405 | */ | 426 | */ |
| 406 | if (pci_dev->current_state <= PCI_D3hot) | 427 | if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot)) |
| 407 | pci_clear_master(pci_dev); | 428 | pci_clear_master(pci_dev); |
| 429 | #endif | ||
| 408 | } | 430 | } |
| 409 | 431 | ||
| 410 | #ifdef CONFIG_PM | 432 | #ifdef CONFIG_PM |
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index 1576851028db..cc9337a71529 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c | |||
| @@ -24,7 +24,7 @@ static void pci_stop_dev(struct pci_dev *dev) | |||
| 24 | if (dev->is_added) { | 24 | if (dev->is_added) { |
| 25 | pci_proc_detach_device(dev); | 25 | pci_proc_detach_device(dev); |
| 26 | pci_remove_sysfs_dev_files(dev); | 26 | pci_remove_sysfs_dev_files(dev); |
| 27 | device_del(&dev->dev); | 27 | device_release_driver(&dev->dev); |
| 28 | dev->is_added = 0; | 28 | dev->is_added = 0; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| @@ -34,6 +34,8 @@ static void pci_stop_dev(struct pci_dev *dev) | |||
| 34 | 34 | ||
| 35 | static void pci_destroy_dev(struct pci_dev *dev) | 35 | static void pci_destroy_dev(struct pci_dev *dev) |
| 36 | { | 36 | { |
| 37 | device_del(&dev->dev); | ||
| 38 | |||
| 37 | down_write(&pci_bus_sem); | 39 | down_write(&pci_bus_sem); |
| 38 | list_del(&dev->bus_list); | 40 | list_del(&dev->bus_list); |
| 39 | up_write(&pci_bus_sem); | 41 | up_write(&pci_bus_sem); |
