1219820Sjeff/*-
2219820Sjeff * Copyright (c) 2010 Isilon Systems, Inc.
3219820Sjeff * Copyright (c) 2010 iX Systems, Inc.
4219820Sjeff * Copyright (c) 2010 Panasas, Inc.
5219820Sjeff * All rights reserved.
6219820Sjeff *
7219820Sjeff * Redistribution and use in source and binary forms, with or without
8219820Sjeff * modification, are permitted provided that the following conditions
9219820Sjeff * are met:
10219820Sjeff * 1. Redistributions of source code must retain the above copyright
11219820Sjeff *    notice unmodified, this list of conditions, and the following
12219820Sjeff *    disclaimer.
13219820Sjeff * 2. Redistributions in binary form must reproduce the above copyright
14219820Sjeff *    notice, this list of conditions and the following disclaimer in the
15219820Sjeff *    documentation and/or other materials provided with the distribution.
16219820Sjeff *
17219820Sjeff * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18219820Sjeff * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19219820Sjeff * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20219820Sjeff * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21219820Sjeff * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22219820Sjeff * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23219820Sjeff * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24219820Sjeff * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25219820Sjeff * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26219820Sjeff * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27219820Sjeff */
28219820Sjeff#ifndef _LINUX_TIMER_H_
29219820Sjeff#define _LINUX_TIMER_H_
30219820Sjeff
31219820Sjeff#include <linux/types.h>
32219820Sjeff
33219820Sjeff#include <sys/param.h>
34219820Sjeff#include <sys/kernel.h>
35219820Sjeff#include <sys/callout.h>
36219820Sjeff
37219820Sjeffstruct timer_list {
38219820Sjeff	struct callout	timer_callout;
39219820Sjeff	void		(*function)(unsigned long);
40219820Sjeff        unsigned long	data;
41219820Sjeff};
42219820Sjeff
43219820Sjeff#define	expires	timer_callout.c_time
44219820Sjeff
45219820Sjeffstatic inline void
46219820Sjeff_timer_fn(void *context)
47219820Sjeff{
48219820Sjeff	struct timer_list *timer;
49219820Sjeff
50219820Sjeff	timer = context;
51219820Sjeff	timer->function(timer->data);
52219820Sjeff}
53219820Sjeff
54219820Sjeff#define	setup_timer(timer, func, dat)					\
55219820Sjeffdo {									\
56219820Sjeff	(timer)->function = (func);					\
57219820Sjeff	(timer)->data = (dat);						\
58219820Sjeff	callout_init(&(timer)->timer_callout, CALLOUT_MPSAFE);		\
59219820Sjeff} while (0)
60219820Sjeff
61219820Sjeff#define	init_timer(timer)						\
62219820Sjeffdo {									\
63219820Sjeff	(timer)->function = NULL;					\
64219820Sjeff	(timer)->data = 0;						\
65219820Sjeff	callout_init(&(timer)->timer_callout, CALLOUT_MPSAFE);		\
66219820Sjeff} while (0)
67219820Sjeff
68219820Sjeff#define	mod_timer(timer, expire)					\
69219820Sjeff	callout_reset(&(timer)->timer_callout, (expire) - jiffies,	\
70219820Sjeff	    _timer_fn, (timer))
71219820Sjeff
72219820Sjeff#define	add_timer(timer)						\
73219820Sjeff	callout_reset(&(timer)->timer_callout,				\
74219820Sjeff	    (timer)->timer_callout.c_time - jiffies, _timer_fn, (timer))
75219820Sjeff
76219820Sjeff#define	del_timer(timer)	callout_stop(&(timer)->timer_callout)
77219820Sjeff#define	del_timer_sync(timer)	callout_drain(&(timer)->timer_callout)
78219820Sjeff
79219820Sjeff#define	timer_pending(timer)	callout_pending(&(timer)->timer_callout)
80219820Sjeff
81219820Sjeffstatic inline unsigned long
82219820Sjeffround_jiffies(unsigned long j)
83219820Sjeff{
84219820Sjeff	return roundup(j, hz);
85219820Sjeff}
86219820Sjeff
87219820Sjeff#endif /* _LINUX_TIMER_H_ */
88