aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGavin Shan <gwshan@linux.vnet.ibm.com>2015-10-07 23:58:54 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2015-10-21 05:41:43 -0400
commit8234fcedf18debbae0b8b06a5c70def5169c146c (patch)
treefacf412a9a0e2a3b589a3ed006afdb20495b0368
parentf2da4ccf8bd46d3ab0fac383decf5616ad362c17 (diff)
powerpc/eeh: Force reset on fenced PHB
On fenced PHB, the error handlers in the drivers of its subordinate devices could return PCI_ERS_RESULT_CAN_RECOVER, indicating no reset will be issued during the recovery. It's conflicting with the fact that fenced PHB won't be recovered without reset. This limits the return value from the error handlers in the drivers of the fenced PHB's subordinate devices to PCI_ERS_RESULT_NEED_NONE or PCI_ERS_RESULT_NEED_RESET, to ensure reset will be issued during recovery. Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com> Reviewed-by: Daniel Axtens <dja@axtens.net> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/kernel/eeh_driver.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index 32178a43138f..80dfe8965df9 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -664,9 +664,17 @@ static void eeh_handle_normal_event(struct eeh_pe *pe)
664 * to accomplish the reset. Each child gets a report of the 664 * to accomplish the reset. Each child gets a report of the
665 * status ... if any child can't handle the reset, then the entire 665 * status ... if any child can't handle the reset, then the entire
666 * slot is dlpar removed and added. 666 * slot is dlpar removed and added.
667 *
668 * When the PHB is fenced, we have to issue a reset to recover from
669 * the error. Override the result if necessary to have partially
670 * hotplug for this case.
667 */ 671 */
668 pr_info("EEH: Notify device drivers to shutdown\n"); 672 pr_info("EEH: Notify device drivers to shutdown\n");
669 eeh_pe_dev_traverse(pe, eeh_report_error, &result); 673 eeh_pe_dev_traverse(pe, eeh_report_error, &result);
674 if ((pe->type & EEH_PE_PHB) &&
675 result != PCI_ERS_RESULT_NONE &&
676 result != PCI_ERS_RESULT_NEED_RESET)
677 result = PCI_ERS_RESULT_NEED_RESET;
670 678
671 /* Get the current PCI slot state. This can take a long time, 679 /* Get the current PCI slot state. This can take a long time,
672 * sometimes over 300 seconds for certain systems. 680 * sometimes over 300 seconds for certain systems.