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 */
107