|
|
@@ -447,8 +447,9 @@ static void *eeh_pe_detach_dev(void *data, void *userdata)
|
|
|
* PE reset (for 3 times), we try to clear the frozen state
|
|
|
* for 3 times as well.
|
|
|
*/
|
|
|
-static int eeh_clear_pe_frozen_state(struct eeh_pe *pe)
|
|
|
+static void *__eeh_clear_pe_frozen_state(void *data, void *flag)
|
|
|
{
|
|
|
+ struct eeh_pe *pe = (struct eeh_pe *)data;
|
|
|
int i, rc;
|
|
|
|
|
|
for (i = 0; i < 3; i++) {
|
|
|
@@ -461,13 +462,24 @@ static int eeh_clear_pe_frozen_state(struct eeh_pe *pe)
|
|
|
}
|
|
|
|
|
|
/* The PE has been isolated, clear it */
|
|
|
- if (rc)
|
|
|
+ if (rc) {
|
|
|
pr_warn("%s: Can't clear frozen PHB#%x-PE#%x (%d)\n",
|
|
|
__func__, pe->phb->global_number, pe->addr, rc);
|
|
|
- else
|
|
|
+ return (void *)pe;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+
|
|
|
+static int eeh_clear_pe_frozen_state(struct eeh_pe *pe)
|
|
|
+{
|
|
|
+ void *rc;
|
|
|
+
|
|
|
+ rc = eeh_pe_traverse(pe, __eeh_clear_pe_frozen_state, NULL);
|
|
|
+ if (!rc)
|
|
|
eeh_pe_state_clear(pe, EEH_PE_ISOLATED);
|
|
|
|
|
|
- return rc;
|
|
|
+ return rc ? -EIO : 0;
|
|
|
}
|
|
|
|
|
|
/**
|