17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*267b64d5SStephen Hanson  * Common Development and Distribution License (the "License").
6*267b64d5SStephen Hanson  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22*267b64d5SStephen Hanson  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate #ifndef	_ERRORQ_IMPL_H
277c478bd9Sstevel@tonic-gate #define	_ERRORQ_IMPL_H
287c478bd9Sstevel@tonic-gate 
297c478bd9Sstevel@tonic-gate #include <sys/errorq.h>
307c478bd9Sstevel@tonic-gate #include <sys/dditypes.h>
317c478bd9Sstevel@tonic-gate #include <sys/kstat.h>
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
347c478bd9Sstevel@tonic-gate extern "C" {
357c478bd9Sstevel@tonic-gate #endif
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate typedef struct errorq_nvelem {
387c478bd9Sstevel@tonic-gate 	void *eqn_buf;			/* data buf for this nv element */
397c478bd9Sstevel@tonic-gate 	nvlist_t *eqn_nvl;		/* nvlist */
407c478bd9Sstevel@tonic-gate 	nv_alloc_t *eqn_nva;		/* fixed nv allocator */
417c478bd9Sstevel@tonic-gate } errorq_nvelem_t;
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate struct errorq_elem {
447c478bd9Sstevel@tonic-gate 	struct errorq_elem *eqe_next;		/* next on processing list */
457c478bd9Sstevel@tonic-gate 	struct errorq_elem *eqe_prev;		/* prev on free or pend list */
467c478bd9Sstevel@tonic-gate 	struct errorq_elem *eqe_dump;		/* next on crash dump list */
477c478bd9Sstevel@tonic-gate 	void *eqe_data;				/* data for this element */
487c478bd9Sstevel@tonic-gate };
497c478bd9Sstevel@tonic-gate 
507c478bd9Sstevel@tonic-gate typedef struct errorq_kstat {
517c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_dispatched;		/* total errors dispatched */
527c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_dropped;		/* total errors dropped */
537c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_logged;		/* total errors logged */
547c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_reserved;		/* total errors reserved */
557c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_reserve_fail;		/* total reservation failures */
567c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_committed;		/* total errors committed */
577c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_commit_fail;		/* total commit failures */
587c478bd9Sstevel@tonic-gate 	kstat_named_t eqk_cancelled;		/* total reserves cancelled */
597c478bd9Sstevel@tonic-gate } errorq_kstat_t;
607c478bd9Sstevel@tonic-gate 
617c478bd9Sstevel@tonic-gate /*
627c478bd9Sstevel@tonic-gate  * errorq implementation flags: bit range 16-31
637c478bd9Sstevel@tonic-gate  */
647c478bd9Sstevel@tonic-gate #define	ERRORQ_ACTIVE	0x00010000		/* queue is enabled */
657c478bd9Sstevel@tonic-gate #define	ERRORQ_NVLIST	0x00020000		/* nvlist queue */
667c478bd9Sstevel@tonic-gate 
677c478bd9Sstevel@tonic-gate #define	ERRORQ_NAMELEN	31			/* length of queue name */
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate struct errorq {
707c478bd9Sstevel@tonic-gate 	char eq_name[ERRORQ_NAMELEN + 1];	/* string name for debugging */
717c478bd9Sstevel@tonic-gate 	errorq_kstat_t eq_kstat;		/* kstat data (see above) */
727c478bd9Sstevel@tonic-gate 	kstat_t *eq_ksp;			/* pointer to installed kstat */
737c478bd9Sstevel@tonic-gate 	errorq_func_t eq_func;			/* drain callback */
747c478bd9Sstevel@tonic-gate 	void *eq_private;			/* drain callback data */
757c478bd9Sstevel@tonic-gate 	void *eq_data;				/* buffer of queue data */
767c478bd9Sstevel@tonic-gate 	ulong_t eq_qlen;			/* maximum queue length */
777c478bd9Sstevel@tonic-gate 	size_t eq_size;				/* size of element data */
787c478bd9Sstevel@tonic-gate 	uint_t eq_ipl;				/* soft interrupt priority */
797c478bd9Sstevel@tonic-gate 	uint_t eq_flags;			/* flags (see above) */
807c478bd9Sstevel@tonic-gate 	ddi_softintr_t eq_id;			/* soft interrupt identifier */
817c478bd9Sstevel@tonic-gate 	kmutex_t eq_lock;			/* consumer lock */
827c478bd9Sstevel@tonic-gate 	errorq_elem_t *eq_elems;		/* array of all elements */
837c478bd9Sstevel@tonic-gate 	errorq_elem_t *eq_phead;		/* head of processing list */
847c478bd9Sstevel@tonic-gate 	errorq_elem_t *eq_ptail;		/* tail of processing list */
857c478bd9Sstevel@tonic-gate 	errorq_elem_t *eq_pend;			/* list of pending errors */
86*267b64d5SStephen Hanson 	ulong_t *eq_bitmap;			/* bitmap of free elements */
877c478bd9Sstevel@tonic-gate 	errorq_elem_t *eq_dump;			/* list of crash dump elem's */
887c478bd9Sstevel@tonic-gate 	struct errorq *eq_next;			/* next errorq on global list */
89*267b64d5SStephen Hanson 	index_t eq_rotor;			/* best efforts bitmap rotor */
907c478bd9Sstevel@tonic-gate };
917c478bd9Sstevel@tonic-gate 
927c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
937c478bd9Sstevel@tonic-gate }
947c478bd9Sstevel@tonic-gate #endif
957c478bd9Sstevel@tonic-gate 
967c478bd9Sstevel@tonic-gate #endif	/* _ERRORQ_IMPL_H */
97