13859Sml29623 /* 23859Sml29623 * CDDL HEADER START 33859Sml29623 * 43859Sml29623 * The contents of this file are subject to the terms of the 53859Sml29623 * Common Development and Distribution License (the "License"). 63859Sml29623 * You may not use this file except in compliance with the License. 73859Sml29623 * 83859Sml29623 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 93859Sml29623 * or http://www.opensolaris.org/os/licensing. 103859Sml29623 * See the License for the specific language governing permissions 113859Sml29623 * and limitations under the License. 123859Sml29623 * 133859Sml29623 * When distributing Covered Code, include this CDDL HEADER in each 143859Sml29623 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 153859Sml29623 * If applicable, add the following below this CDDL HEADER, with the 163859Sml29623 * fields enclosed by brackets "[]" replaced with your own identifying 173859Sml29623 * information: Portions Copyright [yyyy] [name of copyright owner] 183859Sml29623 * 193859Sml29623 * CDDL HEADER END 203859Sml29623 */ 213859Sml29623 /* 224439Sml29623 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 233859Sml29623 * Use is subject to license terms. 243859Sml29623 */ 253859Sml29623 263859Sml29623 #pragma ident "%Z%%M% %I% %E% SMI" 273859Sml29623 283859Sml29623 #include <sys/nxge/nxge_impl.h> 293859Sml29623 #include <sys/ddifm.h> 303859Sml29623 #include <sys/fm/protocol.h> 313859Sml29623 #include <sys/fm/util.h> 323859Sml29623 #include <sys/fm/io/ddi.h> 333859Sml29623 343859Sml29623 static nxge_fm_ereport_attr_t 353859Sml29623 *nxge_fm_get_ereport_attr(nxge_fm_ereport_id_t); 363859Sml29623 37*5060Syc148097 static int 38*5060Syc148097 nxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data); 39*5060Syc148097 403859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_pcs[] = { 413859Sml29623 {NXGE_FM_EREPORT_XPCS_LINK_DOWN, "10g_link_down", 423859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 433859Sml29623 DDI_SERVICE_LOST}, 443859Sml29623 {NXGE_FM_EREPORT_XPCS_TX_LINK_FAULT, "10g_tx_link_fault", 453859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 463859Sml29623 DDI_SERVICE_DEGRADED}, 473859Sml29623 {NXGE_FM_EREPORT_XPCS_RX_LINK_FAULT, "10g_rx_link_fault", 483859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 493859Sml29623 DDI_SERVICE_DEGRADED}, 503859Sml29623 {NXGE_FM_EREPORT_PCS_LINK_DOWN, "1g_link_down", 513859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 523859Sml29623 DDI_SERVICE_LOST}, 533859Sml29623 {NXGE_FM_EREPORT_PCS_REMOTE_FAULT, "1g_remote_fault", 543859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 553859Sml29623 DDI_SERVICE_DEGRADED}, 563859Sml29623 }; 573859Sml29623 583859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_mif[] = { 593859Sml29623 {NXGE_FM_EREPORT_MIF_ACCESS_FAIL, "transceiver_access_fail"} 603859Sml29623 }; 613859Sml29623 623859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_fflp[] = { 633859Sml29623 {NXGE_FM_EREPORT_FFLP_TCAM_ERR, "classifier_tcam_err", 643859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 653859Sml29623 DDI_SERVICE_UNAFFECTED}, 663859Sml29623 {NXGE_FM_EREPORT_FFLP_VLAN_PAR_ERR, "classifier_vlan_par_err", 673859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 683859Sml29623 DDI_SERVICE_UNAFFECTED}, 693859Sml29623 {NXGE_FM_EREPORT_FFLP_HASHT_DATA_ERR, "classifier_hasht_data_err", 703859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 713859Sml29623 DDI_SERVICE_UNAFFECTED}, 723859Sml29623 {NXGE_FM_EREPORT_FFLP_HASHT_LOOKUP_ERR, "classifier_hasht_lookup_err", 733859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 743859Sml29623 DDI_SERVICE_UNAFFECTED}, 753859Sml29623 {NXGE_FM_EREPORT_FFLP_ACCESS_FAIL, "classifier_access_fail", 763859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 773859Sml29623 DDI_SERVICE_DEGRADED} 783859Sml29623 }; 793859Sml29623 803859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_ipp[] = { 813859Sml29623 {NXGE_FM_EREPORT_IPP_EOP_MISS, "rx_eop_miss", 823859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 833859Sml29623 DDI_SERVICE_LOST}, 843859Sml29623 {NXGE_FM_EREPORT_IPP_SOP_MISS, "rx_sop_miss", 853859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 863859Sml29623 DDI_SERVICE_LOST}, 873859Sml29623 {NXGE_FM_EREPORT_IPP_DFIFO_UE, "rx_dfifo_ucorr_err", 883859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 893859Sml29623 DDI_SERVICE_LOST}, 903859Sml29623 {NXGE_FM_EREPORT_IPP_DFIFO_CE, "rx_dfifo_corr_err", 913859Sml29623 DDI_FM_DEVICE_INTERN_CORR, 923859Sml29623 DDI_SERVICE_UNAFFECTED}, 933859Sml29623 {NXGE_FM_EREPORT_IPP_PFIFO_PERR, "rx_dfifo_parity_err", 943859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 953859Sml29623 DDI_SERVICE_LOST}, 963859Sml29623 {NXGE_FM_EREPORT_IPP_ECC_ERR_MAX, "rx_ecc_err_max", 973859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 983859Sml29623 DDI_SERVICE_UNAFFECTED}, 993859Sml29623 {NXGE_FM_EREPORT_IPP_PFIFO_OVER, "rx_pfifo_overflow", 1003859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1013859Sml29623 DDI_SERVICE_LOST}, 1023859Sml29623 {NXGE_FM_EREPORT_IPP_PFIFO_UND, "rx_pfifo_underrun", 1033859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1043859Sml29623 DDI_SERVICE_LOST}, 1053859Sml29623 {NXGE_FM_EREPORT_IPP_BAD_CS_MX, "rx_bad_cksum_max", 1063859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1073859Sml29623 DDI_SERVICE_UNAFFECTED}, 1083859Sml29623 {NXGE_FM_EREPORT_IPP_PKT_DIS_MX, "rx_pkt_discard_max", 1093859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1103859Sml29623 DDI_SERVICE_UNAFFECTED}, 1113859Sml29623 {NXGE_FM_EREPORT_IPP_RESET_FAIL, "rx_reset_fail", 1123859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 1133859Sml29623 DDI_SERVICE_LOST} 1143859Sml29623 }; 1153859Sml29623 1163859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_rdmc[] = { 1173859Sml29623 {NXGE_FM_EREPORT_RDMC_DCF_ERR, "rxdma_dcf_err", 1183859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1193859Sml29623 DDI_SERVICE_LOST}, 1203859Sml29623 {NXGE_FM_EREPORT_RDMC_RCR_ACK_ERR, "rxdma_rcr_ack_err", 1213859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1223859Sml29623 DDI_SERVICE_DEGRADED}, 1233859Sml29623 {NXGE_FM_EREPORT_RDMC_DC_FIFO_ERR, "rxdma_dc_fifo_err", 1243859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1253859Sml29623 DDI_SERVICE_LOST}, 1263859Sml29623 {NXGE_FM_EREPORT_RDMC_RCR_SHA_PAR, "rxdma_rcr_sha_par_err", 1273859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1283859Sml29623 DDI_SERVICE_DEGRADED}, 1293859Sml29623 {NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR, "rxdma_rbr_pre_par_err", 1303859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1313859Sml29623 DDI_SERVICE_DEGRADED}, 1323859Sml29623 {NXGE_FM_EREPORT_RDMC_RBR_TMOUT, "rxdma_rbr_tmout", 1333859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 1343859Sml29623 DDI_SERVICE_DEGRADED}, 1353859Sml29623 {NXGE_FM_EREPORT_RDMC_RSP_CNT_ERR, "rxdma_rsp_cnt_err", 1363859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1373859Sml29623 DDI_SERVICE_DEGRADED}, 1383859Sml29623 {NXGE_FM_EREPORT_RDMC_BYTE_EN_BUS, "rxdma_byte_en_bus", 1393859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1403859Sml29623 DDI_SERVICE_DEGRADED}, 1413859Sml29623 {NXGE_FM_EREPORT_RDMC_RSP_DAT_ERR, "rxdma_rsp_dat_err", 1423859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1433859Sml29623 DDI_SERVICE_DEGRADED}, 1443859Sml29623 {NXGE_FM_EREPORT_RDMC_ID_MISMATCH, "rxdma_id_mismatch", 1453859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1463859Sml29623 DDI_SERVICE_LOST}, 1473859Sml29623 {NXGE_FM_EREPORT_RDMC_ZCP_EOP_ERR, "rxdma_zcp_eop_err", 1483859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1493859Sml29623 DDI_SERVICE_LOST}, 1503859Sml29623 {NXGE_FM_EREPORT_RDMC_IPP_EOP_ERR, "rxdma_ipp_eop_err", 1513859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1523859Sml29623 DDI_SERVICE_LOST}, 1533859Sml29623 {NXGE_FM_EREPORT_RDMC_COMPLETION_ERR, "rxdma_completion_err", 1543859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1553859Sml29623 DDI_SERVICE_UNAFFECTED}, 1563859Sml29623 {NXGE_FM_EREPORT_RDMC_CONFIG_ERR, "rxdma_config_err", 1573859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1583859Sml29623 DDI_SERVICE_DEGRADED}, 1593859Sml29623 {NXGE_FM_EREPORT_RDMC_RCRINCON, "rxdma_rcrincon", 1603859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1613859Sml29623 DDI_SERVICE_DEGRADED}, 1623859Sml29623 {NXGE_FM_EREPORT_RDMC_RCRFULL, "rxdma_rcrfull", 1633859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1643859Sml29623 DDI_SERVICE_DEGRADED}, 1653859Sml29623 {NXGE_FM_EREPORT_RDMC_RBRFULL, "rxdma_rbrfull", 1663859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1673859Sml29623 DDI_SERVICE_DEGRADED}, 1683859Sml29623 {NXGE_FM_EREPORT_RDMC_RBRLOGPAGE, "rxdma_rbrlogpage", 1693859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1703859Sml29623 DDI_SERVICE_DEGRADED}, 1713859Sml29623 {NXGE_FM_EREPORT_RDMC_CFIGLOGPAGE, "rxdma_cfiglogpage", 1723859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1733859Sml29623 DDI_SERVICE_DEGRADED} 1743859Sml29623 }; 1753859Sml29623 1763859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_zcp[] = { 1773859Sml29623 {NXGE_FM_EREPORT_ZCP_RRFIFO_UNDERRUN, "rxzcopy_rrfifo_underrun", 1783859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1793859Sml29623 DDI_SERVICE_UNAFFECTED}, 1803859Sml29623 {NXGE_FM_EREPORT_ZCP_RSPFIFO_UNCORR_ERR, 1813859Sml29623 "rxzcopy_rspfifo_uncorr_err", 1823859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1833859Sml29623 DDI_SERVICE_UNAFFECTED}, 1843859Sml29623 {NXGE_FM_EREPORT_ZCP_STAT_TBL_PERR, "rxzcopy_stat_tbl_perr", 1853859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1863859Sml29623 DDI_SERVICE_UNAFFECTED}, 1873859Sml29623 {NXGE_FM_EREPORT_ZCP_DYN_TBL_PERR, "rxzcopy_dyn_tbl_perr", 1883859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1893859Sml29623 DDI_SERVICE_UNAFFECTED}, 1903859Sml29623 {NXGE_FM_EREPORT_ZCP_BUF_TBL_PERR, "rxzcopy_buf_tbl_perr", 1913859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 1923859Sml29623 DDI_SERVICE_UNAFFECTED}, 1933859Sml29623 {NXGE_FM_EREPORT_ZCP_CFIFO_ECC, "rxzcopy_cfifo_ecc", 1943859Sml29623 DDI_FM_DEVICE_INTERN_CORR, 1953859Sml29623 DDI_SERVICE_UNAFFECTED}, 1963859Sml29623 {NXGE_FM_EREPORT_ZCP_RRFIFO_OVERRUN, "rxzcopy_rrfifo_overrun", 1973859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 1983859Sml29623 DDI_SERVICE_UNAFFECTED}, 1993859Sml29623 {NXGE_FM_EREPORT_ZCP_BUFFER_OVERFLOW, "rxzcopy_buffer_overflow", 2003859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2013859Sml29623 DDI_SERVICE_LOST}, 2023859Sml29623 {NXGE_FM_EREPORT_ZCP_TT_PROGRAM_ERR, "rxzcopy_tt_program_err", 2033859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2043859Sml29623 DDI_SERVICE_UNAFFECTED}, 2053859Sml29623 {NXGE_FM_EREPORT_ZCP_RSP_TT_INDEX_ERR, "rxzcopy_rsp_tt_index_err", 2063859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2073859Sml29623 DDI_SERVICE_UNAFFECTED}, 2083859Sml29623 {NXGE_FM_EREPORT_ZCP_SLV_TT_INDEX_ERR, "rxzcopy_slv_tt_index_err", 2093859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2103859Sml29623 DDI_SERVICE_UNAFFECTED}, 2113859Sml29623 {NXGE_FM_EREPORT_ZCP_TT_INDEX_ERR, "rxzcopy_tt_index_err", 2123859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2133859Sml29623 DDI_SERVICE_UNAFFECTED}, 2143859Sml29623 {NXGE_FM_EREPORT_ZCP_ACCESS_FAIL, "rxzcopy_access_fail", 2153859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 2163859Sml29623 DDI_SERVICE_LOST}, 2173859Sml29623 }; 2183859Sml29623 2193859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_rxmac[] = { 2203859Sml29623 {NXGE_FM_EREPORT_RXMAC_UNDERFLOW, "rxmac_underflow", 2213859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2223859Sml29623 DDI_SERVICE_UNAFFECTED}, 2233859Sml29623 {NXGE_FM_EREPORT_RXMAC_CRC_ERRCNT_EXP, "rxmac_crc_errcnt_exp", 2243859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2253859Sml29623 DDI_SERVICE_UNAFFECTED}, 2263859Sml29623 {NXGE_FM_EREPORT_RXMAC_LENGTH_ERRCNT_EXP, 2273859Sml29623 "rxmac_length_errcnt_exp", 2283859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2293859Sml29623 DDI_SERVICE_UNAFFECTED}, 2303859Sml29623 {NXGE_FM_EREPORT_RXMAC_VIOL_ERRCNT_EXP, "rxmac_viol_errcnt_exp", 2313859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2323859Sml29623 DDI_SERVICE_UNAFFECTED}, 2333859Sml29623 {NXGE_FM_EREPORT_RXMAC_RXFRAG_CNT_EXP, "rxmac_rxfrag_cnt_exp", 2343859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2353859Sml29623 DDI_SERVICE_UNAFFECTED}, 2363859Sml29623 {NXGE_FM_EREPORT_RXMAC_ALIGN_ECNT_EXP, "rxmac_align_ecnt_exp", 2373859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2383859Sml29623 DDI_SERVICE_UNAFFECTED}, 2393859Sml29623 {NXGE_FM_EREPORT_RXMAC_LINKFAULT_CNT_EXP, 2403859Sml29623 "rxmac_linkfault_cnt_exp", 2413859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2423859Sml29623 DDI_SERVICE_UNAFFECTED}, 2433859Sml29623 {NXGE_FM_EREPORT_RXMAC_RESET_FAIL, "rxmac_reset_fail", 2443859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 2453859Sml29623 DDI_SERVICE_UNAFFECTED}, 2463859Sml29623 }; 2473859Sml29623 2483859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_tdmc[] = { 2493859Sml29623 {NXGE_FM_EREPORT_TDMC_PREF_BUF_PAR_ERR, "txdma_pref_buf_par_err", 2503859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2513859Sml29623 DDI_SERVICE_DEGRADED}, 2523859Sml29623 {NXGE_FM_EREPORT_TDMC_MBOX_ERR, "txdma_mbox_err", 2533859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 2543859Sml29623 DDI_SERVICE_DEGRADED}, 2553859Sml29623 {NXGE_FM_EREPORT_TDMC_NACK_PREF, "txdma_nack_pref", 2563859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 2573859Sml29623 DDI_SERVICE_DEGRADED}, 2583859Sml29623 {NXGE_FM_EREPORT_TDMC_NACK_PKT_RD, "txdma_nack_pkt_rd", 2593859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 2603859Sml29623 DDI_SERVICE_DEGRADED}, 2613859Sml29623 {NXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR, "txdma_pkt_size_err", 2623859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2633859Sml29623 DDI_SERVICE_DEGRADED}, 2643859Sml29623 {NXGE_FM_EREPORT_TDMC_TX_RING_OFLOW, "txdma_tx_ring_oflow", 2653859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2663859Sml29623 DDI_SERVICE_DEGRADED}, 2673859Sml29623 {NXGE_FM_EREPORT_TDMC_CONF_PART_ERR, "txdma_conf_part_err", 2683859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2693859Sml29623 DDI_SERVICE_DEGRADED}, 2703859Sml29623 {NXGE_FM_EREPORT_TDMC_PKT_PRT_ERR, "txdma_pkt_prt_err", 2713859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2723859Sml29623 DDI_SERVICE_DEGRADED}, 2733859Sml29623 {NXGE_FM_EREPORT_TDMC_RESET_FAIL, "txdma_reset_fail", 2743859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 2753859Sml29623 DDI_SERVICE_LOST}, 2763859Sml29623 }; 2773859Sml29623 2783859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_txc[] = { 2793859Sml29623 {NXGE_FM_EREPORT_TXC_RO_CORRECT_ERR, "tx_ro_correct_err", 2803859Sml29623 DDI_FM_DEVICE_INTERN_CORR, 2813859Sml29623 DDI_SERVICE_UNAFFECTED}, 2823859Sml29623 {NXGE_FM_EREPORT_TXC_RO_UNCORRECT_ERR, "tx_ro_uncorrect_err", 2833859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2843859Sml29623 DDI_SERVICE_UNAFFECTED}, 2853859Sml29623 {NXGE_FM_EREPORT_TXC_SF_CORRECT_ERR, "tx_sf_correct_err", 2863859Sml29623 DDI_FM_DEVICE_INTERN_CORR, 2873859Sml29623 DDI_SERVICE_UNAFFECTED}, 2883859Sml29623 {NXGE_FM_EREPORT_TXC_SF_UNCORRECT_ERR, "tx_sf_uncorrect_err", 2893859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2903859Sml29623 DDI_SERVICE_UNAFFECTED}, 2913859Sml29623 {NXGE_FM_EREPORT_TXC_ASSY_DEAD, "tx_assembly_uncorrect_err", 2923859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 2933859Sml29623 DDI_SERVICE_UNAFFECTED}, 2943859Sml29623 {NXGE_FM_EREPORT_TXC_REORDER_ERR, "tx_reorder_err", 2953859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 2963859Sml29623 DDI_SERVICE_LOST}, 2973859Sml29623 }; 2983859Sml29623 2993859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_txmac[] = { 3003859Sml29623 {NXGE_FM_EREPORT_TXMAC_UNDERFLOW, "txmac_underflow", 3013859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 3023859Sml29623 DDI_SERVICE_UNAFFECTED}, 3033859Sml29623 {NXGE_FM_EREPORT_TXMAC_OVERFLOW, "txmac_overflow", 3043859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 3053859Sml29623 DDI_SERVICE_UNAFFECTED}, 3063859Sml29623 {NXGE_FM_EREPORT_TXMAC_TXFIFO_XFR_ERR, "txmac_txfifo_xfr_err", 3073859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 3083859Sml29623 DDI_SERVICE_UNAFFECTED}, 3093859Sml29623 {NXGE_FM_EREPORT_TXMAC_MAX_PKT_ERR, "txmac_max_pkt_err", 3103859Sml29623 DDI_FM_DEVICE_INTERN_UNCORR, 3113859Sml29623 DDI_SERVICE_UNAFFECTED}, 3123859Sml29623 {NXGE_FM_EREPORT_TXMAC_RESET_FAIL, "txmac_reset_fail", 3133859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 3143859Sml29623 DDI_SERVICE_UNAFFECTED}, 3153859Sml29623 }; 3163859Sml29623 3173859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_espc[] = { 3183859Sml29623 {NXGE_FM_EREPORT_ESPC_ACCESS_FAIL, "eprom_access_fail", 3193859Sml29623 DDI_FM_DEVICE_NO_RESPONSE, 3203859Sml29623 DDI_SERVICE_LOST}, 3213859Sml29623 }; 3223859Sml29623 323*5060Syc148097 nxge_fm_ereport_attr_t nxge_fm_ereport_xaui[] = { 324*5060Syc148097 {NXGE_FM_EREPORT_XAUI_ERR, "xaui_bad_or_missing", 325*5060Syc148097 NXGE_FM_DEVICE_XAUI_ERR, 326*5060Syc148097 DDI_SERVICE_LOST}, 327*5060Syc148097 }; 328*5060Syc148097 329*5060Syc148097 nxge_fm_ereport_attr_t nxge_fm_ereport_xfp[] = { 330*5060Syc148097 {NXGE_FM_EREPORT_XFP_ERR, "xfp_bad_or_missing", 331*5060Syc148097 NXGE_FM_DEVICE_XFP_ERR, 332*5060Syc148097 DDI_SERVICE_LOST}, 333*5060Syc148097 }; 334*5060Syc148097 3353859Sml29623 nxge_fm_ereport_attr_t nxge_fm_ereport_sw[] = { 3363859Sml29623 {NXGE_FM_EREPORT_SW_INVALID_PORT_NUM, "invalid_port_num", 3373859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 3383859Sml29623 DDI_SERVICE_LOST}, 3393859Sml29623 {NXGE_FM_EREPORT_SW_INVALID_CHAN_NUM, "invalid_chan_num", 3403859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 3413859Sml29623 DDI_SERVICE_LOST}, 3423859Sml29623 {NXGE_FM_EREPORT_SW_INVALID_PARAM, "invalid_param", 3433859Sml29623 DDI_FM_DEVICE_INVAL_STATE, 3443859Sml29623 DDI_SERVICE_LOST}, 3453859Sml29623 }; 3463859Sml29623 3473859Sml29623 void 3483859Sml29623 nxge_fm_init(p_nxge_t nxgep, ddi_device_acc_attr_t *reg_attr, 349*5060Syc148097 ddi_device_acc_attr_t *desc_attr, ddi_dma_attr_t *dma_attr) 3503859Sml29623 { 3513859Sml29623 ddi_iblock_cookie_t iblk; 3523859Sml29623 353*5060Syc148097 /* 354*5060Syc148097 * fm-capable in nxge.conf can be used to set fm_capabilities. 355*5060Syc148097 * If fm-capable is not defined, then the last argument passed to 356*5060Syc148097 * ddi_prop_get_int will be returned as the capabilities. 357*5060Syc148097 */ 3583859Sml29623 nxgep->fm_capabilities = ddi_prop_get_int(DDI_DEV_T_ANY, nxgep->dip, 359*5060Syc148097 DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "fm-capable", 360*5060Syc148097 DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE); 361*5060Syc148097 3623859Sml29623 NXGE_DEBUG_MSG((nxgep, DDI_CTL, 3633859Sml29623 "FM capable = %d\n", nxgep->fm_capabilities)); 3643859Sml29623 365*5060Syc148097 /* 366*5060Syc148097 * Register capabilities with IO Fault Services. The capabilities 367*5060Syc148097 * set above may not be supported by the parent nexus, in that case 368*5060Syc148097 * some capability bits may be cleared. 369*5060Syc148097 */ 370*5060Syc148097 if (nxgep->fm_capabilities) 3713859Sml29623 ddi_fm_init(nxgep->dip, &nxgep->fm_capabilities, &iblk); 3723859Sml29623 373*5060Syc148097 /* 374*5060Syc148097 * Initialize pci ereport capabilities if ereport capable 375*5060Syc148097 */ 376*5060Syc148097 if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities) || 377*5060Syc148097 DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) { 378*5060Syc148097 pci_ereport_setup(nxgep->dip); 379*5060Syc148097 } 380*5060Syc148097 381*5060Syc148097 /* Register error callback if error callback capable */ 382*5060Syc148097 if (DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) { 383*5060Syc148097 ddi_fm_handler_register(nxgep->dip, 384*5060Syc148097 nxge_fm_error_cb, (void*) nxgep); 385*5060Syc148097 } 386*5060Syc148097 387*5060Syc148097 /* 388*5060Syc148097 * DDI_FLGERR_ACC indicates: 389*5060Syc148097 * o Driver will check its access handle(s) for faults on 390*5060Syc148097 * a regular basis by calling ddi_fm_acc_err_get 391*5060Syc148097 * o Driver is able to cope with incorrect results of I/O 392*5060Syc148097 * operations resulted from an I/O fault 393*5060Syc148097 */ 394*5060Syc148097 if (DDI_FM_ACC_ERR_CAP(nxgep->fm_capabilities)) { 395*5060Syc148097 reg_attr->devacc_attr_access = DDI_FLAGERR_ACC; 396*5060Syc148097 desc_attr->devacc_attr_access = DDI_FLAGERR_ACC; 3973859Sml29623 } else { 398*5060Syc148097 reg_attr->devacc_attr_access = DDI_DEFAULT_ACC; 3993859Sml29623 desc_attr->devacc_attr_access = DDI_DEFAULT_ACC; 400*5060Syc148097 } 401*5060Syc148097 402*5060Syc148097 /* 403*5060Syc148097 * DDI_DMA_FLAGERR indicates: 404*5060Syc148097 * o Driver will check its DMA handle(s) for faults on a 405*5060Syc148097 * regular basis using ddi_fm_dma_err_get 406*5060Syc148097 * o Driver is able to cope with incorrect results of DMA 407*5060Syc148097 * operations resulted from an I/O fault 408*5060Syc148097 */ 409*5060Syc148097 if (DDI_FM_DMA_ERR_CAP(nxgep->fm_capabilities)) 410*5060Syc148097 dma_attr->dma_attr_flags |= DDI_DMA_FLAGERR; 411*5060Syc148097 else 4124439Sml29623 dma_attr->dma_attr_flags &= ~DDI_DMA_FLAGERR; 413*5060Syc148097 4143859Sml29623 } 4153859Sml29623 4163859Sml29623 void 4173859Sml29623 nxge_fm_fini(p_nxge_t nxgep) 4183859Sml29623 { 4193859Sml29623 /* Only unregister FMA capabilities if we registered some */ 4203859Sml29623 if (nxgep->fm_capabilities) { 4213859Sml29623 4223859Sml29623 /* 4233859Sml29623 * Release any resources allocated by pci_ereport_setup() 4243859Sml29623 */ 4253859Sml29623 if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities) || 4263859Sml29623 DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) 4273859Sml29623 pci_ereport_teardown(nxgep->dip); 4283859Sml29623 4293859Sml29623 /* 4303859Sml29623 * Un-register error callback if error callback capable 4313859Sml29623 */ 4323859Sml29623 if (DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) 4333859Sml29623 ddi_fm_handler_unregister(nxgep->dip); 4343859Sml29623 4353859Sml29623 /* Unregister from IO Fault Services */ 4363859Sml29623 ddi_fm_fini(nxgep->dip); 4373859Sml29623 } 4383859Sml29623 } 4393859Sml29623 440*5060Syc148097 /*ARGSUSED*/ 441*5060Syc148097 /* 442*5060Syc148097 * Simply call pci_ereport_post which generates ereports for errors 443*5060Syc148097 * that occur in the PCI local bus configuration status registers. 444*5060Syc148097 */ 445*5060Syc148097 static int 446*5060Syc148097 nxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, 447*5060Syc148097 const void *impl_data) 4483859Sml29623 { 449*5060Syc148097 pci_ereport_post(dip, err, NULL); 450*5060Syc148097 return (err->fme_status); 451*5060Syc148097 } 4523859Sml29623 4533859Sml29623 4543859Sml29623 static nxge_fm_ereport_attr_t * 4553859Sml29623 nxge_fm_get_ereport_attr(nxge_fm_ereport_id_t ereport_id) 4563859Sml29623 { 4573859Sml29623 nxge_fm_ereport_attr_t *attr; 458*5060Syc148097 uint8_t blk_id = (ereport_id >> EREPORT_FM_ID_SHIFT) & 459*5060Syc148097 EREPORT_FM_ID_MASK; 460*5060Syc148097 uint8_t index = ereport_id & EREPORT_INDEX_MASK; 4613859Sml29623 4623859Sml29623 switch (blk_id) { 4633859Sml29623 case FM_SW_ID: 4643859Sml29623 attr = &nxge_fm_ereport_sw[index]; 4653859Sml29623 break; 4663859Sml29623 case FM_PCS_ID: 4673859Sml29623 attr = &nxge_fm_ereport_pcs[index]; 4683859Sml29623 break; 4693859Sml29623 case FM_TXMAC_ID: 4703859Sml29623 attr = &nxge_fm_ereport_txmac[index]; 4713859Sml29623 break; 4723859Sml29623 case FM_RXMAC_ID: 4733859Sml29623 attr = &nxge_fm_ereport_rxmac[index]; 4743859Sml29623 break; 4753859Sml29623 case FM_MIF_ID: 4763859Sml29623 attr = &nxge_fm_ereport_mif[index]; 4773859Sml29623 break; 4783859Sml29623 case FM_FFLP_ID: 4793859Sml29623 attr = &nxge_fm_ereport_fflp[index]; 4803859Sml29623 break; 4813859Sml29623 case FM_ZCP_ID: 4823859Sml29623 attr = &nxge_fm_ereport_zcp[index]; 4833859Sml29623 break; 4843859Sml29623 case FM_RXDMA_ID: 4853859Sml29623 attr = &nxge_fm_ereport_rdmc[index]; 4863859Sml29623 break; 4873859Sml29623 case FM_TXDMA_ID: 4883859Sml29623 attr = &nxge_fm_ereport_tdmc[index]; 4893859Sml29623 break; 4903859Sml29623 case FM_IPP_ID: 4913859Sml29623 attr = &nxge_fm_ereport_ipp[index]; 4923859Sml29623 break; 4933859Sml29623 case FM_TXC_ID: 4943859Sml29623 attr = &nxge_fm_ereport_txc[index]; 4953859Sml29623 break; 4963859Sml29623 case FM_ESPC_ID: 4973859Sml29623 attr = &nxge_fm_ereport_espc[index]; 4983859Sml29623 break; 499*5060Syc148097 case FM_XAUI_ID: 500*5060Syc148097 attr = &nxge_fm_ereport_xaui[index]; 501*5060Syc148097 break; 502*5060Syc148097 case FM_XFP_ID: 503*5060Syc148097 attr = &nxge_fm_ereport_xfp[index]; 504*5060Syc148097 break; 5053859Sml29623 default: 5063859Sml29623 attr = NULL; 5073859Sml29623 } 5083859Sml29623 5093859Sml29623 return (attr); 5103859Sml29623 } 5113859Sml29623 5123859Sml29623 static void 5133859Sml29623 nxge_fm_ereport(p_nxge_t nxgep, uint8_t err_portn, uint8_t err_chan, 5143859Sml29623 nxge_fm_ereport_attr_t *ereport) 5153859Sml29623 { 5163859Sml29623 uint64_t ena; 5173859Sml29623 char eclass[FM_MAX_CLASS]; 5183859Sml29623 char *err_str; 5193859Sml29623 p_nxge_stats_t statsp; 5203859Sml29623 5213859Sml29623 (void) snprintf(eclass, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, 5223859Sml29623 ereport->eclass); 5233859Sml29623 err_str = ereport->str; 5243859Sml29623 ena = fm_ena_generate(0, FM_ENA_FMT1); 5253859Sml29623 statsp = nxgep->statsp; 5263859Sml29623 5273859Sml29623 if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities)) { 5283859Sml29623 switch (ereport->index) { 5293859Sml29623 case NXGE_FM_EREPORT_XPCS_LINK_DOWN: 5303859Sml29623 case NXGE_FM_EREPORT_XPCS_TX_LINK_FAULT: 5313859Sml29623 case NXGE_FM_EREPORT_XPCS_RX_LINK_FAULT: 5323859Sml29623 case NXGE_FM_EREPORT_PCS_LINK_DOWN: 5333859Sml29623 case NXGE_FM_EREPORT_PCS_REMOTE_FAULT: 5343859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 535*5060Syc148097 DDI_NOSLEEP, 536*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 537*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 538*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 539*5060Syc148097 NULL); 5403859Sml29623 break; 5413859Sml29623 case NXGE_FM_EREPORT_IPP_EOP_MISS: 5423859Sml29623 case NXGE_FM_EREPORT_IPP_SOP_MISS: 5433859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 544*5060Syc148097 DDI_NOSLEEP, 545*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 546*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 547*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 548*5060Syc148097 ERNAME_DFIFO_RD_PTR, DATA_TYPE_UINT16, 549*5060Syc148097 statsp->ipp_stats.errlog.dfifo_rd_ptr, 550*5060Syc148097 ERNAME_IPP_STATE_MACH, DATA_TYPE_UINT32, 551*5060Syc148097 statsp->ipp_stats.errlog.state_mach, 552*5060Syc148097 NULL); 5533859Sml29623 break; 5543859Sml29623 case NXGE_FM_EREPORT_IPP_DFIFO_UE: 5553859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 556*5060Syc148097 DDI_NOSLEEP, 557*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 558*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 559*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 560*5060Syc148097 ERNAME_DFIFO_ENTRY, DATA_TYPE_UINT16, 561*5060Syc148097 nxgep->ipp.status.bits.w0.dfifo_ecc_err_idx, 562*5060Syc148097 ERNAME_DFIFO_SYNDROME, DATA_TYPE_UINT16, 563*5060Syc148097 statsp->ipp_stats.errlog.ecc_syndrome, 564*5060Syc148097 NULL); 5653859Sml29623 break; 5663859Sml29623 case NXGE_FM_EREPORT_IPP_PFIFO_PERR: 5673859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 568*5060Syc148097 DDI_NOSLEEP, 569*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 570*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 571*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 572*5060Syc148097 ERNAME_PFIFO_ENTRY, DATA_TYPE_UINT8, 573*5060Syc148097 nxgep->ipp.status.bits.w0.pre_fifo_perr_idx, 574*5060Syc148097 NULL); 5753859Sml29623 break; 5763859Sml29623 case NXGE_FM_EREPORT_IPP_DFIFO_CE: 5773859Sml29623 case NXGE_FM_EREPORT_IPP_ECC_ERR_MAX: 5783859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 579*5060Syc148097 DDI_NOSLEEP, 580*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 581*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 582*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 583*5060Syc148097 NULL); 5843859Sml29623 break; 5853859Sml29623 case NXGE_FM_EREPORT_IPP_PFIFO_OVER: 5863859Sml29623 case NXGE_FM_EREPORT_IPP_PFIFO_UND: 5873859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 588*5060Syc148097 DDI_NOSLEEP, 589*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 590*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 591*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 592*5060Syc148097 ERNAME_IPP_STATE_MACH, DATA_TYPE_UINT32, 593*5060Syc148097 statsp->ipp_stats.errlog.state_mach, 594*5060Syc148097 NULL); 5953859Sml29623 break; 5963859Sml29623 case NXGE_FM_EREPORT_IPP_BAD_CS_MX: 5973859Sml29623 case NXGE_FM_EREPORT_IPP_PKT_DIS_MX: 5983859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 599*5060Syc148097 DDI_NOSLEEP, 600*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 601*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 602*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 603*5060Syc148097 NULL); 6043859Sml29623 break; 6053859Sml29623 case NXGE_FM_EREPORT_FFLP_TCAM_ERR: 6063859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 607*5060Syc148097 DDI_NOSLEEP, 608*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 609*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 610*5060Syc148097 ERNAME_TCAM_ERR_LOG, DATA_TYPE_UINT32, 611*5060Syc148097 statsp->fflp_stats.errlog.tcam, 612*5060Syc148097 NULL); 6133859Sml29623 break; 6143859Sml29623 case NXGE_FM_EREPORT_FFLP_VLAN_PAR_ERR: 6153859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 616*5060Syc148097 DDI_NOSLEEP, 617*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 618*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 619*5060Syc148097 ERNAME_VLANTAB_ERR_LOG, DATA_TYPE_UINT32, 620*5060Syc148097 statsp->fflp_stats.errlog.vlan, 621*5060Syc148097 NULL); 6223859Sml29623 break; 6233859Sml29623 case NXGE_FM_EREPORT_FFLP_HASHT_DATA_ERR: 6243859Sml29623 { 6253859Sml29623 int rdc_grp; 6263859Sml29623 hash_tbl_data_log_t hash_log; 6273859Sml29623 6283859Sml29623 for (rdc_grp = 0; rdc_grp < MAX_PARTITION; rdc_grp++) { 6293859Sml29623 hash_log.value = nxgep->classifier.fflp_stats-> 6303859Sml29623 errlog.hash_pio[rdc_grp]; 6313859Sml29623 if (hash_log.bits.ldw.pio_err) { 6323859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, 6333859Sml29623 ena, DDI_NOSLEEP, 6343859Sml29623 FM_VERSION, DATA_TYPE_UINT8, 6353859Sml29623 FM_EREPORT_VERS0, 636*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, 637*5060Syc148097 DATA_TYPE_STRING, err_str, 6383859Sml29623 ERNAME_HASHTAB_ERR_LOG, 6393859Sml29623 DATA_TYPE_UINT32, 6403859Sml29623 nxgep->classifier.fflp_stats-> 6413859Sml29623 errlog.hash_pio[rdc_grp], NULL); 6423859Sml29623 } 6433859Sml29623 } 6443859Sml29623 } 6453859Sml29623 break; 6463859Sml29623 case NXGE_FM_EREPORT_FFLP_HASHT_LOOKUP_ERR: 6473859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 648*5060Syc148097 DDI_NOSLEEP, 649*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 650*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 651*5060Syc148097 ERNAME_HASHT_LOOKUP_ERR_LOG0, DATA_TYPE_UINT32, 652*5060Syc148097 statsp->fflp_stats.errlog. hash_lookup1, 653*5060Syc148097 ERNAME_HASHT_LOOKUP_ERR_LOG1, DATA_TYPE_UINT32, 654*5060Syc148097 statsp->fflp_stats.errlog.hash_lookup2, 655*5060Syc148097 NULL); 6563859Sml29623 break; 6573859Sml29623 case NXGE_FM_EREPORT_RDMC_DCF_ERR: 6583859Sml29623 case NXGE_FM_EREPORT_RDMC_RBR_TMOUT: 6593859Sml29623 case NXGE_FM_EREPORT_RDMC_RSP_CNT_ERR: 6603859Sml29623 case NXGE_FM_EREPORT_RDMC_BYTE_EN_BUS: 6613859Sml29623 case NXGE_FM_EREPORT_RDMC_RSP_DAT_ERR: 6623859Sml29623 case NXGE_FM_EREPORT_RDMC_RCR_ACK_ERR: 6633859Sml29623 case NXGE_FM_EREPORT_RDMC_DC_FIFO_ERR: 6643859Sml29623 case NXGE_FM_EREPORT_RDMC_CONFIG_ERR: 6653859Sml29623 case NXGE_FM_EREPORT_RDMC_RCRINCON: 6663859Sml29623 case NXGE_FM_EREPORT_RDMC_RCRFULL: 6673859Sml29623 case NXGE_FM_EREPORT_RDMC_RBRFULL: 6683859Sml29623 case NXGE_FM_EREPORT_RDMC_RBRLOGPAGE: 6693859Sml29623 case NXGE_FM_EREPORT_RDMC_CFIGLOGPAGE: 6703859Sml29623 case NXGE_FM_EREPORT_RDMC_ID_MISMATCH: 6713859Sml29623 case NXGE_FM_EREPORT_RDMC_ZCP_EOP_ERR: 6723859Sml29623 case NXGE_FM_EREPORT_RDMC_IPP_EOP_ERR: 6733859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 674*5060Syc148097 DDI_NOSLEEP, 675*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 676*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 677*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 678*5060Syc148097 ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, 679*5060Syc148097 NULL); 6803859Sml29623 break; 6813859Sml29623 case NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR: 6823859Sml29623 case NXGE_FM_EREPORT_RDMC_RCR_SHA_PAR: 6833859Sml29623 { 6843859Sml29623 uint32_t err_log; 6853859Sml29623 if (ereport->index == NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR) 6863859Sml29623 err_log = (uint32_t)statsp-> 6873859Sml29623 rdc_stats[err_chan].errlog.pre_par.value; 6883859Sml29623 else 6893859Sml29623 err_log = (uint32_t)statsp-> 6903859Sml29623 rdc_stats[err_chan].errlog.sha_par.value; 6913859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 692*5060Syc148097 DDI_NOSLEEP, 693*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 694*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 695*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 696*5060Syc148097 ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, 697*5060Syc148097 ERNAME_RDMC_PAR_ERR_LOG, DATA_TYPE_UINT8, err_log, 698*5060Syc148097 NULL); 6993859Sml29623 } 7003859Sml29623 break; 7013859Sml29623 case NXGE_FM_EREPORT_RDMC_COMPLETION_ERR: 7023859Sml29623 { 7033859Sml29623 uint8_t err_type; 7043859Sml29623 err_type = statsp-> 7053859Sml29623 rdc_stats[err_chan].errlog.compl_err_type; 7063859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 707*5060Syc148097 DDI_NOSLEEP, 708*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 709*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 710*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 711*5060Syc148097 ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, 712*5060Syc148097 ERNAME_RDC_ERR_TYPE, DATA_TYPE_UINT8, err_type, 713*5060Syc148097 NULL); 7143859Sml29623 } 7153859Sml29623 break; 7163859Sml29623 7173859Sml29623 case NXGE_FM_EREPORT_ZCP_RRFIFO_UNDERRUN: 7183859Sml29623 case NXGE_FM_EREPORT_ZCP_RRFIFO_OVERRUN: 7193859Sml29623 case NXGE_FM_EREPORT_ZCP_BUFFER_OVERFLOW: 7203859Sml29623 { 7213859Sml29623 uint32_t sm; 7223859Sml29623 sm = statsp-> 7233859Sml29623 zcp_stats.errlog.state_mach.bits.ldw.state; 7243859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 725*5060Syc148097 DDI_NOSLEEP, 726*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 727*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 728*5060Syc148097 sm, DATA_TYPE_UINT32, 729*5060Syc148097 NULL); 7303859Sml29623 break; 7313859Sml29623 } 7323859Sml29623 case NXGE_FM_EREPORT_ZCP_CFIFO_ECC: 7333859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 734*5060Syc148097 DDI_NOSLEEP, 735*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 736*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 737*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 738*5060Syc148097 NULL); 7393859Sml29623 break; 7403859Sml29623 case NXGE_FM_EREPORT_ZCP_RSPFIFO_UNCORR_ERR: 7413859Sml29623 case NXGE_FM_EREPORT_ZCP_STAT_TBL_PERR: 7423859Sml29623 case NXGE_FM_EREPORT_ZCP_DYN_TBL_PERR: 7433859Sml29623 case NXGE_FM_EREPORT_ZCP_BUF_TBL_PERR: 7443859Sml29623 case NXGE_FM_EREPORT_ZCP_TT_PROGRAM_ERR: 7453859Sml29623 case NXGE_FM_EREPORT_ZCP_RSP_TT_INDEX_ERR: 7463859Sml29623 case NXGE_FM_EREPORT_ZCP_SLV_TT_INDEX_ERR: 7473859Sml29623 case NXGE_FM_EREPORT_ZCP_TT_INDEX_ERR: 7483859Sml29623 case NXGE_FM_EREPORT_RXMAC_UNDERFLOW: 7493859Sml29623 case NXGE_FM_EREPORT_RXMAC_CRC_ERRCNT_EXP: 7503859Sml29623 case NXGE_FM_EREPORT_RXMAC_LENGTH_ERRCNT_EXP: 7513859Sml29623 case NXGE_FM_EREPORT_RXMAC_VIOL_ERRCNT_EXP: 7523859Sml29623 case NXGE_FM_EREPORT_RXMAC_RXFRAG_CNT_EXP: 7533859Sml29623 case NXGE_FM_EREPORT_RXMAC_LINKFAULT_CNT_EXP: 7543859Sml29623 case NXGE_FM_EREPORT_RXMAC_ALIGN_ECNT_EXP: 7553859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 756*5060Syc148097 DDI_NOSLEEP, 757*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 758*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 759*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 760*5060Syc148097 NULL); 7613859Sml29623 break; 7623859Sml29623 case NXGE_FM_EREPORT_TDMC_MBOX_ERR: 7633859Sml29623 case NXGE_FM_EREPORT_TDMC_TX_RING_OFLOW: 7643859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 765*5060Syc148097 DDI_NOSLEEP, 766*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 767*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 768*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 769*5060Syc148097 ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, 770*5060Syc148097 NULL); 7713859Sml29623 break; 7723859Sml29623 case NXGE_FM_EREPORT_TDMC_PREF_BUF_PAR_ERR: 7733859Sml29623 case NXGE_FM_EREPORT_TDMC_NACK_PREF: 7743859Sml29623 case NXGE_FM_EREPORT_TDMC_NACK_PKT_RD: 7753859Sml29623 case NXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR: 7763859Sml29623 case NXGE_FM_EREPORT_TDMC_CONF_PART_ERR: 7773859Sml29623 case NXGE_FM_EREPORT_TDMC_PKT_PRT_ERR: 7783859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 779*5060Syc148097 DDI_NOSLEEP, 780*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 781*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 782*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 783*5060Syc148097 ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, 784*5060Syc148097 ERNAME_TDMC_ERR_LOG1, DATA_TYPE_UINT32, 785*5060Syc148097 statsp->tdc_stats[err_chan].errlog.logl.value, 786*5060Syc148097 ERNAME_TDMC_ERR_LOG1, DATA_TYPE_UINT32, 787*5060Syc148097 statsp->tdc_stats[err_chan].errlog.logh.value, 788*5060Syc148097 DATA_TYPE_UINT32, 789*5060Syc148097 NULL); 7903859Sml29623 break; 7913859Sml29623 case NXGE_FM_EREPORT_TXC_RO_CORRECT_ERR: 7923859Sml29623 case NXGE_FM_EREPORT_TXC_RO_UNCORRECT_ERR: 7933859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 794*5060Syc148097 DDI_NOSLEEP, 795*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 796*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 797*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 798*5060Syc148097 ERNAME_TXC_ROECC_ADDR, DATA_TYPE_UINT16, 799*5060Syc148097 statsp->txc_stats.errlog.ro_st.roecc. 800*5060Syc148097 bits.ldw.ecc_address, 801*5060Syc148097 ERNAME_TXC_ROECC_DATA0, DATA_TYPE_UINT32, 802*5060Syc148097 statsp->txc_stats.errlog.ro_st.d0. 803*5060Syc148097 bits.ldw.ro_ecc_data0, 804*5060Syc148097 ERNAME_TXC_ROECC_DATA1, DATA_TYPE_UINT32, 805*5060Syc148097 statsp->txc_stats.errlog.ro_st.d1. 806*5060Syc148097 bits.ldw.ro_ecc_data1, 807*5060Syc148097 ERNAME_TXC_ROECC_DATA2, DATA_TYPE_UINT32, 808*5060Syc148097 statsp->txc_stats.errlog.ro_st.d2. 809*5060Syc148097 bits.ldw.ro_ecc_data2, 810*5060Syc148097 ERNAME_TXC_ROECC_DATA3, DATA_TYPE_UINT32, 811*5060Syc148097 statsp->txc_stats.errlog.ro_st.d3. 812*5060Syc148097 bits.ldw.ro_ecc_data3, 813*5060Syc148097 ERNAME_TXC_ROECC_DATA4, DATA_TYPE_UINT32, 814*5060Syc148097 statsp->txc_stats.errlog.ro_st.d4. 815*5060Syc148097 bits.ldw.ro_ecc_data4, 816*5060Syc148097 NULL); 8173859Sml29623 break; 8183859Sml29623 case NXGE_FM_EREPORT_TXC_REORDER_ERR: 8193859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 820*5060Syc148097 DDI_NOSLEEP, 821*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 822*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 823*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 824*5060Syc148097 ERNAME_TXC_RO_STATE0, DATA_TYPE_UINT32, 825*5060Syc148097 (uint32_t)statsp->txc_stats.errlog.ro_st.st0.value, 826*5060Syc148097 ERNAME_TXC_RO_STATE1, DATA_TYPE_UINT32, 827*5060Syc148097 (uint32_t)statsp->txc_stats.errlog.ro_st.st1.value, 828*5060Syc148097 ERNAME_TXC_RO_STATE2, DATA_TYPE_UINT32, 829*5060Syc148097 (uint32_t)statsp->txc_stats.errlog.ro_st.st2.value, 830*5060Syc148097 ERNAME_TXC_RO_STATE3, DATA_TYPE_UINT32, 831*5060Syc148097 (uint32_t)statsp->txc_stats.errlog.ro_st.st3.value, 832*5060Syc148097 ERNAME_TXC_RO_STATE_CTL, DATA_TYPE_UINT32, 833*5060Syc148097 (uint32_t)statsp->txc_stats.errlog.ro_st.ctl.value, 834*5060Syc148097 ERNAME_TXC_RO_TIDS, DATA_TYPE_UINT32, 835*5060Syc148097 (uint32_t)statsp->txc_stats.errlog.ro_st.tids.value, 836*5060Syc148097 NULL); 8373859Sml29623 break; 8383859Sml29623 case NXGE_FM_EREPORT_TXC_SF_CORRECT_ERR: 8393859Sml29623 case NXGE_FM_EREPORT_TXC_SF_UNCORRECT_ERR: 8403859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 841*5060Syc148097 DDI_NOSLEEP, 842*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 843*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 844*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 845*5060Syc148097 ERNAME_TXC_SFECC_ADDR, DATA_TYPE_UINT32, 846*5060Syc148097 statsp->txc_stats.errlog.sf_st.sfecc. 847*5060Syc148097 bits.ldw.ecc_address, 848*5060Syc148097 ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, 849*5060Syc148097 statsp->txc_stats.errlog.sf_st.d0. 850*5060Syc148097 bits.ldw.sf_ecc_data0, 851*5060Syc148097 ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, 852*5060Syc148097 statsp->txc_stats.errlog.sf_st.d1. 853*5060Syc148097 bits.ldw.sf_ecc_data1, 854*5060Syc148097 ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, 855*5060Syc148097 statsp->txc_stats.errlog.sf_st.d2. 856*5060Syc148097 bits.ldw.sf_ecc_data2, 857*5060Syc148097 ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, 858*5060Syc148097 statsp->txc_stats.errlog.sf_st.d3. 859*5060Syc148097 bits.ldw.sf_ecc_data3, 860*5060Syc148097 ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, 861*5060Syc148097 statsp->txc_stats.errlog.sf_st.d4. 862*5060Syc148097 bits.ldw.sf_ecc_data4, 863*5060Syc148097 NULL); 8643859Sml29623 break; 8653859Sml29623 case NXGE_FM_EREPORT_TXMAC_UNDERFLOW: 8663859Sml29623 case NXGE_FM_EREPORT_TXMAC_OVERFLOW: 8673859Sml29623 case NXGE_FM_EREPORT_TXMAC_TXFIFO_XFR_ERR: 8683859Sml29623 case NXGE_FM_EREPORT_TXMAC_MAX_PKT_ERR: 869*5060Syc148097 case NXGE_FM_EREPORT_XAUI_ERR: 870*5060Syc148097 case NXGE_FM_EREPORT_XFP_ERR: 8713859Sml29623 case NXGE_FM_EREPORT_SW_INVALID_PORT_NUM: 8723859Sml29623 case NXGE_FM_EREPORT_SW_INVALID_CHAN_NUM: 8733859Sml29623 case NXGE_FM_EREPORT_SW_INVALID_PARAM: 8743859Sml29623 ddi_fm_ereport_post(nxgep->dip, eclass, ena, 875*5060Syc148097 DDI_NOSLEEP, 876*5060Syc148097 FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, 877*5060Syc148097 ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, 878*5060Syc148097 ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, 879*5060Syc148097 NULL); 8803859Sml29623 break; 8813859Sml29623 } 8823859Sml29623 8833859Sml29623 } 8843859Sml29623 } 8853859Sml29623 8863859Sml29623 void 8873859Sml29623 nxge_fm_report_error(p_nxge_t nxgep, uint8_t err_portn, uint8_t err_chan, 8883859Sml29623 nxge_fm_ereport_id_t fm_ereport_id) 8893859Sml29623 { 890*5060Syc148097 nxge_fm_ereport_attr_t *fm_ereport_attr; 8913859Sml29623 8923859Sml29623 fm_ereport_attr = nxge_fm_get_ereport_attr(fm_ereport_id); 8933859Sml29623 if (fm_ereport_attr != NULL) { 8943859Sml29623 nxge_fm_ereport(nxgep, err_portn, err_chan, fm_ereport_attr); 8953859Sml29623 ddi_fm_service_impact(nxgep->dip, fm_ereport_attr->impact); 8963859Sml29623 } 8973859Sml29623 } 8983859Sml29623 8993859Sml29623 int 9003859Sml29623 fm_check_acc_handle(ddi_acc_handle_t handle) 9013859Sml29623 { 9023859Sml29623 ddi_fm_error_t err; 9033859Sml29623 9043859Sml29623 ddi_fm_acc_err_get(handle, &err, DDI_FME_VERSION); 9053859Sml29623 #ifndef NXGE_FM_S10 9063859Sml29623 ddi_fm_acc_err_clear(handle, DDI_FME_VERSION); 9073859Sml29623 #endif 9083859Sml29623 return (err.fme_status); 9093859Sml29623 } 9103859Sml29623 9113859Sml29623 int 9123859Sml29623 fm_check_dma_handle(ddi_dma_handle_t handle) 9133859Sml29623 { 9143859Sml29623 ddi_fm_error_t err; 9153859Sml29623 9163859Sml29623 ddi_fm_dma_err_get(handle, &err, DDI_FME_VERSION); 9173859Sml29623 return (err.fme_status); 9183859Sml29623 } 919