|
@@ -19,6 +19,7 @@
|
|
|
#include <linux/cpu.h>
|
|
|
#include <linux/pm_runtime.h>
|
|
|
#include <linux/suspend.h>
|
|
|
+#include <linux/kexec.h>
|
|
|
#include "pci.h"
|
|
|
|
|
|
struct pci_dynid {
|
|
@@ -415,12 +416,17 @@ static void pci_device_shutdown(struct device *dev)
|
|
|
pci_msi_shutdown(pci_dev);
|
|
|
pci_msix_shutdown(pci_dev);
|
|
|
|
|
|
+#ifdef CONFIG_KEXEC
|
|
|
/*
|
|
|
- * Turn off Bus Master bit on the device to tell it to not
|
|
|
- * continue to do DMA. Don't touch devices in D3cold or unknown states.
|
|
|
+ * If this is a kexec reboot, turn off Bus Master bit on the
|
|
|
+ * device to tell it to not continue to do DMA. Don't touch
|
|
|
+ * devices in D3cold or unknown states.
|
|
|
+ * If it is not a kexec reboot, firmware will hit the PCI
|
|
|
+ * devices with big hammer and stop their DMA any way.
|
|
|
*/
|
|
|
- if (pci_dev->current_state <= PCI_D3hot)
|
|
|
+ if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot))
|
|
|
pci_clear_master(pci_dev);
|
|
|
+#endif
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|