aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/powerpc/kernel/eeh_driver.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 7100a5b96e70..8bb40e7cdeb6 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -447,8 +447,9 @@ static void *eeh_pe_detach_dev(void *data, void *userdata)
447 * PE reset (for 3 times), we try to clear the frozen state 447 * PE reset (for 3 times), we try to clear the frozen state
448 * for 3 times as well. 448 * for 3 times as well.
449 */ 449 */
450static int eeh_clear_pe_frozen_state(struct eeh_pe *pe) 450static void *__eeh_clear_pe_frozen_state(void *data, void *flag)
451{ 451{
452 struct eeh_pe *pe = (struct eeh_pe *)data;
452 int i, rc; 453 int i, rc;
453 454
454 for (i = 0; i < 3; i++) { 455 for (i = 0; i < 3; i++) {
@@ -461,13 +462,24 @@ static int eeh_clear_pe_frozen_state(struct eeh_pe *pe)
461 } 462 }
462 463
463 /* The PE has been isolated, clear it */ 464 /* The PE has been isolated, clear it */
464 if (rc) 465 if (rc) {
465 pr_warn("%s: Can't clear frozen PHB#%x-PE#%x (%d)\n", 466 pr_warn("%s: Can't clear frozen PHB#%x-PE#%x (%d)\n",
466 __func__, pe->phb->global_number, pe->addr, rc); 467 __func__, pe->phb->global_number, pe->addr, rc);
467 else 468 return (void *)pe;
469 }
470
471 return NULL;
472}
473
474static int eeh_clear_pe_frozen_state(struct eeh_pe *pe)
475{
476 void *rc;
477
478 rc = eeh_pe_traverse(pe, __eeh_clear_pe_frozen_state, NULL);
479 if (!rc)
468 eeh_pe_state_clear(pe, EEH_PE_ISOLATED); 480 eeh_pe_state_clear(pe, EEH_PE_ISOLATED);
469 481
470 return rc; 482 return rc ? -EIO : 0;
471} 483}
472 484
473/** 485/**