[PATCH] read_slot_reset_state2 rtas call
Paul Mackerras
paulus at samba.org
Thu Nov 25 22:39:03 EST 2004
Nathan Fontenot writes:
> This patch attempts to use the newer rtas call if available and falls
> back the older version otherwise. This will maintain EEH slot checking
> capabilities on all future and current firmware levels.
David Howells pointed out that one of the read_slot_reset_state calls
wasn't checking the return value, so here's a version of the patch
that does. I'll send this to akpm later.
Paul.
diff -urN linux-2.5/arch/ppc64/kernel/eeh.c test/arch/ppc64/kernel/eeh.c
--- linux-2.5/arch/ppc64/kernel/eeh.c 2004-10-26 16:06:41.000000000 +1000
+++ test/arch/ppc64/kernel/eeh.c 2004-11-25 22:24:59.681460824 +1100
@@ -95,6 +95,7 @@
static int ibm_set_eeh_option;
static int ibm_set_slot_reset;
static int ibm_read_slot_reset_state;
+static int ibm_read_slot_reset_state2;
static int ibm_slot_error_detail;
static int eeh_subsystem_enabled;
@@ -407,6 +408,27 @@
}
/**
+ * read_slot_reset_state - Read the reset state of a device node's slot
+ * @dn: device node to read
+ * @rets: array to return results in
+ */
+static int read_slot_reset_state(struct device_node *dn, int rets[])
+{
+ int token, outputs;
+
+ if (ibm_read_slot_reset_state2 != RTAS_UNKNOWN_SERVICE) {
+ token = ibm_read_slot_reset_state2;
+ outputs = 4;
+ } else {
+ token = ibm_read_slot_reset_state;
+ outputs = 3;
+ }
+
+ return rtas_call(token, 3, outputs, rets, dn->eeh_config_addr,
+ BUID_HI(dn->phb->buid), BUID_LO(dn->phb->buid));
+}
+
+/**
* eeh_panic - call panic() for an eeh event that cannot be handled.
* The philosophy of this routine is that it is better to panic and
* halt the OS than it is to risk possible data corruption by
@@ -508,7 +530,7 @@
int eeh_dn_check_failure(struct device_node *dn, struct pci_dev *dev)
{
int ret;
- int rets[2];
+ int rets[3];
unsigned long flags;
int rc, reset_state;
struct eeh_event *event;
@@ -539,11 +561,8 @@
atomic_inc(&eeh_fail_count);
if (atomic_read(&eeh_fail_count) >= EEH_MAX_FAILS) {
/* re-read the slot reset state */
- rets[0] = -1;
- rtas_call(ibm_read_slot_reset_state, 3, 3, rets,
- dn->eeh_config_addr,
- BUID_HI(dn->phb->buid),
- BUID_LO(dn->phb->buid));
+ if (read_slot_reset_state(dn, rets) != 0)
+ rets[0] = -1; /* reset state unknown */
eeh_panic(dev, rets[0]);
}
return 0;
@@ -556,10 +575,7 @@
* function zero of a multi-function device.
* In any case they must share a common PHB.
*/
- ret = rtas_call(ibm_read_slot_reset_state, 3, 3, rets,
- dn->eeh_config_addr, BUID_HI(dn->phb->buid),
- BUID_LO(dn->phb->buid));
-
+ ret = read_slot_reset_state(dn, rets);
if (!(ret == 0 && rets[1] == 1 && (rets[0] == 2 || rets[0] == 4))) {
__get_cpu_var(false_positives)++;
return 0;
@@ -755,6 +771,7 @@
ibm_set_eeh_option = rtas_token("ibm,set-eeh-option");
ibm_set_slot_reset = rtas_token("ibm,set-slot-reset");
+ ibm_read_slot_reset_state2 = rtas_token("ibm,read-slot-reset-state2");
ibm_read_slot_reset_state = rtas_token("ibm,read-slot-reset-state");
ibm_slot_error_detail = rtas_token("ibm,slot-error-detail");
More information about the Linuxppc64-dev
mailing list