cmd_dperr.c revision 19d61fc7991644175873937566d932d8cf52912a
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#pragma ident "%Z%%M% %I% %E% SMI"
/*
* Ereport-handling routines for Datapath errors
* - receive datapath ereports and open datapath case
* - solve datapath case when datapath fault ereports are received
* - maintain state of datapath error flag
* - close datapath case when timeout occurs (w/o fault)
*/
#include <strings.h>
#include <string.h>
#include <errno.h>
#include <cmd.h>
#include <cmd_state.h>
#include <cmd_dp.h>
#include <cmd_dp_page.h>
#include <cmd_page.h>
#include <libnvpair.h>
#include <sys/plat_datapath.h>
/*
* Member Name Data Type Comments
* ----------- --------- -----------
* version uint8 0
* class string "asic"
* ENA uint64 ENA Format 1
* detector fmri aggregated ID data for SC-DE
*
* Datapath ereport subclasses and data payloads:
* There will be two types of ereports (error and fault) which will be
* identified by the "type" member.
*
* ereport.asic.*.cds.cds-dp
* ereport.asic.*.dx.dx-dp
* ereport.asic.*.sdi.sdi-dp
* ereport.asic.*.cp.cp-dp
* ereport.asic.*.rp.rp-dp // serengeti doesn't use "cp" term
*
* Member Name Data Type Comments
* ----------- --------- -----------
* erptype uint16 derived from message type: error or
* fault
* t-value uint32 SC's datapath SERD timeout threshold
* dp-list-sz uint8 number of dp-list array elements
* dp-list array of uint16 Safari IDs of affected cpus
*/
static char *dperrtype[] = {
DP_ERROR_CDS, /* Starcat types */
DP_ERROR_CDS, /* Serengeti types */
};
/*
* Construct the ASRU(s)/FRU(s) associated with a data path fault,
* construct the fault(s), and add the suspect(s) to the case
*
*/
void
{
const char *funcname = "cmd_dp_add_suspects()";
char class[DP_MAX_CLASS];
/* build ASRU, fault event class */
/* extract fru position */
/* build FRU(s) for the particular error */
numfru = 0;
case SC_DP_CDS_TYPE:
case SC_DP_DX_TYPE:
/* check for slot 1 (maxcat) */
else
numfru = 1;
break;
case SC_DP_EX_TYPE:
/* check for slot 1 (maxcat) */
else
numfru = 2;
break;
case SC_DP_CP_TYPE:
/* no way to know which CP half, be generic */
numfru = 3;
break;
case SG_DP_CDS_TYPE:
case SG_DP_DX_TYPE:
numfru = 1;
break;
case SG_DP_RP_TYPE:
/* no way to know which RP, be generic */
numfru = 2;
break;
default:
return;
}
/* For each FRU, build an FMRI, create fault, add as suspect */
for (i = 0; i < numfru; i++) {
/* build a FRU FMRI */
return;
}
if (err != 0) {
return;
}
/* put it in an HC scheme */
return;
}
if (err != 0) {
return;
}
/* create the fault, add to case. */
/* free up memory */
}
/* free up ASRU */
}
/*ARGSUSED*/
{
const char *funcname = "cmd_dp_common()";
const char *uuidp;
/* extract common ereport contents */
if (err != 0) {
"(erptype, ena, t_value, dp_list_sz)", funcname);
return (CMD_EVD_UNUSED);
}
/* extract cpuid list from ereport */
&ncpuids);
&ncpuids);
if (err != 0) {
"(dp_list, sn_list)", funcname);
return (CMD_EVD_UNUSED);
}
for (i = 0; i < ncpuids; i++) {
}
switch (dpt->dp_erpt_type) {
case DP_ERROR:
/*
* Scan existing faults on cmd.cmd_datapaths. If each
* cpuid in the current datapath event already has an
* associated DP fault, this is an uninteresting event.
*/
fltflg = 0;
for (i = 0; i < ncpuids; i++)
fltflg++;
"experienced, event uninteresting\n", funcname);
return (CMD_EVD_UNUSED);
}
/*
* Check for an existing datapath error, and if found
* add this event to the existing case
*/
"adding event to case\n", funcname);
/* check for t-value change */
(void *)CMD_TIMERTYPE_DP, ep,
}
return (CMD_EVD_OK);
}
/*
* Didn't find an existing datapath error. Create a new
* case, add the event. Also, stash the datapath event on the
* cmd.cmd_datapaths list
*/
++cmd.cmd_dp_flag;
CMD_PTR_DP_CASE, &uuidp);
break;
case DP_FAULT:
++cmd.cmd_dp_flag;
/*
* Check for an existing DP_ERROR on cmd.cmd_datapaths, and
* if found, remove the DP_ERROR and close the case before
* creating the DP_FAULT case.
*/
"overtaken by datapath fault\n", funcname);
}
CMD_PTR_DP_CASE, &uuidp);
/* Add suspect(s) and solve the case. */
/* add it to cmd.cmd_datapaths */
--cmd.cmd_dp_flag;
if (cmd.cmd_dp_flag == 0)
break;
default:
return (CMD_EVD_UNUSED);
}
return (CMD_EVD_OK);
}
{
} else
}
{
} else
}
{
}
{
} else
}