diff options
Diffstat (limited to 'src/occ_405/cmdh/cmdh_fsp_cmds.c')
-rwxr-xr-x | src/occ_405/cmdh/cmdh_fsp_cmds.c | 83 |
1 files changed, 69 insertions, 14 deletions
diff --git a/src/occ_405/cmdh/cmdh_fsp_cmds.c b/src/occ_405/cmdh/cmdh_fsp_cmds.c index d98beae..938af04 100755 --- a/src/occ_405/cmdh/cmdh_fsp_cmds.c +++ b/src/occ_405/cmdh/cmdh_fsp_cmds.c @@ -978,27 +978,82 @@ errlHndl_t cmdh_clear_elog (const cmdh_fsp_cmd_t * i_cmd_ptr, cmdh_fsp_rsp_t * o_rsp_ptr) { cmdh_clear_elog_query_t *l_cmd_ptr = (cmdh_clear_elog_query_t *) i_cmd_ptr; + cmdh_clear_elog_version_t *l_cmd_version_ptr = (cmdh_clear_elog_version_t *) i_cmd_ptr; + ERRL_RC l_rc = ERRL_RC_SUCCESS; + uint16_t l_data_length = CMDH_DATALEN_FIELD_UINT16(l_cmd_ptr); + uint8_t l_elog_id = 0; + uint8_t l_elog_source = ERRL_SOURCE_INVALID; + int l_SlotNum = ERRL_INVALID_SLOT; - errlHndl_t l_err = INVALID_ERR_HNDL; + errlHndl_t l_err = NULL; errlHndl_t l_oci_address = INVALID_ERR_HNDL; o_rsp_ptr->data_length[0] = 0; o_rsp_ptr->data_length[1] = 0; - - // Get Errl Array index - l_SlotNum = getErrSlotNumByErrId(l_cmd_ptr->elog_id); - - // Get ERRL address - l_oci_address = (errlHndl_t)getErrSlotOCIAddr(l_SlotNum); - - if ((l_oci_address != NULL) && - (l_oci_address != INVALID_ERR_HNDL)) + do { - // clear only one Errl by ID - l_err = deleteErrl(&l_oci_address); - } + // must support old and new version 1 until (H)TMGT removes support for old version + // old version didn't have a version number, use data length to determine version + if(l_data_length == CLEAR_ELOG_V0_CMD_LEN) + { + l_elog_id = l_cmd_ptr->elog_id; + // version 0 only supported elogs from the 405 + l_elog_source = ERRL_SOURCE_405; + } + else if( (l_data_length == CLEAR_ELOG_V1_CMD_LEN) && + (l_cmd_version_ptr->version == 1) ) + { + l_elog_id = l_cmd_version_ptr->elog_id; + l_elog_source = l_cmd_version_ptr->elog_source; + } + + else + { + CMDH_TRAC_ERR("cmdh_clear_elog: Invalid version 0x%02X or data length 0x%02X", + l_cmd_version_ptr->version, l_data_length); + l_rc = ERRL_RC_INVALID_DATA; + break; + } + + // process the clear command based on elog source + switch(l_elog_source) + { + case ERRL_SOURCE_405: + // Get Errl Array index + l_SlotNum = getErrSlotNumByErrId(l_elog_id); + + // Get ERRL address + l_oci_address = (errlHndl_t)getErrSlotOCIAddr(l_SlotNum); + + if ((l_oci_address != NULL) && + (l_oci_address != INVALID_ERR_HNDL)) + { + // clear only one Errl by ID + l_err = deleteErrl(&l_oci_address); + } + else + { + CMDH_TRAC_ERR("cmdh_clear_elog: 405 error log ID[0x%02X] not found", l_elog_id); + l_rc = ERRL_RC_INVALID_DATA; + } + + break; + + case ERRL_SOURCE_PGPE: + case ERRL_SOURCE_XGPE: + // TBD + CMDH_TRAC_INFO("cmdh_clear_elog: Cleared PM Hcode elog id 0x%02X from source 0x%02X", + l_elog_id, l_elog_source); + break; + + default: + CMDH_TRAC_ERR("cmdh_clear_elog: Invalid error log source 0x%02X", l_elog_source); + l_rc = ERRL_RC_INVALID_DATA; + break; + } + }while(0); - if (l_err == NULL) + if ( (l_err == NULL) && (l_rc == ERRL_RC_SUCCESS) ) { G_rsp_status = ERRL_RC_SUCCESS; } |