summaryrefslogtreecommitdiffstats
path: root/src/occ_405/cmdh/cmdh_fsp_cmds.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/occ_405/cmdh/cmdh_fsp_cmds.c')
-rwxr-xr-xsrc/occ_405/cmdh/cmdh_fsp_cmds.c83
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;
}
OpenPOWER on IntegriCloud