girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 1 | /* |
| 2 | * CDDL HEADER START |
| 3 | * |
| 4 | * The contents of this file are subject to the terms of the |
| 5 | * Common Development and Distribution License (the "License"). |
| 6 | * You may not use this file except in compliance with the License. |
| 7 | * |
| 8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE |
| 9 | * or http://www.opensolaris.org/os/licensing. |
| 10 | * See the License for the specific language governing permissions |
| 11 | * and limitations under the License. |
| 12 | * |
| 13 | * When distributing Covered Code, include this CDDL HEADER in each |
| 14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. |
| 15 | * If applicable, add the following below this CDDL HEADER, with the |
| 16 | * fields enclosed by brackets "[]" replaced with your own identifying |
| 17 | * information: Portions Copyright [yyyy] [name of copyright owner] |
| 18 | * |
| 19 | * CDDL HEADER END |
| 20 | */ |
| 21 | /* |
Stephen Hanson | 837c1ac | 2009-12-03 04:39:22 -0800 | [diff] [blame] | 22 | * Copyright 2009 Sun Microsystems, Inc. All rights reserved. |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 23 | * Use is subject to license terms. |
| 24 | */ |
| 25 | |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 26 | #include <sys/nxge/nxge_impl.h> |
speer | 678453a | 2008-04-27 19:50:44 -0700 | [diff] [blame] | 27 | #include <sys/nxge/nxge_hio.h> |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 28 | #include <sys/ddifm.h> |
| 29 | #include <sys/fm/protocol.h> |
| 30 | #include <sys/fm/util.h> |
| 31 | #include <sys/fm/io/ddi.h> |
| 32 | |
| 33 | static nxge_fm_ereport_attr_t |
| 34 | *nxge_fm_get_ereport_attr(nxge_fm_ereport_id_t); |
| 35 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 36 | static int |
| 37 | nxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data); |
| 38 | |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 39 | nxge_fm_ereport_attr_t nxge_fm_ereport_pcs[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 40 | {NXGE_FM_EREPORT_XPCS_LINK_DOWN, "10g_link_down", |
| 41 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 42 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 43 | {NXGE_FM_EREPORT_XPCS_TX_LINK_FAULT, "10g_tx_link_fault", |
| 44 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 45 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 46 | {NXGE_FM_EREPORT_XPCS_RX_LINK_FAULT, "10g_rx_link_fault", |
| 47 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 48 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 49 | {NXGE_FM_EREPORT_PCS_LINK_DOWN, "1g_link_down", |
| 50 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 51 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 52 | {NXGE_FM_EREPORT_PCS_REMOTE_FAULT, "1g_remote_fault", |
| 53 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 54 | DDI_SERVICE_DEGRADED}, |
| 55 | }; |
| 56 | |
| 57 | nxge_fm_ereport_attr_t nxge_fm_ereport_mif[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 58 | {NXGE_FM_EREPORT_MIF_ACCESS_FAIL, "transceiver_access_fail"} |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 59 | }; |
| 60 | |
| 61 | nxge_fm_ereport_attr_t nxge_fm_ereport_fflp[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 62 | {NXGE_FM_EREPORT_FFLP_TCAM_ERR, "classifier_tcam_err", |
| 63 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 64 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 65 | {NXGE_FM_EREPORT_FFLP_VLAN_PAR_ERR, "classifier_vlan_par_err", |
| 66 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 67 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 68 | {NXGE_FM_EREPORT_FFLP_HASHT_DATA_ERR, "classifier_hasht_data_err", |
| 69 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 70 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 71 | {NXGE_FM_EREPORT_FFLP_HASHT_LOOKUP_ERR, "classifier_hasht_lookup_err", |
| 72 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 73 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 74 | {NXGE_FM_EREPORT_FFLP_ACCESS_FAIL, "classifier_access_fail", |
| 75 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 76 | DDI_SERVICE_DEGRADED} |
| 77 | }; |
| 78 | |
| 79 | nxge_fm_ereport_attr_t nxge_fm_ereport_ipp[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 80 | {NXGE_FM_EREPORT_IPP_EOP_MISS, "rx_eop_miss", |
| 81 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 82 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 83 | {NXGE_FM_EREPORT_IPP_SOP_MISS, "rx_sop_miss", |
| 84 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 85 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 86 | {NXGE_FM_EREPORT_IPP_DFIFO_UE, "rx_dfifo_ucorr_err", |
| 87 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 88 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 89 | {NXGE_FM_EREPORT_IPP_DFIFO_CE, "rx_dfifo_corr_err", |
| 90 | DDI_FM_DEVICE_INTERN_CORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 91 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 92 | {NXGE_FM_EREPORT_IPP_PFIFO_PERR, "rx_dfifo_parity_err", |
| 93 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 94 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 95 | {NXGE_FM_EREPORT_IPP_ECC_ERR_MAX, "rx_ecc_err_max", |
| 96 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 97 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 98 | {NXGE_FM_EREPORT_IPP_PFIFO_OVER, "rx_pfifo_overflow", |
| 99 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 100 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 101 | {NXGE_FM_EREPORT_IPP_PFIFO_UND, "rx_pfifo_underrun", |
| 102 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 103 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 104 | {NXGE_FM_EREPORT_IPP_BAD_CS_MX, "rx_bad_cksum_max", |
| 105 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 106 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 107 | {NXGE_FM_EREPORT_IPP_PKT_DIS_MX, "rx_pkt_discard_max", |
| 108 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 109 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 110 | {NXGE_FM_EREPORT_IPP_RESET_FAIL, "rx_reset_fail", |
| 111 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 112 | DDI_SERVICE_LOST} |
| 113 | }; |
| 114 | |
| 115 | nxge_fm_ereport_attr_t nxge_fm_ereport_rdmc[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 116 | {NXGE_FM_EREPORT_RDMC_DCF_ERR, "rxdma_dcf_err", |
| 117 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 118 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 119 | {NXGE_FM_EREPORT_RDMC_RCR_ACK_ERR, "rxdma_rcr_ack_err", |
| 120 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 121 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 122 | {NXGE_FM_EREPORT_RDMC_DC_FIFO_ERR, "rxdma_dc_fifo_err", |
| 123 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 124 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 125 | {NXGE_FM_EREPORT_RDMC_RCR_SHA_PAR, "rxdma_rcr_sha_par_err", |
| 126 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 127 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 128 | {NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR, "rxdma_rbr_pre_par_err", |
| 129 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 130 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 131 | {NXGE_FM_EREPORT_RDMC_RBR_TMOUT, "rxdma_rbr_tmout", |
| 132 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 133 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 134 | {NXGE_FM_EREPORT_RDMC_RSP_CNT_ERR, "rxdma_rsp_cnt_err", |
| 135 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 136 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 137 | {NXGE_FM_EREPORT_RDMC_BYTE_EN_BUS, "rxdma_byte_en_bus", |
| 138 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 139 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 140 | {NXGE_FM_EREPORT_RDMC_RSP_DAT_ERR, "rxdma_rsp_dat_err", |
| 141 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 142 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 143 | {NXGE_FM_EREPORT_RDMC_ID_MISMATCH, "rxdma_id_mismatch", |
| 144 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 145 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 146 | {NXGE_FM_EREPORT_RDMC_ZCP_EOP_ERR, "rxdma_zcp_eop_err", |
| 147 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 148 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 149 | {NXGE_FM_EREPORT_RDMC_IPP_EOP_ERR, "rxdma_ipp_eop_err", |
| 150 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 151 | DDI_SERVICE_LOST}, |
yc148097 | 53f3d8e | 2007-10-01 22:31:20 -0700 | [diff] [blame] | 152 | {NXGE_FM_EREPORT_RDMC_RCR_ERR, "rxdma_completion_err", |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 153 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 154 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 155 | {NXGE_FM_EREPORT_RDMC_CONFIG_ERR, "rxdma_config_err", |
| 156 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 157 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 158 | {NXGE_FM_EREPORT_RDMC_RCRINCON, "rxdma_rcrincon", |
| 159 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 160 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 161 | {NXGE_FM_EREPORT_RDMC_RCRFULL, "rxdma_rcrfull", |
| 162 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 163 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 164 | {NXGE_FM_EREPORT_RDMC_RBRFULL, "rxdma_rbrfull", |
| 165 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 166 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 167 | {NXGE_FM_EREPORT_RDMC_RBRLOGPAGE, "rxdma_rbrlogpage", |
| 168 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 169 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 170 | {NXGE_FM_EREPORT_RDMC_CFIGLOGPAGE, "rxdma_cfiglogpage", |
| 171 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 172 | DDI_SERVICE_DEGRADED} |
| 173 | }; |
| 174 | |
| 175 | nxge_fm_ereport_attr_t nxge_fm_ereport_zcp[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 176 | {NXGE_FM_EREPORT_ZCP_RRFIFO_UNDERRUN, "rxzcopy_rrfifo_underrun", |
| 177 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 178 | DDI_SERVICE_UNAFFECTED}, |
| 179 | {NXGE_FM_EREPORT_ZCP_RSPFIFO_UNCORR_ERR, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 180 | "rxzcopy_rspfifo_uncorr_err", |
| 181 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 182 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 183 | {NXGE_FM_EREPORT_ZCP_STAT_TBL_PERR, "rxzcopy_stat_tbl_perr", |
| 184 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 185 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 186 | {NXGE_FM_EREPORT_ZCP_DYN_TBL_PERR, "rxzcopy_dyn_tbl_perr", |
| 187 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 188 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 189 | {NXGE_FM_EREPORT_ZCP_BUF_TBL_PERR, "rxzcopy_buf_tbl_perr", |
| 190 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 191 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 192 | {NXGE_FM_EREPORT_ZCP_CFIFO_ECC, "rxzcopy_cfifo_ecc", |
| 193 | DDI_FM_DEVICE_INTERN_CORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 194 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 195 | {NXGE_FM_EREPORT_ZCP_RRFIFO_OVERRUN, "rxzcopy_rrfifo_overrun", |
| 196 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 197 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 198 | {NXGE_FM_EREPORT_ZCP_BUFFER_OVERFLOW, "rxzcopy_buffer_overflow", |
| 199 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 200 | DDI_SERVICE_LOST}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 201 | {NXGE_FM_EREPORT_ZCP_TT_PROGRAM_ERR, "rxzcopy_tt_program_err", |
| 202 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 203 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 204 | {NXGE_FM_EREPORT_ZCP_RSP_TT_INDEX_ERR, "rxzcopy_rsp_tt_index_err", |
| 205 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 206 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 207 | {NXGE_FM_EREPORT_ZCP_SLV_TT_INDEX_ERR, "rxzcopy_slv_tt_index_err", |
| 208 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 209 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 210 | {NXGE_FM_EREPORT_ZCP_TT_INDEX_ERR, "rxzcopy_tt_index_err", |
| 211 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 212 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 213 | {NXGE_FM_EREPORT_ZCP_ACCESS_FAIL, "rxzcopy_access_fail", |
| 214 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 215 | DDI_SERVICE_LOST}, |
| 216 | }; |
| 217 | |
| 218 | nxge_fm_ereport_attr_t nxge_fm_ereport_rxmac[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 219 | {NXGE_FM_EREPORT_RXMAC_UNDERFLOW, "rxmac_underflow", |
| 220 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 221 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 222 | {NXGE_FM_EREPORT_RXMAC_CRC_ERRCNT_EXP, "rxmac_crc_errcnt_exp", |
| 223 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 224 | DDI_SERVICE_UNAFFECTED}, |
| 225 | {NXGE_FM_EREPORT_RXMAC_LENGTH_ERRCNT_EXP, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 226 | "rxmac_length_errcnt_exp", |
| 227 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 228 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 229 | {NXGE_FM_EREPORT_RXMAC_VIOL_ERRCNT_EXP, "rxmac_viol_errcnt_exp", |
| 230 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 231 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 232 | {NXGE_FM_EREPORT_RXMAC_RXFRAG_CNT_EXP, "rxmac_rxfrag_cnt_exp", |
| 233 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 234 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 235 | {NXGE_FM_EREPORT_RXMAC_ALIGN_ECNT_EXP, "rxmac_align_ecnt_exp", |
| 236 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 237 | DDI_SERVICE_UNAFFECTED}, |
| 238 | {NXGE_FM_EREPORT_RXMAC_LINKFAULT_CNT_EXP, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 239 | "rxmac_linkfault_cnt_exp", |
| 240 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 241 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 242 | {NXGE_FM_EREPORT_RXMAC_RESET_FAIL, "rxmac_reset_fail", |
| 243 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 244 | DDI_SERVICE_UNAFFECTED}, |
| 245 | }; |
| 246 | |
| 247 | nxge_fm_ereport_attr_t nxge_fm_ereport_tdmc[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 248 | {NXGE_FM_EREPORT_TDMC_PREF_BUF_PAR_ERR, "txdma_pref_buf_par_err", |
| 249 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 250 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 251 | {NXGE_FM_EREPORT_TDMC_MBOX_ERR, "txdma_mbox_err", |
| 252 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 253 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 254 | {NXGE_FM_EREPORT_TDMC_NACK_PREF, "txdma_nack_pref", |
| 255 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 256 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 257 | {NXGE_FM_EREPORT_TDMC_NACK_PKT_RD, "txdma_nack_pkt_rd", |
| 258 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 259 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 260 | {NXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR, "txdma_pkt_size_err", |
| 261 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 262 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 263 | {NXGE_FM_EREPORT_TDMC_TX_RING_OFLOW, "txdma_tx_ring_oflow", |
| 264 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 265 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 266 | {NXGE_FM_EREPORT_TDMC_CONF_PART_ERR, "txdma_conf_part_err", |
| 267 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 268 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 269 | {NXGE_FM_EREPORT_TDMC_PKT_PRT_ERR, "txdma_pkt_prt_err", |
| 270 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 271 | DDI_SERVICE_DEGRADED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 272 | {NXGE_FM_EREPORT_TDMC_RESET_FAIL, "txdma_reset_fail", |
| 273 | DDI_FM_DEVICE_NO_RESPONSE, |
| 274 | DDI_SERVICE_LOST}, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 275 | }; |
| 276 | |
| 277 | nxge_fm_ereport_attr_t nxge_fm_ereport_txc[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 278 | {NXGE_FM_EREPORT_TXC_RO_CORRECT_ERR, "tx_ro_correct_err", |
| 279 | DDI_FM_DEVICE_INTERN_CORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 280 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 281 | {NXGE_FM_EREPORT_TXC_RO_UNCORRECT_ERR, "tx_ro_uncorrect_err", |
| 282 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 283 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 284 | {NXGE_FM_EREPORT_TXC_SF_CORRECT_ERR, "tx_sf_correct_err", |
| 285 | DDI_FM_DEVICE_INTERN_CORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 286 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 287 | {NXGE_FM_EREPORT_TXC_SF_UNCORRECT_ERR, "tx_sf_uncorrect_err", |
| 288 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 289 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 290 | {NXGE_FM_EREPORT_TXC_ASSY_DEAD, "tx_assembly_uncorrect_err", |
| 291 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 292 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 293 | {NXGE_FM_EREPORT_TXC_REORDER_ERR, "tx_reorder_err", |
| 294 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 295 | DDI_SERVICE_LOST}, |
| 296 | }; |
| 297 | |
| 298 | nxge_fm_ereport_attr_t nxge_fm_ereport_txmac[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 299 | {NXGE_FM_EREPORT_TXMAC_UNDERFLOW, "txmac_underflow", |
| 300 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 301 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 302 | {NXGE_FM_EREPORT_TXMAC_OVERFLOW, "txmac_overflow", |
| 303 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 304 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 305 | {NXGE_FM_EREPORT_TXMAC_TXFIFO_XFR_ERR, "txmac_txfifo_xfr_err", |
| 306 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 307 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 308 | {NXGE_FM_EREPORT_TXMAC_MAX_PKT_ERR, "txmac_max_pkt_err", |
| 309 | DDI_FM_DEVICE_INTERN_UNCORR, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 310 | DDI_SERVICE_UNAFFECTED}, |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 311 | {NXGE_FM_EREPORT_TXMAC_RESET_FAIL, "txmac_reset_fail", |
| 312 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 313 | DDI_SERVICE_UNAFFECTED}, |
| 314 | }; |
| 315 | |
| 316 | nxge_fm_ereport_attr_t nxge_fm_ereport_espc[] = { |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 317 | {NXGE_FM_EREPORT_ESPC_ACCESS_FAIL, "eprom_access_fail", |
| 318 | DDI_FM_DEVICE_NO_RESPONSE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 319 | DDI_SERVICE_LOST}, |
| 320 | }; |
| 321 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 322 | nxge_fm_ereport_attr_t nxge_fm_ereport_xaui[] = { |
| 323 | {NXGE_FM_EREPORT_XAUI_ERR, "xaui_bad_or_missing", |
| 324 | NXGE_FM_DEVICE_XAUI_ERR, |
| 325 | DDI_SERVICE_LOST}, |
| 326 | }; |
| 327 | |
| 328 | nxge_fm_ereport_attr_t nxge_fm_ereport_xfp[] = { |
| 329 | {NXGE_FM_EREPORT_XFP_ERR, "xfp_bad_or_missing", |
| 330 | NXGE_FM_DEVICE_XFP_ERR, |
| 331 | DDI_SERVICE_LOST}, |
| 332 | }; |
| 333 | |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 334 | nxge_fm_ereport_attr_t nxge_fm_ereport_sw[] = { |
| 335 | {NXGE_FM_EREPORT_SW_INVALID_PORT_NUM, "invalid_port_num", |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 336 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 337 | DDI_SERVICE_LOST}, |
| 338 | {NXGE_FM_EREPORT_SW_INVALID_CHAN_NUM, "invalid_chan_num", |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 339 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 340 | DDI_SERVICE_LOST}, |
| 341 | {NXGE_FM_EREPORT_SW_INVALID_PARAM, "invalid_param", |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 342 | DDI_FM_DEVICE_INVAL_STATE, |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 343 | DDI_SERVICE_LOST}, |
| 344 | }; |
| 345 | |
| 346 | void |
| 347 | nxge_fm_init(p_nxge_t nxgep, ddi_device_acc_attr_t *reg_attr, |
Stephen Hanson | 837c1ac | 2009-12-03 04:39:22 -0800 | [diff] [blame] | 348 | ddi_dma_attr_t *dma_attr) |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 349 | { |
| 350 | ddi_iblock_cookie_t iblk; |
| 351 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 352 | /* |
| 353 | * fm-capable in nxge.conf can be used to set fm_capabilities. |
| 354 | * If fm-capable is not defined, then the last argument passed to |
| 355 | * ddi_prop_get_int will be returned as the capabilities. |
| 356 | */ |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 357 | nxgep->fm_capabilities = ddi_prop_get_int(DDI_DEV_T_ANY, nxgep->dip, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 358 | DDI_PROP_DONTPASS | DDI_PROP_NOTPROM, "fm-capable", |
| 359 | DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE); |
| 360 | |
speer | 678453a | 2008-04-27 19:50:44 -0700 | [diff] [blame] | 361 | NXGE_ERROR_MSG((nxgep, DDI_CTL, |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 362 | "FM capable = %d\n", nxgep->fm_capabilities)); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 363 | |
speer | 678453a | 2008-04-27 19:50:44 -0700 | [diff] [blame] | 364 | if (isLDOMguest(nxgep)) { |
| 365 | nxgep->fm_capabilities = DDI_FM_NOT_CAPABLE; |
| 366 | return; |
| 367 | } |
| 368 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 369 | /* |
| 370 | * Register capabilities with IO Fault Services. The capabilities |
| 371 | * set above may not be supported by the parent nexus, in that case |
| 372 | * some capability bits may be cleared. |
| 373 | */ |
| 374 | if (nxgep->fm_capabilities) |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 375 | ddi_fm_init(nxgep->dip, &nxgep->fm_capabilities, &iblk); |
| 376 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 377 | /* |
| 378 | * Initialize pci ereport capabilities if ereport capable |
| 379 | */ |
| 380 | if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities) || |
| 381 | DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) { |
| 382 | pci_ereport_setup(nxgep->dip); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 383 | } |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 384 | |
| 385 | /* Register error callback if error callback capable */ |
| 386 | if (DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) { |
| 387 | ddi_fm_handler_register(nxgep->dip, |
| 388 | nxge_fm_error_cb, (void*) nxgep); |
| 389 | } |
| 390 | |
| 391 | /* |
| 392 | * DDI_FLGERR_ACC indicates: |
| 393 | * o Driver will check its access handle(s) for faults on |
| 394 | * a regular basis by calling ddi_fm_acc_err_get |
| 395 | * o Driver is able to cope with incorrect results of I/O |
| 396 | * operations resulted from an I/O fault |
| 397 | */ |
| 398 | if (DDI_FM_ACC_ERR_CAP(nxgep->fm_capabilities)) { |
| 399 | reg_attr->devacc_attr_access = DDI_FLAGERR_ACC; |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 400 | } else { |
| 401 | reg_attr->devacc_attr_access = DDI_DEFAULT_ACC; |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 402 | } |
| 403 | |
| 404 | /* |
| 405 | * DDI_DMA_FLAGERR indicates: |
| 406 | * o Driver will check its DMA handle(s) for faults on a |
| 407 | * regular basis using ddi_fm_dma_err_get |
| 408 | * o Driver is able to cope with incorrect results of DMA |
| 409 | * operations resulted from an I/O fault |
| 410 | */ |
| 411 | if (DDI_FM_DMA_ERR_CAP(nxgep->fm_capabilities)) |
| 412 | dma_attr->dma_attr_flags |= DDI_DMA_FLAGERR; |
| 413 | else |
| 414 | dma_attr->dma_attr_flags &= ~DDI_DMA_FLAGERR; |
| 415 | |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 416 | } |
| 417 | |
| 418 | void |
| 419 | nxge_fm_fini(p_nxge_t nxgep) |
| 420 | { |
| 421 | /* Only unregister FMA capabilities if we registered some */ |
| 422 | if (nxgep->fm_capabilities) { |
| 423 | |
| 424 | /* |
| 425 | * Release any resources allocated by pci_ereport_setup() |
| 426 | */ |
| 427 | if (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities) || |
| 428 | DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) |
| 429 | pci_ereport_teardown(nxgep->dip); |
| 430 | |
| 431 | /* |
| 432 | * Un-register error callback if error callback capable |
| 433 | */ |
| 434 | if (DDI_FM_ERRCB_CAP(nxgep->fm_capabilities)) |
| 435 | ddi_fm_handler_unregister(nxgep->dip); |
| 436 | |
| 437 | /* Unregister from IO Fault Services */ |
| 438 | ddi_fm_fini(nxgep->dip); |
| 439 | } |
| 440 | } |
| 441 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 442 | /*ARGSUSED*/ |
| 443 | /* |
| 444 | * Simply call pci_ereport_post which generates ereports for errors |
| 445 | * that occur in the PCI local bus configuration status registers. |
| 446 | */ |
| 447 | static int |
| 448 | nxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, |
| 449 | const void *impl_data) |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 450 | { |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 451 | pci_ereport_post(dip, err, NULL); |
| 452 | return (err->fme_status); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 453 | } |
| 454 | |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 455 | |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 456 | static nxge_fm_ereport_attr_t * |
| 457 | nxge_fm_get_ereport_attr(nxge_fm_ereport_id_t ereport_id) |
| 458 | { |
| 459 | nxge_fm_ereport_attr_t *attr; |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 460 | uint8_t blk_id = (ereport_id >> EREPORT_FM_ID_SHIFT) & |
| 461 | EREPORT_FM_ID_MASK; |
| 462 | uint8_t index = ereport_id & EREPORT_INDEX_MASK; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 463 | |
| 464 | switch (blk_id) { |
| 465 | case FM_SW_ID: |
| 466 | attr = &nxge_fm_ereport_sw[index]; |
| 467 | break; |
| 468 | case FM_PCS_ID: |
| 469 | attr = &nxge_fm_ereport_pcs[index]; |
| 470 | break; |
| 471 | case FM_TXMAC_ID: |
| 472 | attr = &nxge_fm_ereport_txmac[index]; |
| 473 | break; |
| 474 | case FM_RXMAC_ID: |
| 475 | attr = &nxge_fm_ereport_rxmac[index]; |
| 476 | break; |
| 477 | case FM_MIF_ID: |
| 478 | attr = &nxge_fm_ereport_mif[index]; |
| 479 | break; |
| 480 | case FM_FFLP_ID: |
| 481 | attr = &nxge_fm_ereport_fflp[index]; |
| 482 | break; |
| 483 | case FM_ZCP_ID: |
| 484 | attr = &nxge_fm_ereport_zcp[index]; |
| 485 | break; |
| 486 | case FM_RXDMA_ID: |
| 487 | attr = &nxge_fm_ereport_rdmc[index]; |
| 488 | break; |
| 489 | case FM_TXDMA_ID: |
| 490 | attr = &nxge_fm_ereport_tdmc[index]; |
| 491 | break; |
| 492 | case FM_IPP_ID: |
| 493 | attr = &nxge_fm_ereport_ipp[index]; |
| 494 | break; |
| 495 | case FM_TXC_ID: |
| 496 | attr = &nxge_fm_ereport_txc[index]; |
| 497 | break; |
| 498 | case FM_ESPC_ID: |
| 499 | attr = &nxge_fm_ereport_espc[index]; |
| 500 | break; |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 501 | case FM_XAUI_ID: |
| 502 | attr = &nxge_fm_ereport_xaui[index]; |
| 503 | break; |
| 504 | case FM_XFP_ID: |
| 505 | attr = &nxge_fm_ereport_xfp[index]; |
| 506 | break; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 507 | default: |
| 508 | attr = NULL; |
| 509 | } |
| 510 | |
| 511 | return (attr); |
| 512 | } |
| 513 | |
| 514 | static void |
| 515 | nxge_fm_ereport(p_nxge_t nxgep, uint8_t err_portn, uint8_t err_chan, |
| 516 | nxge_fm_ereport_attr_t *ereport) |
| 517 | { |
| 518 | uint64_t ena; |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 519 | char eclass[FM_MAX_CLASS]; |
| 520 | char *err_str; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 521 | p_nxge_stats_t statsp; |
| 522 | |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 523 | (void) snprintf(eclass, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE, |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 524 | ereport->eclass); |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 525 | err_str = ereport->str; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 526 | ena = fm_ena_generate(0, FM_ENA_FMT1); |
| 527 | statsp = nxgep->statsp; |
| 528 | |
yc148097 | f6485ee | 2007-11-26 22:29:52 -0800 | [diff] [blame] | 529 | switch (ereport->index) { |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 530 | case NXGE_FM_EREPORT_XPCS_LINK_DOWN: |
| 531 | case NXGE_FM_EREPORT_XPCS_TX_LINK_FAULT: |
| 532 | case NXGE_FM_EREPORT_XPCS_RX_LINK_FAULT: |
| 533 | case NXGE_FM_EREPORT_PCS_LINK_DOWN: |
| 534 | case NXGE_FM_EREPORT_PCS_REMOTE_FAULT: |
| 535 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 536 | DDI_NOSLEEP, |
| 537 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 538 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 539 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 540 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 541 | break; |
| 542 | case NXGE_FM_EREPORT_IPP_EOP_MISS: |
| 543 | case NXGE_FM_EREPORT_IPP_SOP_MISS: |
| 544 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 545 | DDI_NOSLEEP, |
| 546 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 547 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 548 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 549 | ERNAME_DFIFO_RD_PTR, DATA_TYPE_UINT16, |
| 550 | statsp->ipp_stats.errlog.dfifo_rd_ptr, |
| 551 | ERNAME_IPP_STATE_MACH, DATA_TYPE_UINT32, |
| 552 | statsp->ipp_stats.errlog.state_mach, |
| 553 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 554 | break; |
| 555 | case NXGE_FM_EREPORT_IPP_DFIFO_UE: |
| 556 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 557 | DDI_NOSLEEP, |
| 558 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 559 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 560 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 561 | ERNAME_DFIFO_ENTRY, DATA_TYPE_UINT16, |
| 562 | nxgep->ipp.status.bits.w0.dfifo_ecc_err_idx, |
| 563 | ERNAME_DFIFO_SYNDROME, DATA_TYPE_UINT16, |
| 564 | statsp->ipp_stats.errlog.ecc_syndrome, |
| 565 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 566 | break; |
| 567 | case NXGE_FM_EREPORT_IPP_PFIFO_PERR: |
| 568 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 569 | DDI_NOSLEEP, |
| 570 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 571 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 572 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 573 | ERNAME_PFIFO_ENTRY, DATA_TYPE_UINT8, |
| 574 | nxgep->ipp.status.bits.w0.pre_fifo_perr_idx, |
| 575 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 576 | break; |
| 577 | case NXGE_FM_EREPORT_IPP_DFIFO_CE: |
| 578 | case NXGE_FM_EREPORT_IPP_ECC_ERR_MAX: |
| 579 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 580 | DDI_NOSLEEP, |
| 581 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 582 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 583 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 584 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 585 | break; |
| 586 | case NXGE_FM_EREPORT_IPP_PFIFO_OVER: |
| 587 | case NXGE_FM_EREPORT_IPP_PFIFO_UND: |
| 588 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 589 | DDI_NOSLEEP, |
| 590 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 591 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 592 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 593 | ERNAME_IPP_STATE_MACH, DATA_TYPE_UINT32, |
| 594 | statsp->ipp_stats.errlog.state_mach, |
| 595 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 596 | break; |
| 597 | case NXGE_FM_EREPORT_IPP_BAD_CS_MX: |
| 598 | case NXGE_FM_EREPORT_IPP_PKT_DIS_MX: |
| 599 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 600 | DDI_NOSLEEP, |
| 601 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 602 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 603 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 604 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 605 | break; |
| 606 | case NXGE_FM_EREPORT_FFLP_TCAM_ERR: |
| 607 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 608 | DDI_NOSLEEP, |
| 609 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 610 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 611 | ERNAME_TCAM_ERR_LOG, DATA_TYPE_UINT32, |
| 612 | statsp->fflp_stats.errlog.tcam, |
| 613 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 614 | break; |
| 615 | case NXGE_FM_EREPORT_FFLP_VLAN_PAR_ERR: |
| 616 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 617 | DDI_NOSLEEP, |
| 618 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 619 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 620 | ERNAME_VLANTAB_ERR_LOG, DATA_TYPE_UINT32, |
| 621 | statsp->fflp_stats.errlog.vlan, |
| 622 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 623 | break; |
| 624 | case NXGE_FM_EREPORT_FFLP_HASHT_DATA_ERR: |
| 625 | { |
| 626 | int rdc_grp; |
| 627 | hash_tbl_data_log_t hash_log; |
| 628 | |
| 629 | for (rdc_grp = 0; rdc_grp < MAX_PARTITION; rdc_grp++) { |
| 630 | hash_log.value = nxgep->classifier.fflp_stats-> |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 631 | errlog.hash_pio[rdc_grp]; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 632 | if (hash_log.bits.ldw.pio_err) { |
| 633 | ddi_fm_ereport_post(nxgep->dip, eclass, |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 634 | ena, DDI_NOSLEEP, |
| 635 | FM_VERSION, DATA_TYPE_UINT8, |
| 636 | FM_EREPORT_VERS0, |
| 637 | ERNAME_DETAILED_ERR_TYPE, |
| 638 | DATA_TYPE_STRING, err_str, |
| 639 | ERNAME_HASHTAB_ERR_LOG, |
| 640 | DATA_TYPE_UINT32, |
| 641 | nxgep->classifier.fflp_stats-> |
| 642 | errlog.hash_pio[rdc_grp], NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 643 | } |
| 644 | } |
| 645 | } |
| 646 | break; |
| 647 | case NXGE_FM_EREPORT_FFLP_HASHT_LOOKUP_ERR: |
| 648 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 649 | DDI_NOSLEEP, |
| 650 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 651 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 652 | ERNAME_HASHT_LOOKUP_ERR_LOG0, DATA_TYPE_UINT32, |
| 653 | statsp->fflp_stats.errlog. hash_lookup1, |
| 654 | ERNAME_HASHT_LOOKUP_ERR_LOG1, DATA_TYPE_UINT32, |
| 655 | statsp->fflp_stats.errlog.hash_lookup2, |
| 656 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 657 | break; |
| 658 | case NXGE_FM_EREPORT_RDMC_DCF_ERR: |
| 659 | case NXGE_FM_EREPORT_RDMC_RBR_TMOUT: |
| 660 | case NXGE_FM_EREPORT_RDMC_RSP_CNT_ERR: |
| 661 | case NXGE_FM_EREPORT_RDMC_BYTE_EN_BUS: |
| 662 | case NXGE_FM_EREPORT_RDMC_RSP_DAT_ERR: |
| 663 | case NXGE_FM_EREPORT_RDMC_RCR_ACK_ERR: |
| 664 | case NXGE_FM_EREPORT_RDMC_DC_FIFO_ERR: |
| 665 | case NXGE_FM_EREPORT_RDMC_CONFIG_ERR: |
| 666 | case NXGE_FM_EREPORT_RDMC_RCRINCON: |
| 667 | case NXGE_FM_EREPORT_RDMC_RCRFULL: |
| 668 | case NXGE_FM_EREPORT_RDMC_RBRFULL: |
| 669 | case NXGE_FM_EREPORT_RDMC_RBRLOGPAGE: |
| 670 | case NXGE_FM_EREPORT_RDMC_CFIGLOGPAGE: |
| 671 | case NXGE_FM_EREPORT_RDMC_ID_MISMATCH: |
| 672 | case NXGE_FM_EREPORT_RDMC_ZCP_EOP_ERR: |
| 673 | case NXGE_FM_EREPORT_RDMC_IPP_EOP_ERR: |
| 674 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 675 | DDI_NOSLEEP, |
| 676 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 677 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 678 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 679 | ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, |
| 680 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 681 | break; |
| 682 | case NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR: |
| 683 | case NXGE_FM_EREPORT_RDMC_RCR_SHA_PAR: |
| 684 | { |
| 685 | uint32_t err_log; |
| 686 | if (ereport->index == NXGE_FM_EREPORT_RDMC_RBR_PRE_PAR) |
| 687 | err_log = (uint32_t)statsp-> |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 688 | rdc_stats[err_chan].errlog.pre_par.value; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 689 | else |
| 690 | err_log = (uint32_t)statsp-> |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 691 | rdc_stats[err_chan].errlog.sha_par.value; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 692 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 693 | DDI_NOSLEEP, |
| 694 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 695 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 696 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 697 | ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, |
| 698 | ERNAME_RDMC_PAR_ERR_LOG, DATA_TYPE_UINT8, err_log, |
| 699 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 700 | } |
| 701 | break; |
yc148097 | 53f3d8e | 2007-10-01 22:31:20 -0700 | [diff] [blame] | 702 | case NXGE_FM_EREPORT_RDMC_RCR_ERR: |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 703 | { |
| 704 | uint8_t err_type; |
| 705 | err_type = statsp-> |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 706 | rdc_stats[err_chan].errlog.compl_err_type; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 707 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 708 | DDI_NOSLEEP, |
| 709 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 710 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 711 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 712 | ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, |
| 713 | ERNAME_RDC_ERR_TYPE, DATA_TYPE_UINT8, err_type, |
| 714 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 715 | } |
| 716 | break; |
| 717 | |
| 718 | case NXGE_FM_EREPORT_ZCP_RRFIFO_UNDERRUN: |
| 719 | case NXGE_FM_EREPORT_ZCP_RRFIFO_OVERRUN: |
| 720 | case NXGE_FM_EREPORT_ZCP_BUFFER_OVERFLOW: |
| 721 | { |
| 722 | uint32_t sm; |
| 723 | sm = statsp-> |
misaki | 52ccf84 | 2008-06-20 15:53:36 -0700 | [diff] [blame] | 724 | zcp_stats.errlog.state_mach.bits.ldw.state; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 725 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 726 | DDI_NOSLEEP, |
| 727 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 728 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 729 | sm, DATA_TYPE_UINT32, |
| 730 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 731 | break; |
| 732 | } |
| 733 | case NXGE_FM_EREPORT_ZCP_CFIFO_ECC: |
| 734 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 735 | DDI_NOSLEEP, |
| 736 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 737 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 738 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 739 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 740 | break; |
| 741 | case NXGE_FM_EREPORT_ZCP_RSPFIFO_UNCORR_ERR: |
| 742 | case NXGE_FM_EREPORT_ZCP_STAT_TBL_PERR: |
| 743 | case NXGE_FM_EREPORT_ZCP_DYN_TBL_PERR: |
| 744 | case NXGE_FM_EREPORT_ZCP_BUF_TBL_PERR: |
| 745 | case NXGE_FM_EREPORT_ZCP_TT_PROGRAM_ERR: |
| 746 | case NXGE_FM_EREPORT_ZCP_RSP_TT_INDEX_ERR: |
| 747 | case NXGE_FM_EREPORT_ZCP_SLV_TT_INDEX_ERR: |
| 748 | case NXGE_FM_EREPORT_ZCP_TT_INDEX_ERR: |
| 749 | case NXGE_FM_EREPORT_RXMAC_UNDERFLOW: |
| 750 | case NXGE_FM_EREPORT_RXMAC_CRC_ERRCNT_EXP: |
| 751 | case NXGE_FM_EREPORT_RXMAC_LENGTH_ERRCNT_EXP: |
| 752 | case NXGE_FM_EREPORT_RXMAC_VIOL_ERRCNT_EXP: |
| 753 | case NXGE_FM_EREPORT_RXMAC_RXFRAG_CNT_EXP: |
| 754 | case NXGE_FM_EREPORT_RXMAC_LINKFAULT_CNT_EXP: |
| 755 | case NXGE_FM_EREPORT_RXMAC_ALIGN_ECNT_EXP: |
| 756 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 757 | DDI_NOSLEEP, |
| 758 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 759 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 760 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 761 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 762 | break; |
| 763 | case NXGE_FM_EREPORT_TDMC_MBOX_ERR: |
| 764 | case NXGE_FM_EREPORT_TDMC_TX_RING_OFLOW: |
| 765 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 766 | DDI_NOSLEEP, |
| 767 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 768 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 769 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 770 | ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, |
| 771 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 772 | break; |
| 773 | case NXGE_FM_EREPORT_TDMC_PREF_BUF_PAR_ERR: |
| 774 | case NXGE_FM_EREPORT_TDMC_NACK_PREF: |
| 775 | case NXGE_FM_EREPORT_TDMC_NACK_PKT_RD: |
| 776 | case NXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR: |
| 777 | case NXGE_FM_EREPORT_TDMC_CONF_PART_ERR: |
| 778 | case NXGE_FM_EREPORT_TDMC_PKT_PRT_ERR: |
| 779 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 780 | DDI_NOSLEEP, |
| 781 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 782 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 783 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 784 | ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan, |
| 785 | ERNAME_TDMC_ERR_LOG1, DATA_TYPE_UINT32, |
| 786 | statsp->tdc_stats[err_chan].errlog.logl.value, |
| 787 | ERNAME_TDMC_ERR_LOG1, DATA_TYPE_UINT32, |
| 788 | statsp->tdc_stats[err_chan].errlog.logh.value, |
| 789 | DATA_TYPE_UINT32, |
| 790 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 791 | break; |
| 792 | case NXGE_FM_EREPORT_TXC_RO_CORRECT_ERR: |
| 793 | case NXGE_FM_EREPORT_TXC_RO_UNCORRECT_ERR: |
| 794 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 795 | DDI_NOSLEEP, |
| 796 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 797 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 798 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 799 | ERNAME_TXC_ROECC_ADDR, DATA_TYPE_UINT16, |
| 800 | statsp->txc_stats.errlog.ro_st.roecc. |
| 801 | bits.ldw.ecc_address, |
| 802 | ERNAME_TXC_ROECC_DATA0, DATA_TYPE_UINT32, |
| 803 | statsp->txc_stats.errlog.ro_st.d0. |
| 804 | bits.ldw.ro_ecc_data0, |
| 805 | ERNAME_TXC_ROECC_DATA1, DATA_TYPE_UINT32, |
| 806 | statsp->txc_stats.errlog.ro_st.d1. |
| 807 | bits.ldw.ro_ecc_data1, |
| 808 | ERNAME_TXC_ROECC_DATA2, DATA_TYPE_UINT32, |
| 809 | statsp->txc_stats.errlog.ro_st.d2. |
| 810 | bits.ldw.ro_ecc_data2, |
| 811 | ERNAME_TXC_ROECC_DATA3, DATA_TYPE_UINT32, |
| 812 | statsp->txc_stats.errlog.ro_st.d3. |
| 813 | bits.ldw.ro_ecc_data3, |
| 814 | ERNAME_TXC_ROECC_DATA4, DATA_TYPE_UINT32, |
| 815 | statsp->txc_stats.errlog.ro_st.d4. |
| 816 | bits.ldw.ro_ecc_data4, |
| 817 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 818 | break; |
| 819 | case NXGE_FM_EREPORT_TXC_REORDER_ERR: |
| 820 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 821 | DDI_NOSLEEP, |
| 822 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 823 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 824 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 825 | ERNAME_TXC_RO_STATE0, DATA_TYPE_UINT32, |
| 826 | (uint32_t)statsp->txc_stats.errlog.ro_st.st0.value, |
| 827 | ERNAME_TXC_RO_STATE1, DATA_TYPE_UINT32, |
| 828 | (uint32_t)statsp->txc_stats.errlog.ro_st.st1.value, |
| 829 | ERNAME_TXC_RO_STATE2, DATA_TYPE_UINT32, |
| 830 | (uint32_t)statsp->txc_stats.errlog.ro_st.st2.value, |
| 831 | ERNAME_TXC_RO_STATE3, DATA_TYPE_UINT32, |
| 832 | (uint32_t)statsp->txc_stats.errlog.ro_st.st3.value, |
| 833 | ERNAME_TXC_RO_STATE_CTL, DATA_TYPE_UINT32, |
| 834 | (uint32_t)statsp->txc_stats.errlog.ro_st.ctl.value, |
| 835 | ERNAME_TXC_RO_TIDS, DATA_TYPE_UINT32, |
| 836 | (uint32_t)statsp->txc_stats.errlog.ro_st.tids.value, |
| 837 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 838 | break; |
| 839 | case NXGE_FM_EREPORT_TXC_SF_CORRECT_ERR: |
| 840 | case NXGE_FM_EREPORT_TXC_SF_UNCORRECT_ERR: |
| 841 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 842 | DDI_NOSLEEP, |
| 843 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 844 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 845 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 846 | ERNAME_TXC_SFECC_ADDR, DATA_TYPE_UINT32, |
| 847 | statsp->txc_stats.errlog.sf_st.sfecc. |
| 848 | bits.ldw.ecc_address, |
| 849 | ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, |
| 850 | statsp->txc_stats.errlog.sf_st.d0. |
| 851 | bits.ldw.sf_ecc_data0, |
| 852 | ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, |
| 853 | statsp->txc_stats.errlog.sf_st.d1. |
| 854 | bits.ldw.sf_ecc_data1, |
| 855 | ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, |
| 856 | statsp->txc_stats.errlog.sf_st.d2. |
| 857 | bits.ldw.sf_ecc_data2, |
| 858 | ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, |
| 859 | statsp->txc_stats.errlog.sf_st.d3. |
| 860 | bits.ldw.sf_ecc_data3, |
| 861 | ERNAME_TXC_SFECC_DATA0, DATA_TYPE_UINT32, |
| 862 | statsp->txc_stats.errlog.sf_st.d4. |
| 863 | bits.ldw.sf_ecc_data4, |
| 864 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 865 | break; |
| 866 | case NXGE_FM_EREPORT_TXMAC_UNDERFLOW: |
| 867 | case NXGE_FM_EREPORT_TXMAC_OVERFLOW: |
| 868 | case NXGE_FM_EREPORT_TXMAC_TXFIFO_XFR_ERR: |
| 869 | case NXGE_FM_EREPORT_TXMAC_MAX_PKT_ERR: |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 870 | case NXGE_FM_EREPORT_XAUI_ERR: |
| 871 | case NXGE_FM_EREPORT_XFP_ERR: |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 872 | case NXGE_FM_EREPORT_SW_INVALID_PORT_NUM: |
| 873 | case NXGE_FM_EREPORT_SW_INVALID_CHAN_NUM: |
| 874 | case NXGE_FM_EREPORT_SW_INVALID_PARAM: |
| 875 | ddi_fm_ereport_post(nxgep->dip, eclass, ena, |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 876 | DDI_NOSLEEP, |
| 877 | FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0, |
| 878 | ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str, |
| 879 | ERNAME_ERR_PORTN, DATA_TYPE_UINT8, err_portn, |
| 880 | NULL); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 881 | break; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 882 | } |
| 883 | } |
| 884 | |
| 885 | void |
| 886 | nxge_fm_report_error(p_nxge_t nxgep, uint8_t err_portn, uint8_t err_chan, |
| 887 | nxge_fm_ereport_id_t fm_ereport_id) |
| 888 | { |
yc148097 | ee5416c | 2007-09-16 21:47:51 -0700 | [diff] [blame] | 889 | nxge_fm_ereport_attr_t *fm_ereport_attr; |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 890 | |
| 891 | fm_ereport_attr = nxge_fm_get_ereport_attr(fm_ereport_id); |
yc148097 | f6485ee | 2007-11-26 22:29:52 -0800 | [diff] [blame] | 892 | if (fm_ereport_attr != NULL && |
| 893 | (DDI_FM_EREPORT_CAP(nxgep->fm_capabilities))) { |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 894 | nxge_fm_ereport(nxgep, err_portn, err_chan, fm_ereport_attr); |
girish | 4496171 | 2006-11-22 11:47:19 -0800 | [diff] [blame] | 895 | ddi_fm_service_impact(nxgep->dip, fm_ereport_attr->impact); |
| 896 | } |
| 897 | } |
sd77468 | 14ea4bb | 2006-12-22 12:42:28 -0800 | [diff] [blame] | 898 | |
| 899 | int |
| 900 | fm_check_acc_handle(ddi_acc_handle_t handle) |
| 901 | { |
| 902 | ddi_fm_error_t err; |
| 903 | |
| 904 | ddi_fm_acc_err_get(handle, &err, DDI_FME_VERSION); |
| 905 | #ifndef NXGE_FM_S10 |
| 906 | ddi_fm_acc_err_clear(handle, DDI_FME_VERSION); |
| 907 | #endif |
| 908 | return (err.fme_status); |
| 909 | } |
| 910 | |
| 911 | int |
| 912 | fm_check_dma_handle(ddi_dma_handle_t handle) |
| 913 | { |
| 914 | ddi_fm_error_t err; |
| 915 | |
| 916 | ddi_fm_dma_err_get(handle, &err, DDI_FME_VERSION); |
| 917 | return (err.fme_status); |
| 918 | } |