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