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, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_ERRORQ_IMPL_H
28 #define	_ERRORQ_IMPL_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #include <sys/errorq.h>
33 #include <sys/dditypes.h>
34 #include <sys/kstat.h>
35 
36 #ifdef	__cplusplus
37 extern "C" {
38 #endif
39 
40 typedef struct errorq_nvelem {
41 	void *eqn_buf;			/* data buf for this nv element */
42 	nvlist_t *eqn_nvl;		/* nvlist */
43 	nv_alloc_t *eqn_nva;		/* fixed nv allocator */
44 } errorq_nvelem_t;
45 
46 struct errorq_elem {
47 	struct errorq_elem *eqe_next;		/* next on processing list */
48 	struct errorq_elem *eqe_prev;		/* prev on free or pend list */
49 	struct errorq_elem *eqe_dump;		/* next on crash dump list */
50 	void *eqe_data;				/* data for this element */
51 };
52 
53 typedef struct errorq_kstat {
54 	kstat_named_t eqk_dispatched;		/* total errors dispatched */
55 	kstat_named_t eqk_dropped;		/* total errors dropped */
56 	kstat_named_t eqk_logged;		/* total errors logged */
57 	kstat_named_t eqk_reserved;		/* total errors reserved */
58 	kstat_named_t eqk_reserve_fail;		/* total reservation failures */
59 	kstat_named_t eqk_committed;		/* total errors committed */
60 	kstat_named_t eqk_commit_fail;		/* total commit failures */
61 	kstat_named_t eqk_cancelled;		/* total reserves cancelled */
62 } errorq_kstat_t;
63 
64 /*
65  * errorq implementation flags: bit range 16-31
66  */
67 #define	ERRORQ_ACTIVE	0x00010000		/* queue is enabled */
68 #define	ERRORQ_NVLIST	0x00020000		/* nvlist queue */
69 
70 #define	ERRORQ_NAMELEN	31			/* length of queue name */
71 
72 struct errorq {
73 	char eq_name[ERRORQ_NAMELEN + 1];	/* string name for debugging */
74 	errorq_kstat_t eq_kstat;		/* kstat data (see above) */
75 	kstat_t *eq_ksp;			/* pointer to installed kstat */
76 	errorq_func_t eq_func;			/* drain callback */
77 	void *eq_private;			/* drain callback data */
78 	void *eq_data;				/* buffer of queue data */
79 	ulong_t eq_qlen;			/* maximum queue length */
80 	size_t eq_size;				/* size of element data */
81 	uint_t eq_ipl;				/* soft interrupt priority */
82 	uint_t eq_flags;			/* flags (see above) */
83 	ddi_softintr_t eq_id;			/* soft interrupt identifier */
84 	kmutex_t eq_lock;			/* consumer lock */
85 	errorq_elem_t *eq_elems;		/* array of all elements */
86 	errorq_elem_t *eq_phead;		/* head of processing list */
87 	errorq_elem_t *eq_ptail;		/* tail of processing list */
88 	errorq_elem_t *eq_pend;			/* list of pending errors */
89 	errorq_elem_t *eq_free;			/* list of free elements */
90 	errorq_elem_t *eq_dump;			/* list of crash dump elem's */
91 	struct errorq *eq_next;			/* next errorq on global list */
92 };
93 
94 #ifdef	__cplusplus
95 }
96 #endif
97 
98 #endif	/* _ERRORQ_IMPL_H */
99