1*a288e5a9SJoshua M. Clulow /*
2*a288e5a9SJoshua M. Clulow  * This file and its contents are supplied under the terms of the
3*a288e5a9SJoshua M. Clulow  * Common Development and Distribution License ("CDDL"), version 1.0.
4*a288e5a9SJoshua M. Clulow  * You may only use this file in accordance with the terms of version
5*a288e5a9SJoshua M. Clulow  * 1.0 of the CDDL.
6*a288e5a9SJoshua M. Clulow  *
7*a288e5a9SJoshua M. Clulow  * A full copy of the text of the CDDL should have accompanied this
8*a288e5a9SJoshua M. Clulow  * source.  A copy of the CDDL is also available via the Internet at
9*a288e5a9SJoshua M. Clulow  * http://www.illumos.org/license/CDDL.
10*a288e5a9SJoshua M. Clulow  */
11*a288e5a9SJoshua M. Clulow /*
12*a288e5a9SJoshua M. Clulow  * Copyright (c) 2013, Joyent, Inc.  All rights reserved.
13*a288e5a9SJoshua M. Clulow  */
14*a288e5a9SJoshua M. Clulow 
15*a288e5a9SJoshua M. Clulow #ifndef	_SYS_DDI_PERIODIC_H
16*a288e5a9SJoshua M. Clulow #define	_SYS_DDI_PERIODIC_H
17*a288e5a9SJoshua M. Clulow 
18*a288e5a9SJoshua M. Clulow #include <sys/list.h>
19*a288e5a9SJoshua M. Clulow #include <sys/taskq_impl.h>
20*a288e5a9SJoshua M. Clulow #include <sys/cyclic.h>
21*a288e5a9SJoshua M. Clulow 
22*a288e5a9SJoshua M. Clulow #ifdef	__cplusplus
23*a288e5a9SJoshua M. Clulow extern "C" {
24*a288e5a9SJoshua M. Clulow #endif
25*a288e5a9SJoshua M. Clulow 
26*a288e5a9SJoshua M. Clulow #ifdef _KERNEL
27*a288e5a9SJoshua M. Clulow 
28*a288e5a9SJoshua M. Clulow /*
29*a288e5a9SJoshua M. Clulow  * Opaque handle type for i_timeout() and i_untimeout().
30*a288e5a9SJoshua M. Clulow  */
31*a288e5a9SJoshua M. Clulow typedef struct __timeout *timeout_t;
32*a288e5a9SJoshua M. Clulow 
33*a288e5a9SJoshua M. Clulow typedef enum ddi_periodic_flags {
34*a288e5a9SJoshua M. Clulow 	DPF_DISPATCHED = 0x01,
35*a288e5a9SJoshua M. Clulow 	DPF_EXECUTING = 0x02,
36*a288e5a9SJoshua M. Clulow 	DPF_CANCELLED = 0x04
37*a288e5a9SJoshua M. Clulow } ddi_periodic_flags_t;
38*a288e5a9SJoshua M. Clulow 
39*a288e5a9SJoshua M. Clulow /*
40*a288e5a9SJoshua M. Clulow  * Each instance of this structure represents a single periodic handler
41*a288e5a9SJoshua M. Clulow  * registered through ddi_periodic_add(9F).
42*a288e5a9SJoshua M. Clulow  */
43*a288e5a9SJoshua M. Clulow typedef struct ddi_periodic_impl {
44*a288e5a9SJoshua M. Clulow 	struct list_node dpr_link; /* protected by periodics_lock */
45*a288e5a9SJoshua M. Clulow 	struct list_node dpr_softint_link; /* only used when DPF_DISPATCHED */
46*a288e5a9SJoshua M. Clulow 	id_t dpr_id;
47*a288e5a9SJoshua M. Clulow 	hrtime_t dpr_interval;
48*a288e5a9SJoshua M. Clulow 
49*a288e5a9SJoshua M. Clulow 	kmutex_t dpr_lock;
50*a288e5a9SJoshua M. Clulow 	kcondvar_t dpr_cv;
51*a288e5a9SJoshua M. Clulow 	ddi_periodic_flags_t dpr_flags;
52*a288e5a9SJoshua M. Clulow 	uint_t dpr_level; /* 0 <= dpr_level <= 10 */
53*a288e5a9SJoshua M. Clulow 	taskq_ent_t dpr_taskq_ent; /* only used for level of 0 */
54*a288e5a9SJoshua M. Clulow 	uint64_t dpr_fire_count;
55*a288e5a9SJoshua M. Clulow 	kthread_t *dpr_thread;
56*a288e5a9SJoshua M. Clulow 
57*a288e5a9SJoshua M. Clulow 	cyclic_id_t dpr_cyclic_id;
58*a288e5a9SJoshua M. Clulow 
59*a288e5a9SJoshua M. Clulow 	void (*dpr_handler)(void *);
60*a288e5a9SJoshua M. Clulow 	void *dpr_arg;
61*a288e5a9SJoshua M. Clulow } ddi_periodic_impl_t;
62*a288e5a9SJoshua M. Clulow 
63*a288e5a9SJoshua M. Clulow /*
64*a288e5a9SJoshua M. Clulow  * Internal implementation functions for the DDI periodic interface.
65*a288e5a9SJoshua M. Clulow  */
66*a288e5a9SJoshua M. Clulow void ddi_periodic_init(void);
67*a288e5a9SJoshua M. Clulow void ddi_periodic_fini(void);
68*a288e5a9SJoshua M. Clulow void ddi_periodic_softintr(int level);
69*a288e5a9SJoshua M. Clulow timeout_t i_timeout(void (*)(void *), void *, hrtime_t, int);
70*a288e5a9SJoshua M. Clulow void i_untimeout(timeout_t);
71*a288e5a9SJoshua M. Clulow 
72*a288e5a9SJoshua M. Clulow #endif	/* _KERNEL */
73*a288e5a9SJoshua M. Clulow 
74*a288e5a9SJoshua M. Clulow #ifdef	__cplusplus
75*a288e5a9SJoshua M. Clulow }
76*a288e5a9SJoshua M. Clulow #endif
77*a288e5a9SJoshua M. Clulow 
78*a288e5a9SJoshua M. Clulow #endif	/* _SYS_DDI_PERIODIC_H */
79