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