diff options
Diffstat (limited to 'arch/powerpc/kernel/eeh.c')
| -rw-r--r-- | arch/powerpc/kernel/eeh.c | 32 | 
1 files changed, 26 insertions, 6 deletions
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index 148db72a8c43..e7b76a6bf150 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c @@ -28,6 +28,7 @@  #include <linux/pci.h>  #include <linux/proc_fs.h>  #include <linux/rbtree.h> +#include <linux/reboot.h>  #include <linux/seq_file.h>  #include <linux/spinlock.h>  #include <linux/export.h> @@ -89,7 +90,7 @@  /* Platform dependent EEH operations */  struct eeh_ops *eeh_ops = NULL; -int eeh_subsystem_enabled; +bool eeh_subsystem_enabled = false;  EXPORT_SYMBOL(eeh_subsystem_enabled);  /* @@ -364,7 +365,7 @@ int eeh_dev_check_failure(struct eeh_dev *edev)  	eeh_stats.total_mmio_ffs++; -	if (!eeh_subsystem_enabled) +	if (!eeh_enabled())  		return 0;  	if (!edev) { @@ -747,6 +748,17 @@ int __exit eeh_ops_unregister(const char *name)  	return -EEXIST;  } +static int eeh_reboot_notifier(struct notifier_block *nb, +			       unsigned long action, void *unused) +{ +	eeh_set_enable(false); +	return NOTIFY_DONE; +} + +static struct notifier_block eeh_reboot_nb = { +	.notifier_call = eeh_reboot_notifier, +}; +  /**   * eeh_init - EEH initialization   * @@ -778,6 +790,14 @@ int eeh_init(void)  	if (machine_is(powernv) && cnt++ <= 0)  		return ret; +	/* Register reboot notifier */ +	ret = register_reboot_notifier(&eeh_reboot_nb); +	if (ret) { +		pr_warn("%s: Failed to register notifier (%d)\n", +			__func__, ret); +		return ret; +	} +  	/* call platform initialization function */  	if (!eeh_ops) {  		pr_warning("%s: Platform EEH operation not found\n", @@ -822,7 +842,7 @@ int eeh_init(void)  			return ret;  	} -	if (eeh_subsystem_enabled) +	if (eeh_enabled())  		pr_info("EEH: PCI Enhanced I/O Error Handling Enabled\n");  	else  		pr_warning("EEH: No capable adapters found\n"); @@ -897,7 +917,7 @@ void eeh_add_device_late(struct pci_dev *dev)  	struct device_node *dn;  	struct eeh_dev *edev; -	if (!dev || !eeh_subsystem_enabled) +	if (!dev || !eeh_enabled())  		return;  	pr_debug("EEH: Adding device %s\n", pci_name(dev)); @@ -1005,7 +1025,7 @@ void eeh_remove_device(struct pci_dev *dev)  {  	struct eeh_dev *edev; -	if (!dev || !eeh_subsystem_enabled) +	if (!dev || !eeh_enabled())  		return;  	edev = pci_dev_to_eeh_dev(dev); @@ -1045,7 +1065,7 @@ void eeh_remove_device(struct pci_dev *dev)  static int proc_eeh_show(struct seq_file *m, void *v)  { -	if (0 == eeh_subsystem_enabled) { +	if (!eeh_enabled()) {  		seq_printf(m, "EEH Subsystem is globally disabled\n");  		seq_printf(m, "eeh_total_mmio_ffs=%llu\n", eeh_stats.total_mmio_ffs);  	} else {  | 
