From ddefd501a212999266bbf7f1de603bd7a894ce3b Mon Sep 17 00:00:00 2001 From: spashabk-in Date: Tue, 26 Jun 2018 04:31:51 -0500 Subject: Suspend async task on quiesce SBE Change-Id: Icfe25bdd137c1f30a8a1c210fa6d935612d61e68 Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/61358 Tested-by: Jenkins Server Tested-by: FSP CI Jenkins Reviewed-by: Sachin Gupta (cherry picked from commit 98d57c57fdd8ca52b4f7a71345ba5d4322a3aff9) Reviewed-on: http://ralgit01.raleigh.ibm.com/gerrit1/62204 --- src/sbefw/app/common/sbecmdgeneric.C | 49 ++++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 19 deletions(-) (limited to 'src/sbefw') diff --git a/src/sbefw/app/common/sbecmdgeneric.C b/src/sbefw/app/common/sbecmdgeneric.C index cebd4015..1e14a2d9 100644 --- a/src/sbefw/app/common/sbecmdgeneric.C +++ b/src/sbefw/app/common/sbecmdgeneric.C @@ -434,21 +434,26 @@ uint32_t sbeFifoQuiesce( uint8_t *i_pArg ) rc = sbeUpFifoDeq_mult (len, NULL); CHECK_SBE_RC_AND_BREAK_IF_NOT_SUCCESS(rc); + // Suspend async task + int pkRc = pk_thread_suspend(&SBE_GLOBAL->sbeAsyncCommandProcessor_thread); + if (pkRc != PK_OK) + { + SBE_ERROR(SBE_FUNC "async thread suspend failed"); + respHdr.setStatus( SBE_PRI_GENERIC_EXECUTION_FAILURE, + SBE_SEC_OS_FAILURE); + break; + } + // Set Quiesce State (void)SbeRegAccess::theSbeRegAccess().stateTransition( SBE_QUIESCE_EVENT); - rc = sbeDsSendRespHdr(respHdr); - if(rc != SBE_SEC_OPERATION_SUCCESSFUL) - { - SBE_ERROR(SBE_FUNC "sbeDsSendRespHdr failed"); - // Not Breaking here since we can't revert back on the set state - } }while(0); - if( rc ) + rc = sbeDsSendRespHdr(respHdr); + if(rc != SBE_SEC_OPERATION_SUCCESSFUL) { - SBE_ERROR( SBE_FUNC"Failed. rc[0x%X]", rc); + SBE_ERROR( SBE_FUNC"sbeDsSendRespHdr failed. rc[0x%X]", rc); } return rc; #undef SBE_FUNC @@ -473,24 +478,30 @@ uint32_t sbePsuQuiesce( uint8_t *i_pArg ) break; } + // Suspend async task + int pkRc = pk_thread_suspend(&SBE_GLOBAL->sbeAsyncCommandProcessor_thread); + if (pkRc == PK_OK) + { + SBE_ERROR(SBE_FUNC "async thread suspend failed"); + SBE_GLOBAL->sbeSbe2PsuRespHdr.setStatus( + SBE_PRI_GENERIC_EXECUTION_FAILURE, + SBE_SEC_OS_FAILURE); + break; + } + // Set Quiesce State (void)SbeRegAccess::theSbeRegAccess().stateTransition( SBE_QUIESCE_EVENT); - rc = sbeWriteSbe2PsuMbxReg(SBE_HOST_PSU_MBOX_REG4, - (uint64_t*)(&SBE_GLOBAL->sbeSbe2PsuRespHdr), - (sizeof(SBE_GLOBAL->sbeSbe2PsuRespHdr)/sizeof(uint64_t)), - true); - if(rc != SBE_SEC_OPERATION_SUCCESSFUL) - { - SBE_ERROR(SBE_FUNC" Failed to write SBE_HOST_PSU_MBOX_REG4"); - // Not Breaking here since we can't revert back on the set state - } }while(0); - if( rc ) + rc = sbeWriteSbe2PsuMbxReg(SBE_HOST_PSU_MBOX_REG4, + (uint64_t*)(&SBE_GLOBAL->sbeSbe2PsuRespHdr), + (sizeof(SBE_GLOBAL->sbeSbe2PsuRespHdr)/sizeof(uint64_t)), + true); + if(rc != SBE_SEC_OPERATION_SUCCESSFUL) { - SBE_ERROR( SBE_FUNC"Failed. rc[0x%X]", rc); + SBE_ERROR( SBE_FUNC"Failed to write SBE_HOST_PSU_MBOX_REG4. rc[0x%X]", rc); } return rc; #undef SBE_FUNC -- cgit v1.2.1