diff options
Diffstat (limited to 'arch/powerpc/platforms/pseries/eeh.c')
-rw-r--r-- | arch/powerpc/platforms/pseries/eeh.c | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index 5f3e6d8659fe..b8770395013d 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
@@ -1,6 +1,8 @@ | |||
1 | /* | 1 | /* |
2 | * eeh.c | 2 | * eeh.c |
3 | * Copyright (C) 2001 Dave Engebretsen & Todd Inglett IBM Corporation | 3 | * Copyright IBM Corporation 2001, 2005, 2006 |
4 | * Copyright Dave Engebretsen & Todd Inglett 2001 | ||
5 | * Copyright Linas Vepstas 2005, 2006 | ||
4 | * | 6 | * |
5 | * This program is free software; you can redistribute it and/or modify | 7 | * This program is free software; you can redistribute it and/or modify |
6 | * it under the terms of the GNU General Public License as published by | 8 | * it under the terms of the GNU General Public License as published by |
@@ -15,6 +17,8 @@ | |||
15 | * You should have received a copy of the GNU General Public License | 17 | * You should have received a copy of the GNU General Public License |
16 | * along with this program; if not, write to the Free Software | 18 | * along with this program; if not, write to the Free Software |
17 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | 19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
20 | * | ||
21 | * Please address comments and feedback to Linas Vepstas <linas@austin.ibm.com> | ||
18 | */ | 22 | */ |
19 | 23 | ||
20 | #include <linux/delay.h> | 24 | #include <linux/delay.h> |
@@ -117,7 +121,6 @@ static unsigned long no_cfg_addr; | |||
117 | static unsigned long ignored_check; | 121 | static unsigned long ignored_check; |
118 | static unsigned long total_mmio_ffs; | 122 | static unsigned long total_mmio_ffs; |
119 | static unsigned long false_positives; | 123 | static unsigned long false_positives; |
120 | static unsigned long ignored_failures; | ||
121 | static unsigned long slot_resets; | 124 | static unsigned long slot_resets; |
122 | 125 | ||
123 | #define IS_BRIDGE(class_code) (((class_code)<<16) == PCI_BASE_CLASS_BRIDGE) | 126 | #define IS_BRIDGE(class_code) (((class_code)<<16) == PCI_BASE_CLASS_BRIDGE) |
@@ -505,6 +508,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
505 | printk(KERN_WARNING "EEH: read_slot_reset_state() failed; rc=%d dn=%s\n", | 508 | printk(KERN_WARNING "EEH: read_slot_reset_state() failed; rc=%d dn=%s\n", |
506 | ret, dn->full_name); | 509 | ret, dn->full_name); |
507 | false_positives++; | 510 | false_positives++; |
511 | pdn->eeh_false_positives ++; | ||
508 | rc = 0; | 512 | rc = 0; |
509 | goto dn_unlock; | 513 | goto dn_unlock; |
510 | } | 514 | } |
@@ -513,6 +517,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
513 | * they are empty when they don't have children. */ | 517 | * they are empty when they don't have children. */ |
514 | if ((rets[0] == 5) && (dn->child == NULL)) { | 518 | if ((rets[0] == 5) && (dn->child == NULL)) { |
515 | false_positives++; | 519 | false_positives++; |
520 | pdn->eeh_false_positives ++; | ||
516 | rc = 0; | 521 | rc = 0; |
517 | goto dn_unlock; | 522 | goto dn_unlock; |
518 | } | 523 | } |
@@ -522,6 +527,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
522 | printk(KERN_WARNING "EEH: event on unsupported device, rc=%d dn=%s\n", | 527 | printk(KERN_WARNING "EEH: event on unsupported device, rc=%d dn=%s\n", |
523 | ret, dn->full_name); | 528 | ret, dn->full_name); |
524 | false_positives++; | 529 | false_positives++; |
530 | pdn->eeh_false_positives ++; | ||
525 | rc = 0; | 531 | rc = 0; |
526 | goto dn_unlock; | 532 | goto dn_unlock; |
527 | } | 533 | } |
@@ -529,6 +535,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
529 | /* If not the kind of error we know about, punt. */ | 535 | /* If not the kind of error we know about, punt. */ |
530 | if (rets[0] != 1 && rets[0] != 2 && rets[0] != 4 && rets[0] != 5) { | 536 | if (rets[0] != 1 && rets[0] != 2 && rets[0] != 4 && rets[0] != 5) { |
531 | false_positives++; | 537 | false_positives++; |
538 | pdn->eeh_false_positives ++; | ||
532 | rc = 0; | 539 | rc = 0; |
533 | goto dn_unlock; | 540 | goto dn_unlock; |
534 | } | 541 | } |
@@ -921,6 +928,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
921 | pdn->eeh_mode = 0; | 928 | pdn->eeh_mode = 0; |
922 | pdn->eeh_check_count = 0; | 929 | pdn->eeh_check_count = 0; |
923 | pdn->eeh_freeze_count = 0; | 930 | pdn->eeh_freeze_count = 0; |
931 | pdn->eeh_false_positives = 0; | ||
924 | 932 | ||
925 | if (status && strcmp(status, "ok") != 0) | 933 | if (status && strcmp(status, "ok") != 0) |
926 | return NULL; /* ignore devices with bad status */ | 934 | return NULL; /* ignore devices with bad status */ |
@@ -1139,7 +1147,8 @@ static void eeh_add_device_late(struct pci_dev *dev) | |||
1139 | pdn = PCI_DN(dn); | 1147 | pdn = PCI_DN(dn); |
1140 | pdn->pcidev = dev; | 1148 | pdn->pcidev = dev; |
1141 | 1149 | ||
1142 | pci_addr_cache_insert_device (dev); | 1150 | pci_addr_cache_insert_device(dev); |
1151 | eeh_sysfs_add_device(dev); | ||
1143 | } | 1152 | } |
1144 | 1153 | ||
1145 | void eeh_add_device_tree_late(struct pci_bus *bus) | 1154 | void eeh_add_device_tree_late(struct pci_bus *bus) |
@@ -1178,6 +1187,7 @@ static void eeh_remove_device(struct pci_dev *dev) | |||
1178 | printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev)); | 1187 | printk(KERN_DEBUG "EEH: remove device %s\n", pci_name(dev)); |
1179 | #endif | 1188 | #endif |
1180 | pci_addr_cache_remove_device(dev); | 1189 | pci_addr_cache_remove_device(dev); |
1190 | eeh_sysfs_remove_device(dev); | ||
1181 | 1191 | ||
1182 | dn = pci_device_to_OF_node(dev); | 1192 | dn = pci_device_to_OF_node(dev); |
1183 | if (PCI_DN(dn)->pcidev) { | 1193 | if (PCI_DN(dn)->pcidev) { |
@@ -1214,11 +1224,10 @@ static int proc_eeh_show(struct seq_file *m, void *v) | |||
1214 | "check not wanted=%ld\n" | 1224 | "check not wanted=%ld\n" |
1215 | "eeh_total_mmio_ffs=%ld\n" | 1225 | "eeh_total_mmio_ffs=%ld\n" |
1216 | "eeh_false_positives=%ld\n" | 1226 | "eeh_false_positives=%ld\n" |
1217 | "eeh_ignored_failures=%ld\n" | ||
1218 | "eeh_slot_resets=%ld\n", | 1227 | "eeh_slot_resets=%ld\n", |
1219 | no_device, no_dn, no_cfg_addr, | 1228 | no_device, no_dn, no_cfg_addr, |
1220 | ignored_check, total_mmio_ffs, | 1229 | ignored_check, total_mmio_ffs, |
1221 | false_positives, ignored_failures, | 1230 | false_positives, |
1222 | slot_resets); | 1231 | slot_resets); |
1223 | } | 1232 | } |
1224 | 1233 | ||