xref: /onnv-gate/usr/src/cmd/fm/modules/sun4u/cpumem-diagnosis/cmd_dperr.c (revision 4934:2a64bc662ba9)
11186Sayznaga /*
21186Sayznaga  * CDDL HEADER START
31186Sayznaga  *
41186Sayznaga  * The contents of this file are subject to the terms of the
5*4934Stsien  * Common Development and Distribution License (the "License").
6*4934Stsien  * You may not use this file except in compliance with the License.
71186Sayznaga  *
81186Sayznaga  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91186Sayznaga  * or http://www.opensolaris.org/os/licensing.
101186Sayznaga  * See the License for the specific language governing permissions
111186Sayznaga  * and limitations under the License.
121186Sayznaga  *
131186Sayznaga  * When distributing Covered Code, include this CDDL HEADER in each
141186Sayznaga  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151186Sayznaga  * If applicable, add the following below this CDDL HEADER, with the
161186Sayznaga  * fields enclosed by brackets "[]" replaced with your own identifying
171186Sayznaga  * information: Portions Copyright [yyyy] [name of copyright owner]
181186Sayznaga  *
191186Sayznaga  * CDDL HEADER END
201186Sayznaga  */
211186Sayznaga /*
22*4934Stsien  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
231186Sayznaga  * Use is subject to license terms.
241186Sayznaga  */
251186Sayznaga 
261186Sayznaga #pragma ident	"%Z%%M%	%I%	%E% SMI"
271186Sayznaga 
281186Sayznaga /*
291186Sayznaga  * Ereport-handling routines for Datapath errors
301186Sayznaga  * - receive datapath ereports and open datapath case
311186Sayznaga  * - solve datapath case when datapath fault ereports are received
321186Sayznaga  * - maintain state of datapath error flag
331186Sayznaga  * - close datapath case when timeout occurs (w/o fault)
341186Sayznaga  */
351186Sayznaga 
361186Sayznaga 
371186Sayznaga #include <strings.h>
381186Sayznaga #include <string.h>
391186Sayznaga #include <errno.h>
401186Sayznaga #include <fm/fmd_api.h>
411186Sayznaga #include <sys/fm/protocol.h>
421186Sayznaga #include <sys/async.h>
431186Sayznaga #include <sys/time.h>
441186Sayznaga #include <cmd.h>
451186Sayznaga #include <cmd_state.h>
461186Sayznaga #include <cmd_dp.h>
471186Sayznaga #include <cmd_dp_page.h>
481186Sayznaga #include <cmd_page.h>
491186Sayznaga #include <libnvpair.h>
501186Sayznaga #include <sys/plat_datapath.h>
511186Sayznaga 
521186Sayznaga /*
531186Sayznaga  * Member Name     Data Type          Comments
541186Sayznaga  * -----------     ---------          -----------
551186Sayznaga  * version         uint8              0
561186Sayznaga  * class           string             "asic"
571186Sayznaga  * ENA             uint64             ENA Format 1
581186Sayznaga  * detector        fmri               aggregated ID data for SC-DE
591186Sayznaga  *
601186Sayznaga  * Datapath ereport subclasses and data payloads:
611186Sayznaga  * There will be two types of ereports (error and fault) which will be
621186Sayznaga  * identified by the "type" member.
631186Sayznaga  *
641186Sayznaga  * ereport.asic.*.cds.cds-dp
651186Sayznaga  * ereport.asic.*.dx.dx-dp
661186Sayznaga  * ereport.asic.*.sdi.sdi-dp
671186Sayznaga  * ereport.asic.*.cp.cp-dp
681186Sayznaga  * ereport.asic.*.rp.rp-dp		// serengeti doesn't use "cp" term
691186Sayznaga  *
701186Sayznaga  * Member Name     Data Type          Comments
711186Sayznaga  * -----------     ---------          -----------
721186Sayznaga  * erptype         uint16            derived from message type: error or
731186Sayznaga  *                                   fault
741186Sayznaga  * t-value         uint32            SC's datapath SERD timeout threshold
751186Sayznaga  * dp-list-sz      uint8             number of dp-list array elements
761186Sayznaga  * dp-list         array of uint16   Safari IDs of affected cpus
771186Sayznaga  */
781186Sayznaga 
791186Sayznaga static char *dperrtype[] = {
801186Sayznaga 	DP_ERROR_CDS,		/* Starcat types */
811186Sayznaga 	DP_ERROR_DX,
821186Sayznaga 	DP_ERROR_EX,
831186Sayznaga 	DP_ERROR_CP,
841186Sayznaga 	DP_ERROR_CDS,		/* Serengeti types */
851186Sayznaga 	DP_ERROR_DX,
861186Sayznaga 	DP_ERROR_RP
871186Sayznaga };
881186Sayznaga 
891186Sayznaga /*
901186Sayznaga  * Construct the ASRU(s)/FRU(s) associated with a data path fault,
911186Sayznaga  * construct the fault(s), and add the suspect(s) to the case
921186Sayznaga  *
931186Sayznaga  */
941186Sayznaga void
cmd_dp_add_suspects(fmd_hdl_t * hdl,cmd_dp_t * dp)951186Sayznaga cmd_dp_add_suspects(fmd_hdl_t *hdl, cmd_dp_t *dp)
961186Sayznaga {
971186Sayznaga 	const char	*funcname = "cmd_dp_add_suspects()";
981186Sayznaga 	char		class[DP_MAX_CLASS];
991186Sayznaga 	char		frustr[3][DP_MAX_FRU];
1001186Sayznaga 	int		cpuid, numfru, sgpos, xcpos, i, err;
1011186Sayznaga 	nvlist_t	*asru, *fru = NULL, *flt, *hcel;
1021186Sayznaga 
1031186Sayznaga 	/* build ASRU, fault event class */
1041186Sayznaga 	asru = cmd_dp_setasru(hdl, dp);
1051186Sayznaga 	(void) snprintf(class, DP_MAX_CLASS, "fault.asic.%s.%s",
106*4934Stsien 	    dperrtype[dp->dp_err], FM_ERROR_DATAPATH);
1071186Sayznaga 
1081186Sayznaga 	cpuid = dp->dp_cpuid_list[0];
1091186Sayznaga 
1101186Sayznaga 	/* extract fru position */
1111186Sayznaga 	sgpos = ((cpuid & 0x1f) / 4);
1121186Sayznaga 	xcpos = ((cpuid >> 5) & 0x1f);
1131186Sayznaga 
1141186Sayznaga 	/* build FRU(s) for the particular error */
1151186Sayznaga 	numfru = 0;
1161186Sayznaga 	switch (dp->dp_err) {
1171186Sayznaga 	case SC_DP_CDS_TYPE:
1181186Sayznaga 	case SC_DP_DX_TYPE:
1191186Sayznaga 		/* check for slot 1 (maxcat) */
1201186Sayznaga 		if ((cpuid >> 3) & 0x1)
1211186Sayznaga 			(void) snprintf(frustr[0], DP_MAX_FRU, "IO%d", xcpos);
1221186Sayznaga 		else
1231186Sayznaga 			(void) snprintf(frustr[0], DP_MAX_FRU, "SB%d", xcpos);
1241186Sayznaga 
1251186Sayznaga 		numfru = 1;
1261186Sayznaga 		break;
1271186Sayznaga 
1281186Sayznaga 	case SC_DP_EX_TYPE:
1291186Sayznaga 		/* check for slot 1 (maxcat) */
1301186Sayznaga 		if ((cpuid >> 3) & 0x1)
1311186Sayznaga 			(void) snprintf(frustr[0], DP_MAX_FRU, "IO%d", xcpos);
1321186Sayznaga 		else
1331186Sayznaga 			(void) snprintf(frustr[0], DP_MAX_FRU, "SB%d", xcpos);
1341186Sayznaga 
1351186Sayznaga 		(void) snprintf(frustr[1], DP_MAX_FRU, "EX%d", xcpos);
1361186Sayznaga 		numfru = 2;
1371186Sayznaga 		break;
1381186Sayznaga 
1391186Sayznaga 	case SC_DP_CP_TYPE:
1401186Sayznaga 		/* no way to know which CP half, be generic */
1411186Sayznaga 		(void) snprintf(frustr[0], DP_MAX_FRU, "EX%d", xcpos);
1421186Sayznaga 		(void) snprintf(frustr[1], DP_MAX_FRU, "CP");
1431186Sayznaga 		(void) snprintf(frustr[2], DP_MAX_FRU, "CS");
1441186Sayznaga 		numfru = 3;
1451186Sayznaga 		break;
1461186Sayznaga 
1471186Sayznaga 	case SG_DP_CDS_TYPE:
1481186Sayznaga 	case SG_DP_DX_TYPE:
1491186Sayznaga 		(void) snprintf(frustr[0], DP_MAX_FRU, "/N0/SB%d", sgpos);
1501186Sayznaga 		numfru = 1;
1511186Sayznaga 		break;
1521186Sayznaga 
1531186Sayznaga 	case SG_DP_RP_TYPE:
1541186Sayznaga 		/* no way to know which RP, be generic */
1551186Sayznaga 		(void) snprintf(frustr[0], DP_MAX_FRU, "/N0/SB%d", sgpos);
1561186Sayznaga 		(void) snprintf(frustr[1], DP_MAX_FRU, "RP");
1571186Sayznaga 		numfru = 2;
1581186Sayznaga 		break;
1591186Sayznaga 
1601186Sayznaga 	default:
1611186Sayznaga 		fmd_hdl_debug(hdl, "%s: invalid DP error type %d", funcname,
162*4934Stsien 		    dp->dp_err);
1631186Sayznaga 		nvlist_free(asru);
1641186Sayznaga 		return;
1651186Sayznaga 	}
1661186Sayznaga 
1671186Sayznaga 	/* For each FRU, build an FMRI, create fault, add as suspect */
1681186Sayznaga 	for (i = 0; i < numfru; i++) {
1691186Sayznaga 		/* build a FRU FMRI */
1701186Sayznaga 		if (nvlist_alloc(&hcel, NV_UNIQUE_NAME, 0) != 0) {
1711186Sayznaga 			nvlist_free(asru);
1721186Sayznaga 			return;
1731186Sayznaga 		}
1741186Sayznaga 		err = nvlist_add_string(hcel, FM_FMRI_HC_NAME,
175*4934Stsien 		    FM_FMRI_LEGACY_HC);
1761186Sayznaga 		err |= nvlist_add_string(hcel, FM_FMRI_HC_ID, frustr[i]);
1771186Sayznaga 		if (err != 0) {
1781186Sayznaga 			nvlist_free(hcel);
1791186Sayznaga 			nvlist_free(asru);
1801186Sayznaga 			return;
1811186Sayznaga 		}
1821186Sayznaga 
1831186Sayznaga 		/* put it in an HC scheme */
1841186Sayznaga 		if (nvlist_alloc(&fru, NV_UNIQUE_NAME, 0) != 0) {
1851186Sayznaga 			nvlist_free(hcel);
1861186Sayznaga 			nvlist_free(asru);
1871186Sayznaga 			return;
1881186Sayznaga 		}
1891186Sayznaga 		err = nvlist_add_uint8(fru, FM_VERSION, FM_HC_SCHEME_VERSION);
1901186Sayznaga 		err |= nvlist_add_string(fru, FM_FMRI_SCHEME,
191*4934Stsien 		    FM_FMRI_SCHEME_HC);
1921186Sayznaga 		err |= nvlist_add_string(fru, FM_FMRI_HC_ROOT, "");
1931186Sayznaga 		err |= nvlist_add_uint32(fru, FM_FMRI_HC_LIST_SZ, 1);
1941186Sayznaga 		err |= nvlist_add_nvlist_array(fru, FM_FMRI_HC_LIST, &hcel, 1);
1951186Sayznaga 		if (err != 0) {
1961186Sayznaga 			nvlist_free(fru);
1971186Sayznaga 			nvlist_free(hcel);
1981186Sayznaga 			nvlist_free(asru);
1991186Sayznaga 			return;
2001186Sayznaga 		}
2011186Sayznaga 
2021186Sayznaga 		/* create the fault, add to case. */
203*4934Stsien 		flt = cmd_nvl_create_fault(hdl, class, 100/numfru,
204*4934Stsien 		    asru, fru, NULL);
2051186Sayznaga 		fmd_case_add_suspect(hdl, dp->dp_case, flt);
2061186Sayznaga 
2071186Sayznaga 		/* free up memory */
2081186Sayznaga 		nvlist_free(fru);
2091186Sayznaga 		nvlist_free(hcel);
2101186Sayznaga 	}
2111186Sayznaga 
2121186Sayznaga 	/* free up ASRU */
2131186Sayznaga 	nvlist_free(asru);
2141186Sayznaga }
2151186Sayznaga 
2161186Sayznaga /*ARGSUSED*/
2171186Sayznaga cmd_evdisp_t
cmd_dp_common(fmd_hdl_t * hdl,fmd_event_t * ep,nvlist_t * nvl,const char * class,cmd_errcl_t clcode,uint8_t dperr)2181186Sayznaga cmd_dp_common(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
2191186Sayznaga 	cmd_errcl_t clcode, uint8_t dperr)
2201186Sayznaga {
2211186Sayznaga 	const char	*funcname = "cmd_dp_common()";
2221186Sayznaga 	const char	*uuidp;
2231186Sayznaga 	cmd_dp_t	*dpt, *ept;
2241186Sayznaga 	int 		err, i, fltflg;
2251186Sayznaga 	uint16_t	*cpuid_list;
2261186Sayznaga 	uint64_t	*serid_list;
2271186Sayznaga 	uint32_t	ncpuids;
2281186Sayznaga 
2291186Sayznaga 	/* extract common ereport contents */
2301186Sayznaga 	dpt = fmd_hdl_zalloc(hdl, sizeof (cmd_dp_t), FMD_SLEEP);
2311186Sayznaga 	dpt->dp_nodetype = CMD_NT_DP;
2321186Sayznaga 	dpt->dp_version = CMD_DP_VERSION;
2331186Sayznaga 	dpt->dp_err = dperr;
2341186Sayznaga 	err = nvlist_lookup_pairs(nvl, 0,
235*4934Stsien 	    DP_EREPORT_TYPE, DATA_TYPE_UINT16, &dpt->dp_erpt_type,
236*4934Stsien 	    DP_TVALUE, DATA_TYPE_UINT32, &dpt->dp_t_value,
237*4934Stsien 	    DP_LIST_SIZE, DATA_TYPE_UINT32, &ncpuids, NULL);
2381186Sayznaga 	if (err != 0) {
2391186Sayznaga 		fmd_hdl_debug(hdl, "%s: unable to verify ereport contents "
240*4934Stsien 		    "(erptype, ena, t_value, dp_list_sz)", funcname);
2411186Sayznaga 		fmd_hdl_free(hdl, dpt, sizeof (cmd_dp_t));
2421186Sayznaga 		return (CMD_EVD_UNUSED);
2431186Sayznaga 	}
2441186Sayznaga 
2451186Sayznaga 	/* extract cpuid list from ereport */
2461186Sayznaga 	err = nvlist_lookup_uint16_array(nvl, DP_LIST, &cpuid_list,
247*4934Stsien 	    &ncpuids);
2481186Sayznaga 	err |= nvlist_lookup_uint64_array(nvl, SN_LIST, &serid_list,
249*4934Stsien 	    &ncpuids);
2501186Sayznaga 	if (err != 0) {
2511186Sayznaga 		fmd_hdl_debug(hdl, "%s: unable to verify ereport contents "
252*4934Stsien 		    "(dp_list, sn_list)", funcname);
2531186Sayznaga 		fmd_hdl_free(hdl, dpt, sizeof (cmd_dp_t));
2541186Sayznaga 		return (CMD_EVD_UNUSED);
2551186Sayznaga 	}
2561186Sayznaga 
2571186Sayznaga 	for (i = 0; i < ncpuids; i++) {
2581186Sayznaga 		dpt->dp_cpuid_list[i] = cpuid_list[i];
2591186Sayznaga 		dpt->dp_serid_list[i] = serid_list[i];
2601186Sayznaga 	}
2611186Sayznaga 
2621186Sayznaga 	dpt->dp_ncpus = ncpuids;
2631186Sayznaga 
2641186Sayznaga 	switch (dpt->dp_erpt_type) {
2651186Sayznaga 
2661186Sayznaga 	case DP_ERROR:
2671186Sayznaga 
2681186Sayznaga 		/*
2691186Sayznaga 		 * Scan existing faults on cmd.cmd_datapaths. If each
2701186Sayznaga 		 * cpuid in the current datapath event already has an
2711186Sayznaga 		 * associated DP fault, this is an uninteresting event.
2721186Sayznaga 		 */
2731186Sayznaga 		fltflg = 0;
2741186Sayznaga 		for (i = 0; i < ncpuids; i++)
2751186Sayznaga 			if (cmd_dp_lookup_fault(hdl, cpuid_list[i]) != NULL)
2761186Sayznaga 				fltflg++;
2771186Sayznaga 		if (fltflg == ncpuids) {
2781186Sayznaga 			fmd_hdl_debug(hdl, "%s: datapath fault(s) already "
279*4934Stsien 			    "experienced, event uninteresting\n", funcname);
2801186Sayznaga 			fmd_hdl_free(hdl, dpt, sizeof (cmd_dp_t));
2811186Sayznaga 			return (CMD_EVD_UNUSED);
2821186Sayznaga 		}
2831186Sayznaga 
2841186Sayznaga 		/*
2851186Sayznaga 		 * Check for an existing datapath error, and if found
2861186Sayznaga 		 * add this event to the existing case
2871186Sayznaga 		 */
2881186Sayznaga 		ept = cmd_dp_lookup_error(dpt);
2891186Sayznaga 		if (ept != NULL && !fmd_case_closed(hdl, ept->dp_case)) {
2901186Sayznaga 			fmd_hdl_debug(hdl, "%s: found existing datapath error, "
291*4934Stsien 			    "adding event to case\n", funcname);
2921186Sayznaga 			fmd_case_add_ereport(hdl, ept->dp_case, ep);
2931186Sayznaga 			/* check for t-value change */
2941186Sayznaga 			if (dpt->dp_t_value != ept->dp_t_value) {
2951186Sayznaga 				fmd_event_t *ep;
2961186Sayznaga 
2971186Sayznaga 				fmd_timer_remove(hdl, ept->dp_id);
2981186Sayznaga 				ep = fmd_case_getprincipal(hdl, ept->dp_case);
2991186Sayznaga 				ept->dp_id = fmd_timer_install(hdl,
300*4934Stsien 				    (void *)CMD_TIMERTYPE_DP, ep,
301*4934Stsien 				    (hrtime_t)NANOSEC *
302*4934Stsien 				    (dpt->dp_t_value + 120));
3031186Sayznaga 			}
3041186Sayznaga 			fmd_hdl_free(hdl, dpt, sizeof (cmd_dp_t));
3051186Sayznaga 			return (CMD_EVD_OK);
3061186Sayznaga 		}
3071186Sayznaga 
3081186Sayznaga 		/*
3091186Sayznaga 		 * Didn't find an existing datapath error. Create a new
3101186Sayznaga 		 * case, add the event. Also, stash the datapath event on the
3111186Sayznaga 		 * cmd.cmd_datapaths list
3121186Sayznaga 		 */
3131186Sayznaga 		fmd_hdl_debug(hdl, "%s: new datapath error, create case and "
314*4934Stsien 		    "add to cmd.cmd_datapaths\n", funcname);
3151186Sayznaga 		++cmd.cmd_dp_flag;
3161186Sayznaga 
3171186Sayznaga 		cmd_bufname(dpt->dp_bufname, sizeof (dpt->dp_bufname),
3181186Sayznaga 		    "dp_err_%d_%s", dpt->dp_cpuid_list[0],
3191186Sayznaga 		    dperrtype[dpt->dp_err]);
3201186Sayznaga 
3211186Sayznaga 		dp_buf_write(hdl, dpt);
3221186Sayznaga 
3231186Sayznaga 		dpt->dp_case = cmd_case_create(hdl, &dpt->dp_header,
324*4934Stsien 		    CMD_PTR_DP_CASE, &uuidp);
3251186Sayznaga 		fmd_case_setprincipal(hdl, dpt->dp_case, ep);
3261186Sayznaga 		dpt->dp_id = fmd_timer_install(hdl, (void *)CMD_TIMERTYPE_DP,
3271186Sayznaga 		    ep, (hrtime_t)NANOSEC * (dpt->dp_t_value + 120));
3281186Sayznaga 		cmd_list_append(&cmd.cmd_datapaths, dpt);
3291186Sayznaga 		break;
3301186Sayznaga 
3311186Sayznaga 	case DP_FAULT:
3321186Sayznaga 		++cmd.cmd_dp_flag;
3331186Sayznaga 		dpt->dp_erpt_type = DP_FAULT;
3341186Sayznaga 		dpt->dp_id = 0;
3351186Sayznaga 
3361186Sayznaga 		cmd_bufname(dpt->dp_bufname, sizeof (dpt->dp_bufname),
3371186Sayznaga 		    "dp_flt_%d_%s", dpt->dp_cpuid_list[0],
3381186Sayznaga 		    dperrtype[dpt->dp_err]);
3391186Sayznaga 
3401186Sayznaga 		dp_buf_write(hdl, dpt);
3411186Sayznaga 
3421186Sayznaga 		/*
3431186Sayznaga 		 * Check for an existing DP_ERROR on cmd.cmd_datapaths, and
3441186Sayznaga 		 * if found, remove the DP_ERROR and close the case before
3451186Sayznaga 		 * creating the DP_FAULT case.
3461186Sayznaga 		 */
3471186Sayznaga 		ept = cmd_dp_lookup_error(dpt);
3481186Sayznaga 		if (ept != NULL && !fmd_case_closed(hdl, ept->dp_case)) {
3491186Sayznaga 			fmd_hdl_debug(hdl, "%s: existing datapath error "
3501186Sayznaga 			    "overtaken by datapath fault\n", funcname);
3511186Sayznaga 			fmd_timer_remove(hdl, ept->dp_id);
3521186Sayznaga 			cmd_dp_destroy(hdl, ept);
3531186Sayznaga 		}
3541186Sayznaga 
3551186Sayznaga 		dpt->dp_case = cmd_case_create(hdl, &dpt->dp_header,
3561186Sayznaga 		    CMD_PTR_DP_CASE, &uuidp);
3571186Sayznaga 		fmd_case_setprincipal(hdl, dpt->dp_case, ep);
3581186Sayznaga 
3591186Sayznaga 		/* Add suspect(s) and solve the case. */
3601186Sayznaga 		cmd_dp_add_suspects(hdl, dpt);
3611186Sayznaga 		fmd_case_solve(hdl, dpt->dp_case);
3621186Sayznaga 
3631186Sayznaga 		/* add it to cmd.cmd_datapaths */
3641186Sayznaga 		cmd_list_append(&cmd.cmd_datapaths, dpt);
3651186Sayznaga 
3661186Sayznaga 		--cmd.cmd_dp_flag;
3671186Sayznaga 		if (cmd.cmd_dp_flag == 0)
3681186Sayznaga 			cmd_dp_page_replay(hdl);
3691186Sayznaga 
3701186Sayznaga 		break;
3711186Sayznaga 
3721186Sayznaga 	default:
3731186Sayznaga 		fmd_hdl_debug(hdl, "%s: unknown ereport type", funcname);
3741186Sayznaga 		fmd_hdl_free(hdl, dpt, sizeof (cmd_dp_t));
3751186Sayznaga 		return (CMD_EVD_UNUSED);
3761186Sayznaga 	}
3771186Sayznaga 
3781186Sayznaga 	return (CMD_EVD_OK);
3791186Sayznaga }
3801186Sayznaga 
3811186Sayznaga cmd_evdisp_t
cmd_dp_cds(fmd_hdl_t * hdl,fmd_event_t * ep,nvlist_t * nvl,const char * class,cmd_errcl_t clcode)3821186Sayznaga cmd_dp_cds(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
3831186Sayznaga     cmd_errcl_t clcode)
3841186Sayznaga {
3851186Sayznaga 	if (fmd_nvl_class_match(hdl, nvl, "ereport.asic.starcat.*")) {
3861186Sayznaga 		return (cmd_dp_common(hdl, ep, nvl, class, clcode,
387*4934Stsien 		    SC_DP_CDS_TYPE));
3881186Sayznaga 	} else
3891186Sayznaga 		return (cmd_dp_common(hdl, ep, nvl, class, clcode,
390*4934Stsien 		    SG_DP_CDS_TYPE));
3911186Sayznaga }
3921186Sayznaga 
3931186Sayznaga cmd_evdisp_t
cmd_dp_dx(fmd_hdl_t * hdl,fmd_event_t * ep,nvlist_t * nvl,const char * class,cmd_errcl_t clcode)3941186Sayznaga cmd_dp_dx(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
3951186Sayznaga     cmd_errcl_t clcode)
3961186Sayznaga {
3971186Sayznaga 	if (fmd_nvl_class_match(hdl, nvl, "ereport.asic.starcat.*")) {
3981186Sayznaga 		return (cmd_dp_common(hdl, ep, nvl, class, clcode,
399*4934Stsien 		    SC_DP_DX_TYPE));
4001186Sayznaga 
4011186Sayznaga 	} else
4021186Sayznaga 		return (cmd_dp_common(hdl, ep, nvl, class, clcode,
403*4934Stsien 		    SG_DP_DX_TYPE));
4041186Sayznaga }
4051186Sayznaga 
4061186Sayznaga cmd_evdisp_t
cmd_dp_ex(fmd_hdl_t * hdl,fmd_event_t * ep,nvlist_t * nvl,const char * class,cmd_errcl_t clcode)4071186Sayznaga cmd_dp_ex(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
4081186Sayznaga     cmd_errcl_t clcode)
4091186Sayznaga {
4101186Sayznaga 	return (cmd_dp_common(hdl, ep, nvl, class, clcode,
411*4934Stsien 	    SC_DP_EX_TYPE));
4121186Sayznaga }
4131186Sayznaga 
4141186Sayznaga cmd_evdisp_t
cmd_dp_cp(fmd_hdl_t * hdl,fmd_event_t * ep,nvlist_t * nvl,const char * class,cmd_errcl_t clcode)4151186Sayznaga cmd_dp_cp(fmd_hdl_t *hdl, fmd_event_t *ep, nvlist_t *nvl, const char *class,
4161186Sayznaga     cmd_errcl_t clcode)
4171186Sayznaga {
4181186Sayznaga 	if (fmd_nvl_class_match(hdl, nvl, "ereport.asic.starcat.*")) {
4191186Sayznaga 		return (cmd_dp_common(hdl, ep, nvl, class, clcode,
420*4934Stsien 		    SC_DP_CP_TYPE));
4211186Sayznaga 	} else
4221186Sayznaga 		return (cmd_dp_common(hdl, ep, nvl, class, clcode,
423*4934Stsien 		    SG_DP_RP_TYPE));
4241186Sayznaga }
425