diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/powerpc/kernel/eeh_driver.c | 20 |
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 | */ |
450 | static int eeh_clear_pe_frozen_state(struct eeh_pe *pe) | 450 | static 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 | |||
474 | static 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 | /** |