3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER START
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The contents of this file are subject to the terms of the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Common Development and Distribution License (the "License").
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You may not use this file except in compliance with the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * or http://www.opensolaris.org/os/licensing.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * See the License for the specific language governing permissions
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * and limitations under the License.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * When distributing Covered Code, include this CDDL HEADER in each
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * If applicable, add the following below this CDDL HEADER, with the
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * fields enclosed by brackets "[]" replaced with your own identifying
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * information: Portions Copyright [yyyy] [name of copyright owner]
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER END
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
f043ebed17bd76d258204de498eeedb6f8f7eebfMichael Speer
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use is subject to license terms.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <hxge_impl.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <sys/ddifm.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <sys/fm/protocol.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <sys/fm/util.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs#include <sys/fm/io/ddi.h>
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hxge_fm_ereport_attr_t
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs*hxge_fm_get_ereport_attr(hxge_fm_ereport_id_t ereport_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic int
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport_attr_t hxge_fm_ereport_vmac[] = {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_VMAC_LINK_DOWN, "10g_link_down",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_LOST}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport_attr_t hxge_fm_ereport_pfc[] = {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The following are part of LDF 0, non-fatal
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PFC_TCAM_PAR_ERR, "classifier_tcam_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_UNAFFECTED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PFC_VLAN_PAR_ERR, "classifier_vlan_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_UNAFFECTED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PFC_PKT_DROP, "classifier_pkt_drop_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_UNAFFECTED}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport_attr_t hxge_fm_ereport_rdmc[] = {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The following are part of LDF1, fatal
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBR_CPL_TO, "rxdma_rbr_cpl_to",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_NO_RESPONSE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_PEU_RESP_ERR, "rxdma_peu_resp_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RCR_SHA_PAR, "rxdma_rcr_sha_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBR_PRE_PAR, "rxdma_rbr_pre_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBR_PRE_EMPTY, "rxdma_rbr_pre_empty_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RCR_SHA_FULL, "rxdma_rcr_sha_full",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RCRFULL, "rxdma_rcr_full",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBR_EMPTY, "rxdma_rbr_empty",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBRFULL, "rxdma_rbr_full",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RCR_ERR, "rxdma_completion_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Control/Data ram received a ecc double bit error.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Fatal error. Part of Device Error 1
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_CTRL_FIFO_DED, "rxdma_ctrl_fifo_ded",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_DATA_FIFO_DED, "rxdma_data_fifo_ded",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Control/Data ram received a ecc single bit error.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Non-Fatal error. Part of Device Error 0
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_CTRL_FIFO_SEC, "rxdma_ctrl_fifo_sec",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_CORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_UNAFFECTED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_DATA_FIFO_SEC, "rxdma_data_fifo_sec",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_CORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_UNAFFECTED}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport_attr_t hxge_fm_ereport_tdmc[] = {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PEU_RESP_ERR, "txdma_peu_resp_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PKT_SIZE_HDR_ERR, "txdma_pkt_size_hdr_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_RUNT_PKT_DROP_ERR, "txdma_runt_pkt_drop_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR, "txdma_pkt_size_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_TX_RNG_OFLOW, "txdma_tx_rng_oflow",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PREF_PAR_ERR, "txdma_pref_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_TDR_PREF_CPL_TO, "txdma_tdr_pref_cpl_to",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_NO_RESPONSE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PKT_CPL_TO, "txdma_pkt_cpl_to",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_NO_RESPONSE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_INVALID_SOP, "txdma_invalid_sop",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_UNEXPECTED_SOP, "txdma_unexpected_sop",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_REORD_TBL_PAR, "txdma_reord_tbl_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_REORD_BUF_DED, "txdma_reord_buf_ded_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_DEGRADED}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport_attr_t hxge_fm_ereport_peu[] = {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PEU_ERR, "peu_peu_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_LOST},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PEU_VNM_PIO_ERR, "peu_vnm_pio_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INTERN_UNCORR,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_LOST}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport_attr_t hxge_fm_ereport_sw[] = {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_SW_INVALID_CHAN_NUM, "invalid_chan_num",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_LOST},
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_SW_INVALID_PARAM, "invalid_param",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_DEVICE_INVAL_STATE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_SERVICE_LOST}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs};
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_init(p_hxge_t hxgep, ddi_device_acc_attr_t *reg_attr,
f043ebed17bd76d258204de498eeedb6f8f7eebfMichael Speer ddi_device_acc_attr_t *desc_attr, ddi_dma_attr_t *dma_attr)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_iblock_cookie_t iblk;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "==> hxge_fm_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* fm-capable in hxge.conf can be used to set fm_capabilities. */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxgep->fm_capabilities = ddi_prop_get_int(DDI_DEV_T_ANY, hxgep->dip,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_PROP_DONTPASS, "fm-capable",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_EREPORT_CAPABLE | DDI_FM_ERRCB_CAPABLE);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs "FM capable = %d\n", hxgep->fm_capabilities));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Register capabilities with IO Fault Services. The capabilities
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * set above may not be supported by the parent nexus, in that case
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * some capability bits may be cleared.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep->fm_capabilities)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_init(hxgep->dip, &hxgep->fm_capabilities, &iblk);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Initialize pci ereport capabilities if ereport capable
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (DDI_FM_EREPORT_CAP(hxgep->fm_capabilities) ||
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_ERRCB_CAP(hxgep->fm_capabilities)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pci_ereport_setup(hxgep->dip);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Register error callback if error callback capable */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (DDI_FM_ERRCB_CAP(hxgep->fm_capabilities)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_handler_register(hxgep->dip,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_fm_error_cb, (void *) hxgep);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * DDI_FLGERR_ACC indicates:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * o Driver will check its access handle(s) for faults on
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * a regular basis by calling ddi_fm_acc_err_get
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * o Driver is able to cope with incorrect results of I/O
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * operations resulted from an I/O fault
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (DDI_FM_ACC_ERR_CAP(hxgep->fm_capabilities)) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs reg_attr->devacc_attr_access = DDI_FLAGERR_ACC;
f043ebed17bd76d258204de498eeedb6f8f7eebfMichael Speer desc_attr->devacc_attr_access = DDI_FLAGERR_ACC;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs } else {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs reg_attr->devacc_attr_access = DDI_DEFAULT_ACC;
f043ebed17bd76d258204de498eeedb6f8f7eebfMichael Speer desc_attr->devacc_attr_access = DDI_DEFAULT_ACC;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * DDI_DMA_FLAGERR indicates:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * o Driver will check its DMA handle(s) for faults on a
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * regular basis using ddi_fm_dma_err_get
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * o Driver is able to cope with incorrect results of DMA
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * operations resulted from an I/O fault
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (DDI_FM_DMA_ERR_CAP(hxgep->fm_capabilities))
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs dma_attr->dma_attr_flags |= DDI_DMA_FLAGERR;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs dma_attr->dma_attr_flags &= ~DDI_DMA_FLAGERR;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs HXGE_DEBUG_MSG((hxgep, DDI_CTL, "<== hxge_fm_init"));
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_fini(p_hxge_t hxgep)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Only unregister FMA capabilities if we registered some */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (hxgep->fm_capabilities) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Release any resources allocated by pci_ereport_setup()
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (DDI_FM_EREPORT_CAP(hxgep->fm_capabilities) ||
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs DDI_FM_ERRCB_CAP(hxgep->fm_capabilities))
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pci_ereport_teardown(hxgep->dip);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Un-register error callback if error callback capable
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (DDI_FM_ERRCB_CAP(hxgep->fm_capabilities))
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_handler_unregister(hxgep->dip);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Unregister from IO Fault Services */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_fini(hxgep->dip);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Simply call pci_ereport_post which generates ereports for errors
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * that occur in the PCI local bus configuration status registers.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*ARGSUSED*/
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic int
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs const void *impl_data)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs pci_ereport_post(dip, err, NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (err->fme_status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic hxge_fm_ereport_attr_t *
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_get_ereport_attr(hxge_fm_ereport_id_t ereport_id)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_fm_ereport_attr_t *attr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t blk_id;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t index;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Extract the block id and the index within the block */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs blk_id = ((ereport_id >> EREPORT_FM_ID_SHIFT) & EREPORT_FM_ID_MASK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs index = (ereport_id & EREPORT_INDEX_MASK);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Return the appropriate structure of type hxge_fm_ereport_attr_t */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs switch (blk_id) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case FM_SW_ID:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = &hxge_fm_ereport_sw[index];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case FM_VMAC_ID:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = &hxge_fm_ereport_vmac[index];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case FM_PFC_ID:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = &hxge_fm_ereport_pfc[index];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case FM_RXDMA_ID:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = &hxge_fm_ereport_rdmc[index];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case FM_TXDMA_ID:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = &hxge_fm_ereport_tdmc[index];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case FM_PEU_ID:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = &hxge_fm_ereport_peu[index];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs default:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs attr = NULL;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (attr);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_ereport(p_hxge_t hxgep, uint8_t err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_fm_ereport_attr_t *ereport)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint64_t ena;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs char eclass[FM_MAX_CLASS];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs char *err_str;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs p_hxge_stats_t statsp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) snprintf(eclass, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ereport->eclass);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs err_str = ereport->str;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ena = fm_ena_generate(0, FM_ENA_FMT1);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp = hxgep->statsp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs switch (ereport->index) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_VMAC_LINK_DOWN:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_PFC_TCAM_PAR_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_PFC_TCAM_ERR, DATA_TYPE_UINT32,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->pfc_stats.tcam_parity_err,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_PFC_VLAN_PAR_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_PFC_VLAN_ERR, DATA_TYPE_UINT32,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->pfc_stats.vlan_parity_err,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_PFC_PKT_DROP:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_PFC_PKT_DROP, DATA_TYPE_UINT32,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->pfc_stats.pkt_drop,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RBR_CPL_TO:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_PEU_RESP_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RCRFULL:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RBR_EMPTY:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RBRFULL:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RBR_PRE_EMPTY:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RCR_SHA_FULL:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RBR_PRE_PAR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RCR_SHA_PAR: {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint32_t err_log;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_rx_ring_stats_t *rdc_statsp;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rdc_statsp = &statsp->rdc_stats[err_chan];
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (ereport->index == HXGE_FM_EREPORT_RDMC_RBR_PRE_PAR)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs err_log = (uint32_t)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rdc_statsp->errlog.pre_par.value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs else
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs err_log = (uint32_t)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs rdc_statsp->errlog.sha_par.value;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_RDMC_PAR_ERR_LOG, DATA_TYPE_UINT8, err_log,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_RCR_ERR: {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs uint8_t err_type;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs err_type = statsp->rdc_stats[err_chan].errlog.compl_err_type;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_RDC_ERR_TYPE, DATA_TYPE_UINT8, err_type,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_CTRL_FIFO_SEC:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_CTRL_FIFO_DED:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_DATA_FIFO_SEC:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_RDMC_DATA_FIFO_DED:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_PEU_RESP_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_TX_RNG_OFLOW:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_PKT_SIZE_HDR_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_RUNT_PKT_DROP_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_TDR_PREF_CPL_TO:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_PKT_CPL_TO:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_INVALID_SOP:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_UNEXPECTED_SOP:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_PREF_PAR_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_ERR_DCHAN, DATA_TYPE_UINT8, err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_TDC_PREF_PAR_LOG, DATA_TYPE_UINT32,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs statsp->tdc_stats[err_chan].errlog.value, NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_REORD_TBL_PAR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_TDMC_REORD_BUF_DED:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_PEU_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_PEU_VNM_PIO_ERR:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_SW_INVALID_CHAN_NUM:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs case HXGE_FM_EREPORT_SW_INVALID_PARAM:
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs FM_VERSION, DATA_TYPE_UINT8, FM_EREPORT_VERS0,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ERNAME_DETAILED_ERR_TYPE, DATA_TYPE_STRING, err_str,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs NULL);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs break;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsvoid
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_report_error(p_hxge_t hxgep, uint8_t err_chan,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_fm_ereport_id_t fm_ereport_id)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_fm_ereport_attr_t *fm_ereport_attr;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs fm_ereport_attr = hxge_fm_get_ereport_attr(fm_ereport_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs if (fm_ereport_attr != NULL &&
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (DDI_FM_EREPORT_CAP(hxgep->fm_capabilities))) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs hxge_fm_ereport(hxgep, err_chan, fm_ereport_attr);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_service_impact(hxgep->dip, fm_ereport_attr->impact);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs }
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsint
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsfm_check_acc_handle(ddi_acc_handle_t handle)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_error_t err;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_acc_err_get(handle, &err, DDI_FME_VERSION);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_acc_err_clear(handle, DDI_FME_VERSION);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (err.fme_status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsint
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsfm_check_dma_handle(ddi_dma_handle_t handle)
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs{
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_error_t err;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_dma_err_get(handle, &err, DDI_FME_VERSION);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs return (err.fme_status);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs}