3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * See the License for the specific language governing permissions
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * and limitations under the License.
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 * CDDL HEADER END
837c1ac4e72b7d86278cca88b1075af557f7d161Stephen Hanson * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Use is subject to license terms.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs*hxge_fm_get_ereport_attr(hxge_fm_ereport_id_t ereport_id);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qshxge_fm_error_cb(dev_info_t *dip, ddi_fm_error_t *err, const void *impl_data);
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The following are part of LDF 0, non-fatal
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PFC_TCAM_PAR_ERR, "classifier_tcam_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PFC_VLAN_PAR_ERR, "classifier_vlan_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_PFC_PKT_DROP, "classifier_pkt_drop_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * The following are part of LDF1, fatal
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_PEU_RESP_ERR, "rxdma_peu_resp_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RCR_SHA_PAR, "rxdma_rcr_sha_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBR_PRE_PAR, "rxdma_rbr_pre_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RBR_PRE_EMPTY, "rxdma_rbr_pre_empty_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_RCR_SHA_FULL, "rxdma_rcr_sha_full",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Control/Data ram received a ecc double bit error.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Fatal error. Part of Device Error 1
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_CTRL_FIFO_DED, "rxdma_ctrl_fifo_ded",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_DATA_FIFO_DED, "rxdma_data_fifo_ded",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Control/Data ram received a ecc single bit error.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Non-Fatal error. Part of Device Error 0
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_CTRL_FIFO_SEC, "rxdma_ctrl_fifo_sec",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_RDMC_DATA_FIFO_SEC, "rxdma_data_fifo_sec",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PEU_RESP_ERR, "txdma_peu_resp_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PKT_SIZE_HDR_ERR, "txdma_pkt_size_hdr_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_RUNT_PKT_DROP_ERR, "txdma_runt_pkt_drop_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PKT_SIZE_ERR, "txdma_pkt_size_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_TX_RNG_OFLOW, "txdma_tx_rng_oflow",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_PREF_PAR_ERR, "txdma_pref_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_TDR_PREF_CPL_TO, "txdma_tdr_pref_cpl_to",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_UNEXPECTED_SOP, "txdma_unexpected_sop",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_REORD_TBL_PAR, "txdma_reord_tbl_par_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_TDMC_REORD_BUF_DED, "txdma_reord_buf_ded_err",
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs {HXGE_FM_EREPORT_SW_INVALID_CHAN_NUM, "invalid_chan_num",
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 /* 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 * 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 * Initialize pci ereport capabilities if ereport capable
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Register error callback if error callback capable */
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
f043ebed17bd76d258204de498eeedb6f8f7eebfMichael Speer desc_attr->devacc_attr_access = DDI_FLAGERR_ACC;
f043ebed17bd76d258204de498eeedb6f8f7eebfMichael Speer desc_attr->devacc_attr_access = DDI_DEFAULT_ACC;
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 /* Only unregister FMA capabilities if we registered some */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Release any resources allocated by pci_ereport_setup()
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Un-register error callback if error callback capable
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs /* Unregister from IO Fault Services */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * Simply call pci_ereport_post which generates ereports for errors
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs * that occur in the PCI local bus configuration status registers.
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs/*ARGSUSED*/
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs const void *impl_data)
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 /* Return the appropriate structure of type hxge_fm_ereport_attr_t */
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs switch (blk_id) {
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qsstatic void
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs (void) snprintf(eclass, FM_MAX_CLASS, "%s.%s", DDI_FM_DEVICE,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs err_type = statsp->rdc_stats[err_chan].errlog.compl_err_type;
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs ddi_fm_ereport_post(hxgep->dip, eclass, ena, DDI_NOSLEEP,
3dec9fcdd56adf1b4a563137b4915c8f2d83b881qs fm_ereport_attr = hxge_fm_get_ereport_attr(fm_ereport_id);