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 
  22 /* Copyright 2015 QLogic Corporation */
  23 
  24 /*
  25  * ***********************************************************************
  26  * *                                                                    **
  27  * *                            NOTICE                                  **
  28  * *            COPYRIGHT (C) 1996-2015 QLOGIC CORPORATION              **
  29  * *                    ALL RIGHTS RESERVED                             **
  30  * *                                                                    **
  31  * ***********************************************************************
  32  *
  33  */
  34 
  35 #ifndef _QL_FM_H
  36 #define _QL_FM_H
  37 
  38 #ifdef __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 
  43 /* standard I/O controller eclass already defined in sys/fm/ddi.h */
  44 /* DDI_FM_DEVICE_INVAL_STATE "inval_state" etc */
  45 
  46 /* qlc HBA specific ereport definitions */
  47 #define QL_FM_DEVICE                    "qlc"
  48 
  49 /* qlc HBA specific event defs */
  50 #define QL_FM_DEVICE_DMA_ERR            "qlc.dma_err"
  51 #define QL_FM_DEVICE_BAD_PAYLOAD        "qlc.bad_payload"
  52 #define QL_FM_DEVICE_CMD_FAILED         "qlc.cmd_failed"
  53 #define QL_FM_DEVICE_CHIP_HANG          "qlc.chip_hang"
  54 #define QL_FM_DEVICE_UNKNOWN            "qlc.unknown"
  55 #define QL_FM_DEVICE_MBA_REQ_TRANSFER_ERR       "qlc.asyn_mbx_req_err"
  56 #define QL_FM_DEVICE_MBA_RSP_TRANSFER_ERR       "qlc.asyn_mbx_rsp_err"
  57 #define QL_FM_DEVICE_ACC_HANDLE_ERR     "qlc.acc_hdl_err"
  58 #define QL_FM_DEVICE_DMA_HANDLE_ERR     "qlc.dma_hdl_err"
  59 
  60 #define QL_FM_MAX_CLASS                 256
  61 
  62 
  63 typedef struct qlc_fm_ereport {
  64         uint32_t                fid;            /* Fault Id */
  65         char                    *desc;
  66         char                    *eclass;        /* Error class */
  67         char                    *gen_eclass;    /* Standard error class */
  68         ddi_fault_impact_t      impact_code;
  69 } qlc_fm_ereport_t;
  70 
  71 
  72 /* define fid */
  73 
  74 typedef enum {
  75         QL_FM_EREPORT_DMA_ERR = 0,
  76         QL_FM_EREPORT_BAD_PAYLOAD,
  77         QL_FM_EREPORT_CMD_FAILED,
  78         QL_FM_EREPORT_CHIP_HANG,
  79         QL_FM_EREPORT_UNKNOWN,
  80         QL_FM_EREPORT_MBA_REQ_TRANSFER_ERR,
  81         QL_FM_EREPORT_MBA_RSP_TRANSFER_ERR,
  82         QL_FM_EREPORT_ACC_HANDLE_CHECK,
  83         QL_FM_EREPORT_DMA_HANDLE_CHECK,
  84         QL_FM_EREPORT_NONE
  85 } qlc_fm_ereport_fid_t;
  86 
  87 extern ddi_device_acc_attr_t ql_dev_acc_attr;
  88 extern ddi_dma_attr_t ql_64bit_io_dma_attr;
  89 extern ddi_dma_attr_t ql_32bit_io_dma_attr;
  90 
  91 int qlc_fm_check_acc_handle(ql_adapter_state_t *, ddi_acc_handle_t);
  92 int qlc_fm_check_dma_handle(ql_adapter_state_t *, ddi_dma_handle_t);
  93 int qlc_fm_error_cb(dev_info_t *, ddi_fm_error_t *,
  94         const void *);
  95 void qlc_fm_init(ql_adapter_state_t *);
  96 void qlc_fm_fini(ql_adapter_state_t *);
  97 void qlc_fm_report_err_impact(ql_adapter_state_t *, uint32_t);
  98 void qlc_fm_service_impact(ql_adapter_state_t *, int);
  99 void qlc_fm_check_pkt_dma_handle(ql_adapter_state_t *, ql_srb_t *);
 100 
 101 
 102 #ifdef __cplusplus
 103 }
 104 #endif
 105 
 106 #endif  /* _QL_FM_H */