diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/usr/errl/errludlogregister.C | 10 | ||||
-rw-r--r-- | src/usr/xscom/piberror.C | 10 | ||||
-rw-r--r-- | src/usr/xscom/xscom.C | 39 |
3 files changed, 36 insertions, 23 deletions
diff --git a/src/usr/errl/errludlogregister.C b/src/usr/errl/errludlogregister.C index a1941c8e4..81f537aa4 100644 --- a/src/usr/errl/errludlogregister.C +++ b/src/usr/errl/errludlogregister.C @@ -52,7 +52,15 @@ void ErrlUserDetailsLogRegister::setStateLogHUID() iv_merge = true; // write the HUID of the target into the error log buffer - uint32_t attrHuid = get_huid(iv_pTarget); + // @todo RTC 108241 - improve workaround for MASTER_..._SENTINEL + uint32_t attrHuid = 0; + if( iv_pTarget == NULL ) { + attrHuid = 0x0; + } else if( iv_pTarget == MASTER_PROCESSOR_CHIP_TARGET_SENTINEL ) { + attrHuid = 0xFFFFFFFF; + } else { + attrHuid = get_huid(iv_pTarget); + } uint8_t *pBuf = reinterpret_cast<uint8_t *> (reallocUsrBuf(sizeof(uint32_t) + sizeof(uint8_t))); memcpy(pBuf, &attrHuid, sizeof(uint32_t)); diff --git a/src/usr/xscom/piberror.C b/src/usr/xscom/piberror.C index e879cdc29..5208604df 100644 --- a/src/usr/xscom/piberror.C +++ b/src/usr/xscom/piberror.C @@ -32,6 +32,7 @@ #include <xscom/piberror.H> #include <errl/errlmanager.H> #include <hwas/common/hwasCallout.H> +#include <targeting/common/targetservice.H> namespace PIB { @@ -87,7 +88,14 @@ void addFruCallouts(TARGETING::Target* i_target, break; case PIB::PIB_CLOCK_ERROR: //b101 - if (i_target->getAttr<TARGETING::ATTR_TYPE>() == + if (i_target == TARGETING::MASTER_PROCESSOR_CHIP_TARGET_SENTINEL) + { + // SENTINEL is a proc so use the OSC path + io_errl->addClockCallout(i_target, + HWAS::OSCREFCLK_TYPE, + HWAS::SRCI_PRIORITY_LOW); + } + else if (i_target->getAttr<TARGETING::ATTR_TYPE>() == TARGETING::TYPE_PROC) { //check for PCI range diff --git a/src/usr/xscom/xscom.C b/src/usr/xscom/xscom.C index 017edcd0f..877f77faf 100644 --- a/src/usr/xscom/xscom.C +++ b/src/usr/xscom/xscom.C @@ -675,6 +675,8 @@ void collectXscomFFDC(TARGETING::Target* i_target, TRACFCOMP(g_trac_xscom,"collectXscomFFDC: XSCOM COLLECT FFDC STARTED"); + ERRORLOG::ErrlUserDetailsLogRegister l_logReg(i_target); + // Loop through the addresses you want to collect. for (int i = 0; i<4; i++) { @@ -699,17 +701,6 @@ void collectXscomFFDC(TARGETING::Target* i_target, io_buflen, l_hmer); - // Always want to collect the Register FFDC. Will append to the - // errorlog passed in by the caller and if the call got an error will - // append to that as well. - - // Collect the data from the read - ERRORLOG::ErrlUserDetailsLogRegister l_logReg(i_target); - - l_logReg.addDataBuffer(&io_buffer, sizeof(io_buffer), - DEVICE_XSCOM_ADDRESS(XscomAddr[i].addr)); - - // If not successful if (l_err) { @@ -720,9 +711,9 @@ void collectXscomFFDC(TARGETING::Target* i_target, // only add the Register data to the originating errorlog if successfull else { - // Add the register FFDC to the errorlog passed in. DO we do this - // all the time? And can we log to more than one errorlog? - l_logReg.addToLog(io_errl); + // Collect the data from the read + l_logReg.addDataBuffer(&io_buffer, sizeof(io_buffer), + DEVICE_XSCOM_ADDRESS(XscomAddr[i].addr)); } // unmap the device now that we are done with the scom to that area. @@ -733,6 +724,9 @@ void collectXscomFFDC(TARGETING::Target* i_target, } + // Add the register FFDC to the errorlog passed in. + l_logReg.addToLog(io_errl); + return; } @@ -792,13 +786,6 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, // If we got a scom error. if (l_err) { - - // Add Callouts to the errorlog - PIB::addFruCallouts(i_target, - l_hmer.mXSComStatus, - l_addr, - l_err); - // Call XscomCollectFFDC.. collectXscomFFDC(i_target, l_virtAddr, @@ -826,6 +813,16 @@ errlHndl_t xscomPerformOp(DeviceFW::OperationType i_opType, // Done, un-pin task_affinity_unpin(); + // FRU callouts use targeting so this must be after the + // mutex is unlocked + // Add Callouts to the errorlog + if( l_err ) + { + PIB::addFruCallouts(i_target, + l_hmer.mXSComStatus, + l_addr, + l_err); + } } while (0); return l_err; |