xref: /titanic_52/usr/src/uts/common/io/nxge/nxge_fm.c (revision 837c1ac4e72b7d86278cca88b1075af557f7d161)
16f45ec7bSml29623 /*
26f45ec7bSml29623  * CDDL HEADER START
36f45ec7bSml29623  *
46f45ec7bSml29623  * The contents of this file are subject to the terms of the
56f45ec7bSml29623  * Common Development and Distribution License (the "License").
66f45ec7bSml29623  * You may not use this file except in compliance with the License.
76f45ec7bSml29623  *
86f45ec7bSml29623  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
96f45ec7bSml29623  * or http://www.opensolaris.org/os/licensing.
106f45ec7bSml29623  * See the License for the specific language governing permissions
116f45ec7bSml29623  * and limitations under the License.
126f45ec7bSml29623  *
136f45ec7bSml29623  * When distributing Covered Code, include this CDDL HEADER in each
146f45ec7bSml29623  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
156f45ec7bSml29623  * If applicable, add the following below this CDDL HEADER, with the
166f45ec7bSml29623  * fields enclosed by brackets "[]" replaced with your own identifying
176f45ec7bSml29623  * information: Portions Copyright [yyyy] [name of copyright owner]
186f45ec7bSml29623  *
196f45ec7bSml29623  * CDDL HEADER END
206f45ec7bSml29623  */
216f45ec7bSml29623 /*
22*837c1ac4SStephen Hanson  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
236f45ec7bSml29623  * Use is subject to license terms.
246f45ec7bSml29623  */
256f45ec7bSml29623 
266f45ec7bSml29623 #include <sys/nxge/nxge_impl.h>
27678453a8Sspeer #include <sys/nxge/nxge_hio.h>
286f45ec7bSml29623 #include <sys/ddifm.h>
296f45ec7bSml29623 #include <sys/fm/protocol.h>
306f45ec7bSml29623 #include <sys/fm/util.h>
316f45ec7bSml29623 #include <sys/fm/io/ddi.h>
326f45ec7bSml29623 
336f45ec7bSml29623 static nxge_fm_ereport_attr_t
346f45ec7bSml29623 *nxge_fm_get_ereport_attr(nxge_fm_ereport_id_t);
356f45ec7bSml29623 
36ee5416c9Syc148097 static int
37ee5416c9Syc148097 nxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data);
38ee5416c9Syc148097 
396f45ec7bSml29623 nxge_fm_ereport_attr_t	nxge_fm_ereport_pcs[] = {
406f45ec7bSml29623 	{NXGE_FM_EREPORT_XPCS_LINK_DOWN,	"10g_link_down",
416f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
426f45ec7bSml29623 						DDI_SERVICE_LOST},
436f45ec7bSml29623 	{NXGE_FM_EREPORT_XPCS_TX_LINK_FAULT,	"10g_tx_link_fault",
446f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
456f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
466f45ec7bSml29623 	{NXGE_FM_EREPORT_XPCS_RX_LINK_FAULT,	"10g_rx_link_fault",
476f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
486f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
496f45ec7bSml29623 	{NXGE_FM_EREPORT_PCS_LINK_DOWN,		"1g_link_down",
506f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
516f45ec7bSml29623 						DDI_SERVICE_LOST},
526f45ec7bSml29623 	{NXGE_FM_EREPORT_PCS_REMOTE_FAULT,	"1g_remote_fault",
536f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
546f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
556f45ec7bSml29623 };
566f45ec7bSml29623 
576f45ec7bSml29623 nxge_fm_ereport_attr_t	nxge_fm_ereport_mif[] = {
586f45ec7bSml29623 	{NXGE_FM_EREPORT_MIF_ACCESS_FAIL,	"transceiver_access_fail"}
596f45ec7bSml29623 };
606f45ec7bSml29623 
616f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_fflp[] = {
626f45ec7bSml29623 	{NXGE_FM_EREPORT_FFLP_TCAM_ERR,		"classifier_tcam_err",
636f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
646f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
656f45ec7bSml29623 	{NXGE_FM_EREPORT_FFLP_VLAN_PAR_ERR,	"classifier_vlan_par_err",
666f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
676f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
686f45ec7bSml29623 	{NXGE_FM_EREPORT_FFLP_HASHT_DATA_ERR,	"classifier_hasht_data_err",
696f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
706f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
716f45ec7bSml29623 	{NXGE_FM_EREPORT_FFLP_HASHT_LOOKUP_ERR,	"classifier_hasht_lookup_err",
726f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
736f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
746f45ec7bSml29623 	{NXGE_FM_EREPORT_FFLP_ACCESS_FAIL,	"classifier_access_fail",
756f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
766f45ec7bSml29623 						DDI_SERVICE_DEGRADED}
776f45ec7bSml29623 };
786f45ec7bSml29623 
796f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_ipp[] = {
806f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_EOP_MISS,		"rx_eop_miss",
816f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
826f45ec7bSml29623 						DDI_SERVICE_LOST},
836f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_SOP_MISS,		"rx_sop_miss",
846f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
856f45ec7bSml29623 						DDI_SERVICE_LOST},
866f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_DFIFO_UE,		"rx_dfifo_ucorr_err",
876f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
886f45ec7bSml29623 						DDI_SERVICE_LOST},
896f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_DFIFO_CE,		"rx_dfifo_corr_err",
906f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_CORR,
916f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
926f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_PFIFO_PERR,	"rx_dfifo_parity_err",
936f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
946f45ec7bSml29623 						DDI_SERVICE_LOST},
956f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_ECC_ERR_MAX,	"rx_ecc_err_max",
966f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
976f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
986f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_PFIFO_OVER,	"rx_pfifo_overflow",
996f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1006f45ec7bSml29623 						DDI_SERVICE_LOST},
1016f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_PFIFO_UND,		"rx_pfifo_underrun",
1026f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1036f45ec7bSml29623 						DDI_SERVICE_LOST},
1046f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_BAD_CS_MX,		"rx_bad_cksum_max",
1056f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1066f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1076f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_PKT_DIS_MX,	"rx_pkt_discard_max",
1086f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1096f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1106f45ec7bSml29623 	{NXGE_FM_EREPORT_IPP_RESET_FAIL,	"rx_reset_fail",
1116f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
1126f45ec7bSml29623 						DDI_SERVICE_LOST}
1136f45ec7bSml29623 };
1146f45ec7bSml29623 
1156f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_rdmc[] = {
1166f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_DCF_ERR,		"rxdma_dcf_err",
1176f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1186f45ec7bSml29623 						DDI_SERVICE_LOST},
1196f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RCR_ACK_ERR,	"rxdma_rcr_ack_err",
1206f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1216f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1226f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_DC_FIFO_ERR,	"rxdma_dc_fifo_err",
1236f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1246f45ec7bSml29623 						DDI_SERVICE_LOST},
1256f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RCR_SHA_PAR,	"rxdma_rcr_sha_par_err",
1266f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1276f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1286f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR,	"rxdma_rbr_pre_par_err",
1296f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1306f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1316f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RBR_TMOUT,	"rxdma_rbr_tmout",
1326f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
1336f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1346f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RSP_CNT_ERR,	"rxdma_rsp_cnt_err",
1356f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1366f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1376f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_BYTE_EN_BUS,	"rxdma_byte_en_bus",
1386f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1396f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1406f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RSP_DAT_ERR,	"rxdma_rsp_dat_err",
1416f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1426f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1436f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_ID_MISMATCH,	"rxdma_id_mismatch",
1446f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1456f45ec7bSml29623 						DDI_SERVICE_LOST},
1466f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_ZCP_EOP_ERR,	"rxdma_zcp_eop_err",
1476f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1486f45ec7bSml29623 						DDI_SERVICE_LOST},
1496f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_IPP_EOP_ERR,	"rxdma_ipp_eop_err",
1506f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1516f45ec7bSml29623 						DDI_SERVICE_LOST},
15253f3d8ecSyc148097 	{NXGE_FM_EREPORT_RDMC_RCR_ERR,		"rxdma_completion_err",
1536f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1546f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1556f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_CONFIG_ERR,	"rxdma_config_err",
1566f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1576f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1586f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RCRINCON,		"rxdma_rcrincon",
1596f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1606f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1616f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RCRFULL,		"rxdma_rcrfull",
1626f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1636f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1646f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RBRFULL,		"rxdma_rbrfull",
1656f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1666f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1676f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_RBRLOGPAGE,	"rxdma_rbrlogpage",
1686f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1696f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
1706f45ec7bSml29623 	{NXGE_FM_EREPORT_RDMC_CFIGLOGPAGE,	"rxdma_cfiglogpage",
1716f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1726f45ec7bSml29623 						DDI_SERVICE_DEGRADED}
1736f45ec7bSml29623 };
1746f45ec7bSml29623 
1756f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_zcp[] = {
1766f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_RRFIFO_UNDERRUN,	"rxzcopy_rrfifo_underrun",
1776f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1786f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1796f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_RSPFIFO_UNCORR_ERR,
1806f45ec7bSml29623 						"rxzcopy_rspfifo_uncorr_err",
1816f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1826f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1836f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_STAT_TBL_PERR,	"rxzcopy_stat_tbl_perr",
1846f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1856f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1866f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_DYN_TBL_PERR,	"rxzcopy_dyn_tbl_perr",
1876f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1886f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1896f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_BUF_TBL_PERR,	"rxzcopy_buf_tbl_perr",
1906f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
1916f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1926f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_CFIFO_ECC,		"rxzcopy_cfifo_ecc",
1936f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_CORR,
1946f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1956f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_RRFIFO_OVERRUN,	"rxzcopy_rrfifo_overrun",
1966f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
1976f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
1986f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_BUFFER_OVERFLOW,	"rxzcopy_buffer_overflow",
1996f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2006f45ec7bSml29623 						DDI_SERVICE_LOST},
2016f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_TT_PROGRAM_ERR,	"rxzcopy_tt_program_err",
2026f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2036f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2046f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_RSP_TT_INDEX_ERR,	"rxzcopy_rsp_tt_index_err",
2056f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2066f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2076f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_SLV_TT_INDEX_ERR,	"rxzcopy_slv_tt_index_err",
2086f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2096f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2106f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_TT_INDEX_ERR,	"rxzcopy_tt_index_err",
2116f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2126f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2136f45ec7bSml29623 	{NXGE_FM_EREPORT_ZCP_ACCESS_FAIL,	"rxzcopy_access_fail",
2146f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
2156f45ec7bSml29623 						DDI_SERVICE_LOST},
2166f45ec7bSml29623 };
2176f45ec7bSml29623 
2186f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_rxmac[] = {
2196f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_UNDERFLOW,	"rxmac_underflow",
2206f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2216f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2226f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_CRC_ERRCNT_EXP,	"rxmac_crc_errcnt_exp",
2236f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2246f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2256f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_LENGTH_ERRCNT_EXP,
2266f45ec7bSml29623 						"rxmac_length_errcnt_exp",
2276f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2286f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2296f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_VIOL_ERRCNT_EXP,	"rxmac_viol_errcnt_exp",
2306f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2316f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2326f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_RXFRAG_CNT_EXP,	"rxmac_rxfrag_cnt_exp",
2336f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2346f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2356f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_ALIGN_ECNT_EXP,	"rxmac_align_ecnt_exp",
2366f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2376f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2386f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_LINKFAULT_CNT_EXP,
2396f45ec7bSml29623 						"rxmac_linkfault_cnt_exp",
2406f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2416f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2426f45ec7bSml29623 	{NXGE_FM_EREPORT_RXMAC_RESET_FAIL,	"rxmac_reset_fail",
2436f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
2446f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2456f45ec7bSml29623 };
2466f45ec7bSml29623 
2476f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_tdmc[] = {
2486f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_PREF_BUF_PAR_ERR,	"txdma_pref_buf_par_err",
2496f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2506f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2516f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_MBOX_ERR,		"txdma_mbox_err",
2526f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
2536f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2546f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_NACK_PREF,	"txdma_nack_pref",
2556f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
2566f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2576f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_NACK_PKT_RD,	"txdma_nack_pkt_rd",
2586f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
2596f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2606f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR,	"txdma_pkt_size_err",
2616f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2626f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2636f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_TX_RING_OFLOW,	"txdma_tx_ring_oflow",
2646f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2656f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2666f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_CONF_PART_ERR,	"txdma_conf_part_err",
2676f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2686f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2696f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_PKT_PRT_ERR,	"txdma_pkt_prt_err",
2706f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2716f45ec7bSml29623 						DDI_SERVICE_DEGRADED},
2726f45ec7bSml29623 	{NXGE_FM_EREPORT_TDMC_RESET_FAIL,	"txdma_reset_fail",
2736f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
2746f45ec7bSml29623 						DDI_SERVICE_LOST},
2756f45ec7bSml29623 };
2766f45ec7bSml29623 
2776f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_txc[] = {
2786f45ec7bSml29623 	{NXGE_FM_EREPORT_TXC_RO_CORRECT_ERR,	"tx_ro_correct_err",
2796f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_CORR,
2806f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2816f45ec7bSml29623 	{NXGE_FM_EREPORT_TXC_RO_UNCORRECT_ERR,	"tx_ro_uncorrect_err",
2826f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2836f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2846f45ec7bSml29623 	{NXGE_FM_EREPORT_TXC_SF_CORRECT_ERR,	"tx_sf_correct_err",
2856f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_CORR,
2866f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2876f45ec7bSml29623 	{NXGE_FM_EREPORT_TXC_SF_UNCORRECT_ERR,	"tx_sf_uncorrect_err",
2886f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2896f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2906f45ec7bSml29623 	{NXGE_FM_EREPORT_TXC_ASSY_DEAD,		"tx_assembly_uncorrect_err",
2916f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
2926f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
2936f45ec7bSml29623 	{NXGE_FM_EREPORT_TXC_REORDER_ERR,	"tx_reorder_err",
2946f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
2956f45ec7bSml29623 						DDI_SERVICE_LOST},
2966f45ec7bSml29623 };
2976f45ec7bSml29623 
2986f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_txmac[] = {
2996f45ec7bSml29623 	{NXGE_FM_EREPORT_TXMAC_UNDERFLOW,	"txmac_underflow",
3006f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
3016f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
3026f45ec7bSml29623 	{NXGE_FM_EREPORT_TXMAC_OVERFLOW,	"txmac_overflow",
3036f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
3046f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
3056f45ec7bSml29623 	{NXGE_FM_EREPORT_TXMAC_TXFIFO_XFR_ERR,	"txmac_txfifo_xfr_err",
3066f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
3076f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
3086f45ec7bSml29623 	{NXGE_FM_EREPORT_TXMAC_MAX_PKT_ERR,	"txmac_max_pkt_err",
3096f45ec7bSml29623 						DDI_FM_DEVICE_INTERN_UNCORR,
3106f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
3116f45ec7bSml29623 	{NXGE_FM_EREPORT_TXMAC_RESET_FAIL,	"txmac_reset_fail",
3126f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
3136f45ec7bSml29623 						DDI_SERVICE_UNAFFECTED},
3146f45ec7bSml29623 };
3156f45ec7bSml29623 
3166f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_espc[] = {
3176f45ec7bSml29623 	{NXGE_FM_EREPORT_ESPC_ACCESS_FAIL,	"eprom_access_fail",
3186f45ec7bSml29623 						DDI_FM_DEVICE_NO_RESPONSE,
3196f45ec7bSml29623 						DDI_SERVICE_LOST},
3206f45ec7bSml29623 };
3216f45ec7bSml29623 
322ee5416c9Syc148097 nxge_fm_ereport_attr_t nxge_fm_ereport_xaui[] = {
323ee5416c9Syc148097 	{NXGE_FM_EREPORT_XAUI_ERR,		"xaui_bad_or_missing",
324ee5416c9Syc148097 						NXGE_FM_DEVICE_XAUI_ERR,
325ee5416c9Syc148097 						DDI_SERVICE_LOST},
326ee5416c9Syc148097 };
327ee5416c9Syc148097 
328ee5416c9Syc148097 nxge_fm_ereport_attr_t nxge_fm_ereport_xfp[] = {
329ee5416c9Syc148097 	{NXGE_FM_EREPORT_XFP_ERR,		"xfp_bad_or_missing",
330ee5416c9Syc148097 						NXGE_FM_DEVICE_XFP_ERR,
331ee5416c9Syc148097 						DDI_SERVICE_LOST},
332ee5416c9Syc148097 };
333ee5416c9Syc148097 
3346f45ec7bSml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_sw[] = {
3356f45ec7bSml29623 	{NXGE_FM_EREPORT_SW_INVALID_PORT_NUM,	"invalid_port_num",
3366f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
3376f45ec7bSml29623 						DDI_SERVICE_LOST},
3386f45ec7bSml29623 	{NXGE_FM_EREPORT_SW_INVALID_CHAN_NUM,	"invalid_chan_num",
3396f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
3406f45ec7bSml29623 						DDI_SERVICE_LOST},
3416f45ec7bSml29623 	{NXGE_FM_EREPORT_SW_INVALID_PARAM,	"invalid_param",
3426f45ec7bSml29623 						DDI_FM_DEVICE_INVAL_STATE,
3436f45ec7bSml29623 						DDI_SERVICE_LOST},
3446f45ec7bSml29623 };
3456f45ec7bSml29623 
3466f45ec7bSml29623 void
3476f45ec7bSml29623 nxge_fm_init(p_nxge_t nxgep, ddi_device_acc_attr_t *reg_attr,
348*837c1ac4SStephen Hanson 	ddi_dma_attr_t *dma_attr)
3496f45ec7bSml29623 {
3506f45ec7bSml29623 	ddi_iblock_cookie_t iblk;
3516f45ec7bSml29623 
352ee5416c9Syc148097 	/*
353ee5416c9Syc148097 	 * fm-capable in nxge.conf can be used to set fm_capabilities.
354ee5416c9Syc148097 	 * If fm-capable is not defined, then the last argument passed to
355ee5416c9Syc148097 	 * ddi_prop_get_int will be returned as the capabilities.
356ee5416c9Syc148097 	 */
3576f45ec7bSml29623 	nxgep->fm_capabilities = ddi_prop_get_int(DDI_DEV_T_ANY, nxgep->dip,
358ee5416c9Syc148097 	    DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "fm-capable",
359ee5416c9Syc148097 	    DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE);
360ee5416c9Syc148097 
361678453a8Sspeer 	NXGE_ERROR_MSG((nxgep, DDI_CTL,
3626f45ec7bSml29623 	    "FM capable = %d\n", nxgep->fm_capabilities));
3636f45ec7bSml29623 
364678453a8Sspeer 	if (isLDOMguest(nxgep)) {
365678453a8Sspeer 		nxgep->fm_capabilities = DDI_FM_NOT_CAPABLE;
366678453a8Sspeer 		return;
367678453a8Sspeer 	}
368678453a8Sspeer 
369ee5416c9Syc148097 	/*
370ee5416c9Syc148097 	 * Register capabilities with IO Fault Services. The capabilities
371ee5416c9Syc148097 	 * set above may not be supported by the parent nexus, in that case
372ee5416c9Syc148097 	 * some capability bits may be cleared.
373ee5416c9Syc148097 	 */
374ee5416c9Syc148097 	if (nxgep->fm_capabilities)
3756f45ec7bSml29623 		ddi_fm_init(nxgep->dip, &nxgep->fm_capabilities, &iblk);
3766f45ec7bSml29623 
3776f45ec7bSml29623 	/*
3786f45ec7bSml29623 	 * Initialize pci ereport capabilities if ereport capable
3796f45ec7bSml29623 	 */
3806f45ec7bSml29623 	if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities) ||
381ee5416c9Syc148097 	    DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) {
3826f45ec7bSml29623 		pci_ereport_setup(nxgep->dip);
383ee5416c9Syc148097 	}
384ee5416c9Syc148097 
385ee5416c9Syc148097 	/* Register error callback if error callback capable */
386ee5416c9Syc148097 	if (DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) {
387ee5416c9Syc148097 		ddi_fm_handler_register(nxgep->dip,
388ee5416c9Syc148097 		    nxge_fm_error_cb, (void*) nxgep);
389ee5416c9Syc148097 	}
390ee5416c9Syc148097 
3916f45ec7bSml29623 	/*
392ee5416c9Syc148097 	 * DDI_FLGERR_ACC indicates:
393ee5416c9Syc148097 	 * o Driver will check its access handle(s) for faults on
394ee5416c9Syc148097 	 *   a regular basis by calling ddi_fm_acc_err_get
395ee5416c9Syc148097 	 * o Driver is able to cope with incorrect results of I/O
396ee5416c9Syc148097 	 *   operations resulted from an I/O fault
3976f45ec7bSml29623 	 */
398ee5416c9Syc148097 	if (DDI_FM_ACC_ERR_CAP(nxgep->fm_capabilities)) {
399ee5416c9Syc148097 		reg_attr->devacc_attr_access  = DDI_FLAGERR_ACC;
400ee5416c9Syc148097 	} else {
4016f45ec7bSml29623 		reg_attr->devacc_attr_access  = DDI_DEFAULT_ACC;
4026f45ec7bSml29623 	}
403ee5416c9Syc148097 
404ee5416c9Syc148097 	/*
405ee5416c9Syc148097 	 * DDI_DMA_FLAGERR indicates:
406ee5416c9Syc148097 	 * o Driver will check its DMA handle(s) for faults on a
407ee5416c9Syc148097 	 *   regular basis using ddi_fm_dma_err_get
408ee5416c9Syc148097 	 * o Driver is able to cope with incorrect results of DMA
409ee5416c9Syc148097 	 *   operations resulted from an I/O fault
410ee5416c9Syc148097 	 */
411ee5416c9Syc148097 	if (DDI_FM_DMA_ERR_CAP(nxgep->fm_capabilities))
412ee5416c9Syc148097 		dma_attr->dma_attr_flags |= DDI_DMA_FLAGERR;
413ee5416c9Syc148097 	else
414ee5416c9Syc148097 		dma_attr->dma_attr_flags &= ~DDI_DMA_FLAGERR;
415ee5416c9Syc148097 
4166f45ec7bSml29623 }
4176f45ec7bSml29623 
4186f45ec7bSml29623 void
4196f45ec7bSml29623 nxge_fm_fini(p_nxge_t nxgep)
4206f45ec7bSml29623 {
4216f45ec7bSml29623 	/* Only unregister FMA capabilities if we registered some */
4226f45ec7bSml29623 	if (nxgep->fm_capabilities) {
4236f45ec7bSml29623 
4246f45ec7bSml29623 		/*
4256f45ec7bSml29623 		 * Release any resources allocated by pci_ereport_setup()
4266f45ec7bSml29623 		 */
4276f45ec7bSml29623 		if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities) ||
4286f45ec7bSml29623 		    DDI_FM_ERRCB_CAP(nxgep->fm_capabilities))
4296f45ec7bSml29623 			pci_ereport_teardown(nxgep->dip);
4306f45ec7bSml29623 
4316f45ec7bSml29623 		/*
4326f45ec7bSml29623 		 * Un-register error callback if error callback capable
4336f45ec7bSml29623 		 */
4346f45ec7bSml29623 		if (DDI_FM_ERRCB_CAP(nxgep->fm_capabilities))
4356f45ec7bSml29623 			ddi_fm_handler_unregister(nxgep->dip);
4366f45ec7bSml29623 
4376f45ec7bSml29623 		/* Unregister from IO Fault Services */
4386f45ec7bSml29623 		ddi_fm_fini(nxgep->dip);
4396f45ec7bSml29623 	}
4406f45ec7bSml29623 }
4416f45ec7bSml29623 
442ee5416c9Syc148097 /*ARGSUSED*/
443ee5416c9Syc148097 /*
444ee5416c9Syc148097  * Simply call pci_ereport_post which generates ereports for errors
445ee5416c9Syc148097  * that occur in the PCI local bus configuration status registers.
446ee5416c9Syc148097  */
447ee5416c9Syc148097 static int
448ee5416c9Syc148097 nxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err,
449ee5416c9Syc148097 	const void *impl_data)
4506f45ec7bSml29623 {
451ee5416c9Syc148097 	pci_ereport_post(dip, err, NULL);
452ee5416c9Syc148097 	return (err->fme_status);
4536f45ec7bSml29623 }
4546f45ec7bSml29623 
4556f45ec7bSml29623 
4566f45ec7bSml29623 static nxge_fm_ereport_attr_t *
4576f45ec7bSml29623 nxge_fm_get_ereport_attr(nxge_fm_ereport_id_t ereport_id)
4586f45ec7bSml29623 {
4596f45ec7bSml29623 	nxge_fm_ereport_attr_t *attr;
460ee5416c9Syc148097 	uint8_t	blk_id = (ereport_id >> EREPORT_FM_ID_SHIFT) &
461ee5416c9Syc148097 	    EREPORT_FM_ID_MASK;
462ee5416c9Syc148097 	uint8_t index = ereport_id & EREPORT_INDEX_MASK;
4636f45ec7bSml29623 
4646f45ec7bSml29623 	switch (blk_id) {
4656f45ec7bSml29623 	case FM_SW_ID:
4666f45ec7bSml29623 		attr = &nxge_fm_ereport_sw[index];
4676f45ec7bSml29623 		break;
4686f45ec7bSml29623 	case FM_PCS_ID:
4696f45ec7bSml29623 		attr = &nxge_fm_ereport_pcs[index];
4706f45ec7bSml29623 		break;
4716f45ec7bSml29623 	case FM_TXMAC_ID:
4726f45ec7bSml29623 		attr = &nxge_fm_ereport_txmac[index];
4736f45ec7bSml29623 		break;
4746f45ec7bSml29623 	case FM_RXMAC_ID:
4756f45ec7bSml29623 		attr = &nxge_fm_ereport_rxmac[index];
4766f45ec7bSml29623 		break;
4776f45ec7bSml29623 	case FM_MIF_ID:
4786f45ec7bSml29623 		attr = &nxge_fm_ereport_mif[index];
4796f45ec7bSml29623 		break;
4806f45ec7bSml29623 	case FM_FFLP_ID:
4816f45ec7bSml29623 		attr = &nxge_fm_ereport_fflp[index];
4826f45ec7bSml29623 		break;
4836f45ec7bSml29623 	case FM_ZCP_ID:
4846f45ec7bSml29623 		attr = &nxge_fm_ereport_zcp[index];
4856f45ec7bSml29623 		break;
4866f45ec7bSml29623 	case FM_RXDMA_ID:
4876f45ec7bSml29623 		attr = &nxge_fm_ereport_rdmc[index];
4886f45ec7bSml29623 		break;
4896f45ec7bSml29623 	case FM_TXDMA_ID:
4906f45ec7bSml29623 		attr = &nxge_fm_ereport_tdmc[index];
4916f45ec7bSml29623 		break;
4926f45ec7bSml29623 	case FM_IPP_ID:
4936f45ec7bSml29623 		attr = &nxge_fm_ereport_ipp[index];
4946f45ec7bSml29623 		break;
4956f45ec7bSml29623 	case FM_TXC_ID:
4966f45ec7bSml29623 		attr = &nxge_fm_ereport_txc[index];
4976f45ec7bSml29623 		break;
4986f45ec7bSml29623 	case FM_ESPC_ID:
4996f45ec7bSml29623 		attr = &nxge_fm_ereport_espc[index];
5006f45ec7bSml29623 		break;
501ee5416c9Syc148097 	case FM_XAUI_ID:
502ee5416c9Syc148097 		attr = &nxge_fm_ereport_xaui[index];
503ee5416c9Syc148097 		break;
504ee5416c9Syc148097 	case FM_XFP_ID:
505ee5416c9Syc148097 		attr = &nxge_fm_ereport_xfp[index];
506ee5416c9Syc148097 		break;
5076f45ec7bSml29623 	default:
5086f45ec7bSml29623 		attr = NULL;
5096f45ec7bSml29623 	}
5106f45ec7bSml29623 
5116f45ec7bSml29623 	return (attr);
5126f45ec7bSml29623 }
5136f45ec7bSml29623 
5146f45ec7bSml29623 static void
5156f45ec7bSml29623 nxge_fm_ereport(p_nxge_t nxgep, uint8_t err_portn, uint8_t err_chan,
5166f45ec7bSml29623 					nxge_fm_ereport_attr_t *ereport)
5176f45ec7bSml29623 {
5186f45ec7bSml29623 	uint64_t		ena;
5196f45ec7bSml29623 	char			eclass[FM_MAX_CLASS];
5206f45ec7bSml29623 	char			*err_str;
5216f45ec7bSml29623 	p_nxge_stats_t		statsp;
5226f45ec7bSml29623 
5236f45ec7bSml29623 	(void) snprintf(eclass, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE,
5246f45ec7bSml29623 	    ereport->eclass);
5256f45ec7bSml29623 	err_str = ereport->str;
5266f45ec7bSml29623 	ena = fm_ena_generate(0, FM_ENA_FMT1);
5276f45ec7bSml29623 	statsp = nxgep->statsp;
5286f45ec7bSml29623 
5296f45ec7bSml29623 	switch (ereport->index) {
5306f45ec7bSml29623 		case NXGE_FM_EREPORT_XPCS_LINK_DOWN:
5316f45ec7bSml29623 		case NXGE_FM_EREPORT_XPCS_TX_LINK_FAULT:
5326f45ec7bSml29623 		case NXGE_FM_EREPORT_XPCS_RX_LINK_FAULT:
5336f45ec7bSml29623 		case NXGE_FM_EREPORT_PCS_LINK_DOWN:
5346f45ec7bSml29623 		case NXGE_FM_EREPORT_PCS_REMOTE_FAULT:
5356f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
5366f45ec7bSml29623 			    DDI_NOSLEEP,
5376f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
538ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
5396f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
5406f45ec7bSml29623 			    NULL);
5416f45ec7bSml29623 			break;
5426f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_EOP_MISS:
5436f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_SOP_MISS:
5446f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
5456f45ec7bSml29623 			    DDI_NOSLEEP,
5466f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
547ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
5486f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
5496f45ec7bSml29623 			    ERNAME_DFIFO_RD_PTR, DATA_TYPE_UINT16,
5506f45ec7bSml29623 			    statsp->ipp_stats.errlog.dfifo_rd_ptr,
5516f45ec7bSml29623 			    ERNAME_IPP_STATE_MACH, DATA_TYPE_UINT32,
5526f45ec7bSml29623 			    statsp->ipp_stats.errlog.state_mach,
5536f45ec7bSml29623 			    NULL);
5546f45ec7bSml29623 			break;
5556f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_DFIFO_UE:
5566f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
5576f45ec7bSml29623 			    DDI_NOSLEEP,
5586f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
559ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
5606f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
5616f45ec7bSml29623 			    ERNAME_DFIFO_ENTRY, DATA_TYPE_UINT16,
5626f45ec7bSml29623 			    nxgep->ipp.status.bits.w0.dfifo_ecc_err_idx,
5636f45ec7bSml29623 			    ERNAME_DFIFO_SYNDROME, DATA_TYPE_UINT16,
5646f45ec7bSml29623 			    statsp->ipp_stats.errlog.ecc_syndrome,
5656f45ec7bSml29623 			    NULL);
5666f45ec7bSml29623 			break;
5676f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_PFIFO_PERR:
5686f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
5696f45ec7bSml29623 			    DDI_NOSLEEP,
5706f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
571ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
5726f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
5736f45ec7bSml29623 			    ERNAME_PFIFO_ENTRY, DATA_TYPE_UINT8,
5746f45ec7bSml29623 			    nxgep->ipp.status.bits.w0.pre_fifo_perr_idx,
5756f45ec7bSml29623 			    NULL);
5766f45ec7bSml29623 			break;
5776f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_DFIFO_CE:
5786f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_ECC_ERR_MAX:
5796f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
5806f45ec7bSml29623 			    DDI_NOSLEEP,
5816f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
582ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
5836f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
5846f45ec7bSml29623 			    NULL);
5856f45ec7bSml29623 			break;
5866f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_PFIFO_OVER:
5876f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_PFIFO_UND:
5886f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
5896f45ec7bSml29623 			    DDI_NOSLEEP,
5906f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
591ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
5926f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
5936f45ec7bSml29623 			    ERNAME_IPP_STATE_MACH, DATA_TYPE_UINT32,
5946f45ec7bSml29623 			    statsp->ipp_stats.errlog.state_mach,
5956f45ec7bSml29623 			    NULL);
5966f45ec7bSml29623 			break;
5976f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_BAD_CS_MX:
5986f45ec7bSml29623 		case NXGE_FM_EREPORT_IPP_PKT_DIS_MX:
5996f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
6006f45ec7bSml29623 			    DDI_NOSLEEP,
6016f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
602ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
6036f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
6046f45ec7bSml29623 			    NULL);
6056f45ec7bSml29623 			break;
6066f45ec7bSml29623 		case NXGE_FM_EREPORT_FFLP_TCAM_ERR:
6076f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
6086f45ec7bSml29623 			    DDI_NOSLEEP,
6096f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
610ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
6116f45ec7bSml29623 			    ERNAME_TCAM_ERR_LOG, DATA_TYPE_UINT32,
6126f45ec7bSml29623 			    statsp->fflp_stats.errlog.tcam,
6136f45ec7bSml29623 			    NULL);
6146f45ec7bSml29623 			break;
6156f45ec7bSml29623 		case NXGE_FM_EREPORT_FFLP_VLAN_PAR_ERR:
6166f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
6176f45ec7bSml29623 			    DDI_NOSLEEP,
6186f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
619ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
6206f45ec7bSml29623 			    ERNAME_VLANTAB_ERR_LOG, DATA_TYPE_UINT32,
6216f45ec7bSml29623 			    statsp->fflp_stats.errlog.vlan,
6226f45ec7bSml29623 			    NULL);
6236f45ec7bSml29623 			break;
6246f45ec7bSml29623 		case NXGE_FM_EREPORT_FFLP_HASHT_DATA_ERR:
6256f45ec7bSml29623 		{
6266f45ec7bSml29623 			int rdc_grp;
6276f45ec7bSml29623 			hash_tbl_data_log_t hash_log;
6286f45ec7bSml29623 
6296f45ec7bSml29623 			for (rdc_grp = 0; rdc_grp < MAX_PARTITION; rdc_grp++) {
6306f45ec7bSml29623 				hash_log.value = nxgep->classifier.fflp_stats->
6316f45ec7bSml29623 				    errlog.hash_pio[rdc_grp];
6326f45ec7bSml29623 				if (hash_log.bits.ldw.pio_err) {
6336f45ec7bSml29623 					ddi_fm_ereport_post(nxgep->dip, eclass,
6346f45ec7bSml29623 					    ena, DDI_NOSLEEP,
6356f45ec7bSml29623 					    FM_VERSION, DATA_TYPE_UINT8,
6366f45ec7bSml29623 					    FM_EREPORT_VERS0,
637ee5416c9Syc148097 					    ERNAME_DETAILED_ERR_TYPE,
638ee5416c9Syc148097 					    DATA_TYPE_STRING, err_str,
6396f45ec7bSml29623 					    ERNAME_HASHTAB_ERR_LOG,
6406f45ec7bSml29623 					    DATA_TYPE_UINT32,
6416f45ec7bSml29623 					    nxgep->classifier.fflp_stats->
6426f45ec7bSml29623 					    errlog.hash_pio[rdc_grp], NULL);
6436f45ec7bSml29623 				}
6446f45ec7bSml29623 			}
6456f45ec7bSml29623 		}
6466f45ec7bSml29623 			break;
6476f45ec7bSml29623 		case NXGE_FM_EREPORT_FFLP_HASHT_LOOKUP_ERR:
6486f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
6496f45ec7bSml29623 			    DDI_NOSLEEP,
6506f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
651ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
6526f45ec7bSml29623 			    ERNAME_HASHT_LOOKUP_ERR_LOG0, DATA_TYPE_UINT32,
6536f45ec7bSml29623 			    statsp->fflp_stats.errlog. hash_lookup1,
6546f45ec7bSml29623 			    ERNAME_HASHT_LOOKUP_ERR_LOG1, DATA_TYPE_UINT32,
6556f45ec7bSml29623 			    statsp->fflp_stats.errlog.hash_lookup2,
6566f45ec7bSml29623 			    NULL);
6576f45ec7bSml29623 			break;
6586f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_DCF_ERR:
6596f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RBR_TMOUT:
6606f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RSP_CNT_ERR:
6616f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_BYTE_EN_BUS:
6626f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RSP_DAT_ERR:
6636f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RCR_ACK_ERR:
6646f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_DC_FIFO_ERR:
6656f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_CONFIG_ERR:
6666f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RCRINCON:
6676f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RCRFULL:
6686f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RBRFULL:
6696f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RBRLOGPAGE:
6706f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_CFIGLOGPAGE:
6716f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_ID_MISMATCH:
6726f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_ZCP_EOP_ERR:
6736f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_IPP_EOP_ERR:
6746f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
6756f45ec7bSml29623 			    DDI_NOSLEEP,
6766f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
677ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
6786f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
6796f45ec7bSml29623 			    ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
6806f45ec7bSml29623 			    NULL);
6816f45ec7bSml29623 			break;
6826f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR:
6836f45ec7bSml29623 		case NXGE_FM_EREPORT_RDMC_RCR_SHA_PAR:
6846f45ec7bSml29623 			{
6856f45ec7bSml29623 			uint32_t err_log;
6866f45ec7bSml29623 			if (ereport->index == NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR)
6876f45ec7bSml29623 				err_log = (uint32_t)statsp->
6886f45ec7bSml29623 				    rdc_stats[err_chan].errlog.pre_par.value;
6896f45ec7bSml29623 			else
6906f45ec7bSml29623 				err_log = (uint32_t)statsp->
6916f45ec7bSml29623 				    rdc_stats[err_chan].errlog.sha_par.value;
6926f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
6936f45ec7bSml29623 			    DDI_NOSLEEP,
6946f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
695ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
6966f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
6976f45ec7bSml29623 			    ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
698ee5416c9Syc148097 			    ERNAME_RDMC_PAR_ERR_LOG, DATA_TYPE_UINT8, err_log,
699ee5416c9Syc148097 			    NULL);
7006f45ec7bSml29623 			}
7016f45ec7bSml29623 			break;
70253f3d8ecSyc148097 		case NXGE_FM_EREPORT_RDMC_RCR_ERR:
7036f45ec7bSml29623 			{
7046f45ec7bSml29623 			uint8_t err_type;
7056f45ec7bSml29623 			err_type = statsp->
7066f45ec7bSml29623 			    rdc_stats[err_chan].errlog.compl_err_type;
7076f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7086f45ec7bSml29623 			    DDI_NOSLEEP,
7096f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
710ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
7116f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
7126f45ec7bSml29623 			    ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
713ee5416c9Syc148097 			    ERNAME_RDC_ERR_TYPE, DATA_TYPE_UINT8, err_type,
714ee5416c9Syc148097 			    NULL);
7156f45ec7bSml29623 			}
7166f45ec7bSml29623 			break;
7176f45ec7bSml29623 
7186f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_RRFIFO_UNDERRUN:
7196f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_RRFIFO_OVERRUN:
7206f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_BUFFER_OVERFLOW:
7216f45ec7bSml29623 			{
7226f45ec7bSml29623 			uint32_t sm;
7236f45ec7bSml29623 			sm = statsp->
7246f45ec7bSml29623 			    zcp_stats.errlog.state_mach.bits.ldw.state;
7256f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7266f45ec7bSml29623 			    DDI_NOSLEEP,
7276f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
728ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
7296f45ec7bSml29623 			    sm, DATA_TYPE_UINT32,
7306f45ec7bSml29623 			    NULL);
7316f45ec7bSml29623 			break;
7326f45ec7bSml29623 			}
7336f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_CFIFO_ECC:
7346f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7356f45ec7bSml29623 			    DDI_NOSLEEP,
7366f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
737ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
738ee5416c9Syc148097 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
7396f45ec7bSml29623 			    NULL);
7406f45ec7bSml29623 			break;
7416f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_RSPFIFO_UNCORR_ERR:
7426f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_STAT_TBL_PERR:
7436f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_DYN_TBL_PERR:
7446f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_BUF_TBL_PERR:
7456f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_TT_PROGRAM_ERR:
7466f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_RSP_TT_INDEX_ERR:
7476f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_SLV_TT_INDEX_ERR:
7486f45ec7bSml29623 		case NXGE_FM_EREPORT_ZCP_TT_INDEX_ERR:
7496f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_UNDERFLOW:
7506f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_CRC_ERRCNT_EXP:
7516f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_LENGTH_ERRCNT_EXP:
7526f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_VIOL_ERRCNT_EXP:
7536f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_RXFRAG_CNT_EXP:
7546f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_LINKFAULT_CNT_EXP:
7556f45ec7bSml29623 		case NXGE_FM_EREPORT_RXMAC_ALIGN_ECNT_EXP:
7566f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7576f45ec7bSml29623 			    DDI_NOSLEEP,
7586f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
759ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
7606f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
7616f45ec7bSml29623 			    NULL);
7626f45ec7bSml29623 			break;
7636f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_MBOX_ERR:
7646f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_TX_RING_OFLOW:
7656f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7666f45ec7bSml29623 			    DDI_NOSLEEP,
7676f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
768ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
7696f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
7706f45ec7bSml29623 			    ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
7716f45ec7bSml29623 			    NULL);
7726f45ec7bSml29623 			break;
7736f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_PREF_BUF_PAR_ERR:
7746f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_NACK_PREF:
7756f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_NACK_PKT_RD:
7766f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR:
7776f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_CONF_PART_ERR:
7786f45ec7bSml29623 		case NXGE_FM_EREPORT_TDMC_PKT_PRT_ERR:
7796f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7806f45ec7bSml29623 			    DDI_NOSLEEP,
7816f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
782ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
7836f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
7846f45ec7bSml29623 			    ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
7856f45ec7bSml29623 			    ERNAME_TDMC_ERR_LOG1, DATA_TYPE_UINT32,
786ee5416c9Syc148097 			    statsp->tdc_stats[err_chan].errlog.logl.value,
7876f45ec7bSml29623 			    ERNAME_TDMC_ERR_LOG1, DATA_TYPE_UINT32,
7886f45ec7bSml29623 			    statsp->tdc_stats[err_chan].errlog.logh.value,
7896f45ec7bSml29623 			    DATA_TYPE_UINT32,
7906f45ec7bSml29623 			    NULL);
7916f45ec7bSml29623 			break;
7926f45ec7bSml29623 		case NXGE_FM_EREPORT_TXC_RO_CORRECT_ERR:
7936f45ec7bSml29623 		case NXGE_FM_EREPORT_TXC_RO_UNCORRECT_ERR:
7946f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
7956f45ec7bSml29623 			    DDI_NOSLEEP,
7966f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
797ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
7986f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
7996f45ec7bSml29623 			    ERNAME_TXC_ROECC_ADDR, DATA_TYPE_UINT16,
8006f45ec7bSml29623 			    statsp->txc_stats.errlog.ro_st.roecc.
8016f45ec7bSml29623 			    bits.ldw.ecc_address,
8026f45ec7bSml29623 			    ERNAME_TXC_ROECC_DATA0, DATA_TYPE_UINT32,
8036f45ec7bSml29623 			    statsp->txc_stats.errlog.ro_st.d0.
8046f45ec7bSml29623 			    bits.ldw.ro_ecc_data0,
8056f45ec7bSml29623 			    ERNAME_TXC_ROECC_DATA1, DATA_TYPE_UINT32,
8066f45ec7bSml29623 			    statsp->txc_stats.errlog.ro_st.d1.
8076f45ec7bSml29623 			    bits.ldw.ro_ecc_data1,
8086f45ec7bSml29623 			    ERNAME_TXC_ROECC_DATA2, DATA_TYPE_UINT32,
8096f45ec7bSml29623 			    statsp->txc_stats.errlog.ro_st.d2.
8106f45ec7bSml29623 			    bits.ldw.ro_ecc_data2,
8116f45ec7bSml29623 			    ERNAME_TXC_ROECC_DATA3, DATA_TYPE_UINT32,
8126f45ec7bSml29623 			    statsp->txc_stats.errlog.ro_st.d3.
8136f45ec7bSml29623 			    bits.ldw.ro_ecc_data3,
8146f45ec7bSml29623 			    ERNAME_TXC_ROECC_DATA4, DATA_TYPE_UINT32,
8156f45ec7bSml29623 			    statsp->txc_stats.errlog.ro_st.d4.
8166f45ec7bSml29623 			    bits.ldw.ro_ecc_data4,
8176f45ec7bSml29623 			    NULL);
8186f45ec7bSml29623 			break;
8196f45ec7bSml29623 		case NXGE_FM_EREPORT_TXC_REORDER_ERR:
8206f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
8216f45ec7bSml29623 			    DDI_NOSLEEP,
8226f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
823ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
8246f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
8256f45ec7bSml29623 			    ERNAME_TXC_RO_STATE0, DATA_TYPE_UINT32,
826ee5416c9Syc148097 			    (uint32_t)statsp->txc_stats.errlog.ro_st.st0.value,
8276f45ec7bSml29623 			    ERNAME_TXC_RO_STATE1, DATA_TYPE_UINT32,
828ee5416c9Syc148097 			    (uint32_t)statsp->txc_stats.errlog.ro_st.st1.value,
8296f45ec7bSml29623 			    ERNAME_TXC_RO_STATE2, DATA_TYPE_UINT32,
830ee5416c9Syc148097 			    (uint32_t)statsp->txc_stats.errlog.ro_st.st2.value,
8316f45ec7bSml29623 			    ERNAME_TXC_RO_STATE3, DATA_TYPE_UINT32,
832ee5416c9Syc148097 			    (uint32_t)statsp->txc_stats.errlog.ro_st.st3.value,
8336f45ec7bSml29623 			    ERNAME_TXC_RO_STATE_CTL, DATA_TYPE_UINT32,
834ee5416c9Syc148097 			    (uint32_t)statsp->txc_stats.errlog.ro_st.ctl.value,
8356f45ec7bSml29623 			    ERNAME_TXC_RO_TIDS, DATA_TYPE_UINT32,
836ee5416c9Syc148097 			    (uint32_t)statsp->txc_stats.errlog.ro_st.tids.value,
8376f45ec7bSml29623 			    NULL);
8386f45ec7bSml29623 			break;
8396f45ec7bSml29623 		case NXGE_FM_EREPORT_TXC_SF_CORRECT_ERR:
8406f45ec7bSml29623 		case NXGE_FM_EREPORT_TXC_SF_UNCORRECT_ERR:
8416f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
8426f45ec7bSml29623 			    DDI_NOSLEEP,
8436f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
844ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
8456f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
8466f45ec7bSml29623 			    ERNAME_TXC_SFECC_ADDR, DATA_TYPE_UINT32,
8476f45ec7bSml29623 			    statsp->txc_stats.errlog.sf_st.sfecc.
8486f45ec7bSml29623 			    bits.ldw.ecc_address,
8496f45ec7bSml29623 			    ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32,
8506f45ec7bSml29623 			    statsp->txc_stats.errlog.sf_st.d0.
8516f45ec7bSml29623 			    bits.ldw.sf_ecc_data0,
8526f45ec7bSml29623 			    ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32,
8536f45ec7bSml29623 			    statsp->txc_stats.errlog.sf_st.d1.
8546f45ec7bSml29623 			    bits.ldw.sf_ecc_data1,
8556f45ec7bSml29623 			    ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32,
8566f45ec7bSml29623 			    statsp->txc_stats.errlog.sf_st.d2.
8576f45ec7bSml29623 			    bits.ldw.sf_ecc_data2,
8586f45ec7bSml29623 			    ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32,
8596f45ec7bSml29623 			    statsp->txc_stats.errlog.sf_st.d3.
8606f45ec7bSml29623 			    bits.ldw.sf_ecc_data3,
8616f45ec7bSml29623 			    ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32,
8626f45ec7bSml29623 			    statsp->txc_stats.errlog.sf_st.d4.
8636f45ec7bSml29623 			    bits.ldw.sf_ecc_data4,
8646f45ec7bSml29623 			    NULL);
8656f45ec7bSml29623 			break;
8666f45ec7bSml29623 		case NXGE_FM_EREPORT_TXMAC_UNDERFLOW:
8676f45ec7bSml29623 		case NXGE_FM_EREPORT_TXMAC_OVERFLOW:
8686f45ec7bSml29623 		case NXGE_FM_EREPORT_TXMAC_TXFIFO_XFR_ERR:
8696f45ec7bSml29623 		case NXGE_FM_EREPORT_TXMAC_MAX_PKT_ERR:
870ee5416c9Syc148097 		case NXGE_FM_EREPORT_XAUI_ERR:
871ee5416c9Syc148097 		case NXGE_FM_EREPORT_XFP_ERR:
8726f45ec7bSml29623 		case NXGE_FM_EREPORT_SW_INVALID_PORT_NUM:
8736f45ec7bSml29623 		case NXGE_FM_EREPORT_SW_INVALID_CHAN_NUM:
8746f45ec7bSml29623 		case NXGE_FM_EREPORT_SW_INVALID_PARAM:
8756f45ec7bSml29623 			ddi_fm_ereport_post(nxgep->dip, eclass, ena,
8766f45ec7bSml29623 			    DDI_NOSLEEP,
8776f45ec7bSml29623 			    FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
878ee5416c9Syc148097 			    ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
8796f45ec7bSml29623 			    ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn,
8806f45ec7bSml29623 			    NULL);
8816f45ec7bSml29623 			break;
8826f45ec7bSml29623 	}
8836f45ec7bSml29623 }
8846f45ec7bSml29623 
8856f45ec7bSml29623 void
8866f45ec7bSml29623 nxge_fm_report_error(p_nxge_t nxgep, uint8_t err_portn, uint8_t err_chan,
8876f45ec7bSml29623 					nxge_fm_ereport_id_t fm_ereport_id)
8886f45ec7bSml29623 {
8896f45ec7bSml29623 	nxge_fm_ereport_attr_t		*fm_ereport_attr;
8906f45ec7bSml29623 
8916f45ec7bSml29623 	fm_ereport_attr = nxge_fm_get_ereport_attr(fm_ereport_id);
892f6485eecSyc148097 	if (fm_ereport_attr != NULL &&
893f6485eecSyc148097 	    (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities))) {
8946f45ec7bSml29623 		nxge_fm_ereport(nxgep, err_portn, err_chan, fm_ereport_attr);
8956f45ec7bSml29623 		ddi_fm_service_impact(nxgep->dip, fm_ereport_attr->impact);
8966f45ec7bSml29623 	}
8976f45ec7bSml29623 }
8986f45ec7bSml29623 
8996f45ec7bSml29623 int
9006f45ec7bSml29623 fm_check_acc_handle(ddi_acc_handle_t handle)
9016f45ec7bSml29623 {
9026f45ec7bSml29623 	ddi_fm_error_t err;
9036f45ec7bSml29623 
9046f45ec7bSml29623 	ddi_fm_acc_err_get(handle, &err, DDI_FME_VERSION);
9056f45ec7bSml29623 #ifndef	NXGE_FM_S10
9066f45ec7bSml29623 	ddi_fm_acc_err_clear(handle, DDI_FME_VERSION);
9076f45ec7bSml29623 #endif
9086f45ec7bSml29623 	return (err.fme_status);
9096f45ec7bSml29623 }
9106f45ec7bSml29623 
9116f45ec7bSml29623 int
9126f45ec7bSml29623 fm_check_dma_handle(ddi_dma_handle_t handle)
9136f45ec7bSml29623 {
9146f45ec7bSml29623 	ddi_fm_error_t err;
9156f45ec7bSml29623 
9166f45ec7bSml29623 	ddi_fm_dma_err_get(handle, &err, DDI_FME_VERSION);
9176f45ec7bSml29623 	return (err.fme_status);
9186f45ec7bSml29623 }
919