summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/usr/initservice/istepdispatcher/istepdispatcher.C66
1 files changed, 52 insertions, 14 deletions
diff --git a/src/usr/initservice/istepdispatcher/istepdispatcher.C b/src/usr/initservice/istepdispatcher/istepdispatcher.C
index 942c594bf..98e68ac20 100644
--- a/src/usr/initservice/istepdispatcher/istepdispatcher.C
+++ b/src/usr/initservice/istepdispatcher/istepdispatcher.C
@@ -366,6 +366,7 @@ errlHndl_t IStepDispatcher::executeAllISteps()
uint32_t substep = 0;
bool l_doReconfig = false;
uint32_t numReconfigs = 0;
+ bool l_manufacturingMode = false;
// soft reconfig loops happen really fast
// and since for scale-out systems it only happens for istep 7
@@ -375,6 +376,24 @@ errlHndl_t IStepDispatcher::executeAllISteps()
TRACFCOMP(g_trac_initsvc, ENTER_MRK"IStepDispatcher::executeAllISteps()");
+ // Find out if in manufacturing mode
+ TARGETING::Target* l_pTopLevel = nullptr;
+ TARGETING::targetService().getTopLevelTarget(l_pTopLevel);
+ // Assert if we still have a nullptr target
+ assert(l_pTopLevel != nullptr,"IstepDispatcher::executeAllISteps()"
+ " expected top level target, but got nullptr.");
+
+ auto l_mnfgFlags =
+ l_pTopLevel->getAttr<TARGETING::ATTR_MNFG_FLAGS>();
+
+ // Check to see if SRC_TERM bit is set in MNFG flags
+ if (l_mnfgFlags & TARGETING::MNFG_FLAG_SRC_TERM)
+ {
+ TRACFCOMP(g_trac_initsvc, ERR_MRK"executeAllISteps:"
+ " In manufacturing mode");
+ l_manufacturingMode = true;
+ }
+
while (istep < MaxISteps)
{
substep = 0;
@@ -408,19 +427,6 @@ errlHndl_t IStepDispatcher::executeAllISteps()
" Reconfig required after IStep %d:%d",
istep, substep);
- // Find out if in manufacturing mode
- bool l_manufacturingMode = false;
- TARGETING::Target* l_pTopLevel = NULL;
- TARGETING::targetService().getTopLevelTarget(l_pTopLevel);
- TARGETING::ATTR_MNFG_FLAGS_type l_mnfgFlags =
- l_pTopLevel->getAttr<TARGETING::ATTR_MNFG_FLAGS>();
- if (l_mnfgFlags & TARGETING::MNFG_FLAG_SRC_TERM)
- {
- TRACFCOMP(g_trac_initsvc, ERR_MRK"executeAllISteps:"
- " In manufacturing mode");
- l_manufacturingMode = true;
- }
-
// Find out if in MPIPL mode
bool l_MPIPLMode = false;
if (l_pTopLevel->getAttr<TARGETING::ATTR_IS_MPIPL_HB>())
@@ -582,7 +588,7 @@ errlHndl_t IStepDispatcher::executeAllISteps()
// records have been set. We will not increment
// the reboot count.
TRACFCOMP(g_trac_initsvc, "Reconfig loop needed "
- "but no new gard records were commited. Do "
+ "but no new gard records were committed. Do "
"not increment reboot count.");
}
@@ -607,6 +613,38 @@ errlHndl_t IStepDispatcher::executeAllISteps()
}
}
+#ifdef CONFIG_BMC_IPMI
+ if(l_manufacturingMode &&
+ (ERRORLOG::ErrlManager::errlCommittedThisBoot()))
+ {
+ TRACFCOMP(g_trac_initsvc, "Manufacturing Mode is set and an "
+ "error log has been committed. Stopping the IPL.");
+
+ // Turn off the watchdog so it doesn't trip
+ errlHndl_t err_ipmi = IPMIWATCHDOG::setWatchDogTimer(
+ IPMIWATCHDOG::DEFAULT_WATCHDOG_COUNTDOWN,
+ static_cast<uint8_t>
+ (IPMIWATCHDOG::DO_NOT_STOP |
+ IPMIWATCHDOG::BIOS_FRB2),
+ IPMIWATCHDOG::NO_ACTIONS); // do nothing
+ if(err_ipmi)
+ {
+ TRACFCOMP(g_trac_initsvc,
+ "init: ERROR: Failed to disable IPMI "
+ " watchdog");
+ err_ipmi->collectTrace("INITSVC");
+ errlCommit(err_ipmi, INITSVC_COMP_ID );
+ }
+
+ // Flush out the error logs so we can get as much info as
+ // possible
+ ERRORLOG::ErrlManager::callFlushErrorLogs();
+
+ // Stop the IPL
+ stop();
+ }
+#endif
+
if (err)
{
TRACFCOMP(g_trac_initsvc, ERR_MRK"executeAllISteps: "
OpenPOWER on IntegriCloud