diff options
author | Gavin Shan <gwshan@linux.vnet.ibm.com> | 2014-04-16 09:51:38 +1000 |
---|---|---|
committer | Wang Sen <wangsen@linux.vnet.ibm.com> | 2014-04-16 11:15:21 +0800 |
commit | c7969287b5b3a5a135dd046bb5a10c8a49144471 (patch) | |
tree | 0f580d1b3e227f212370bb7e0cf2585700dd318b | |
parent | 46635fcc6554b2f99ba6fc252142150f96b7bfa3 (diff) | |
download | powerpc-c7969287b5b3a5a135dd046bb5a10c8a49144471.tar.gz |
powerpc/eeh: Can't recover from non-PE-reset case
When PCI_ERS_RESULT_CAN_RECOVER returned from device drivers, the
EEH core should enable I/O and DMA for the affected PE. However,
it was missed to have DMA enabled in eeh_handle_normal_event().
Besides, the frozen state of the affected PE should be cleared
after successful recovery, but we didn't.
The patch fixes both of the issues as above. It's responsing to
bug#105179.
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
-rw-r--r-- | arch/powerpc/kernel/eeh_driver.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index 920607d611dea1..5f375073cf7f3b 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c @@ -612,7 +612,6 @@ static void eeh_handle_normal_event(struct eeh_pe *pe) result = PCI_ERS_RESULT_NEED_RESET; } else { pr_info("EEH: Notify device drivers to resume I/O\n"); - result = PCI_ERS_RESULT_NONE; eeh_pe_dev_traverse(pe, eeh_report_mmio_enabled, &result); } } @@ -624,10 +623,17 @@ static void eeh_handle_normal_event(struct eeh_pe *pe) if (rc < 0) goto hard_fail; - if (rc) + if (rc) { result = PCI_ERS_RESULT_NEED_RESET; - else + } else { + /* + * We didn't do PE reset for the case. The PE + * is still in frozen state. Clear it before + * resuming the PE. + */ + eeh_pe_state_clear(pe, EEH_PE_ISOLATED); result = PCI_ERS_RESULT_RECOVERED; + } } /* If any device has a hard failure, then shut off everything. */ |