diff options
author | Linas Vepstas <linas@austin.ibm.com> | 2007-05-23 13:20:51 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-06-14 08:29:55 -0400 |
commit | 858955bd572f0ca38b258e45c7dd743b9e44b04e (patch) | |
tree | f24ee25bc6e65c394c294e01cfffe6ba87cf46b3 /arch/powerpc/platforms/pseries/eeh.c | |
parent | e1d04c9769398ae7df8c7ca2681b25f540b719d5 (diff) |
[POWERPC] Show EEH per-device false positives
Track and report the number of times we read an all-1s value (0xff,
0xffff or 0xffffffff) from each device which is valid data, not
indicating EEH isolation.
Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
----
arch/powerpc/platforms/pseries/eeh.c | 5 +++++
arch/powerpc/platforms/pseries/eeh_sysfs.c | 3 +++
include/asm-powerpc/pci-bridge.h | 1 +
3 files changed, 9 insertions(+)
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/pseries/eeh.c')
-rw-r--r-- | arch/powerpc/platforms/pseries/eeh.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/arch/powerpc/platforms/pseries/eeh.c b/arch/powerpc/platforms/pseries/eeh.c index d284a58c5b5f..ff33c150535e 100644 --- a/arch/powerpc/platforms/pseries/eeh.c +++ b/arch/powerpc/platforms/pseries/eeh.c | |||
@@ -505,6 +505,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", | 505 | printk(KERN_WARNING "EEH: read_slot_reset_state() failed; rc=%d dn=%s\n", |
506 | ret, dn->full_name); | 506 | ret, dn->full_name); |
507 | false_positives++; | 507 | false_positives++; |
508 | pdn->eeh_false_positives ++; | ||
508 | rc = 0; | 509 | rc = 0; |
509 | goto dn_unlock; | 510 | goto dn_unlock; |
510 | } | 511 | } |
@@ -513,6 +514,7 @@ int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev) | |||
513 | * they are empty when they don't have children. */ | 514 | * they are empty when they don't have children. */ |
514 | if ((rets[0] == 5) && (dn->child == NULL)) { | 515 | if ((rets[0] == 5) && (dn->child == NULL)) { |
515 | false_positives++; | 516 | false_positives++; |
517 | pdn->eeh_false_positives ++; | ||
516 | rc = 0; | 518 | rc = 0; |
517 | goto dn_unlock; | 519 | goto dn_unlock; |
518 | } | 520 | } |
@@ -522,6 +524,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", | 524 | printk(KERN_WARNING "EEH: event on unsupported device, rc=%d dn=%s\n", |
523 | ret, dn->full_name); | 525 | ret, dn->full_name); |
524 | false_positives++; | 526 | false_positives++; |
527 | pdn->eeh_false_positives ++; | ||
525 | rc = 0; | 528 | rc = 0; |
526 | goto dn_unlock; | 529 | goto dn_unlock; |
527 | } | 530 | } |
@@ -529,6 +532,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. */ | 532 | /* If not the kind of error we know about, punt. */ |
530 | if (rets[0] != 1 && rets[0] != 2 && rets[0] != 4 && rets[0] != 5) { | 533 | if (rets[0] != 1 && rets[0] != 2 && rets[0] != 4 && rets[0] != 5) { |
531 | false_positives++; | 534 | false_positives++; |
535 | pdn->eeh_false_positives ++; | ||
532 | rc = 0; | 536 | rc = 0; |
533 | goto dn_unlock; | 537 | goto dn_unlock; |
534 | } | 538 | } |
@@ -921,6 +925,7 @@ static void *early_enable_eeh(struct device_node *dn, void *data) | |||
921 | pdn->eeh_mode = 0; | 925 | pdn->eeh_mode = 0; |
922 | pdn->eeh_check_count = 0; | 926 | pdn->eeh_check_count = 0; |
923 | pdn->eeh_freeze_count = 0; | 927 | pdn->eeh_freeze_count = 0; |
928 | pdn->eeh_false_positives = 0; | ||
924 | 929 | ||
925 | if (status && strcmp(status, "ok") != 0) | 930 | if (status && strcmp(status, "ok") != 0) |
926 | return NULL; /* ignore devices with bad status */ | 931 | return NULL; /* ignore devices with bad status */ |