1
2#ifndef _LINUX_INTERRUPT_H
3#define _LINUX_INTERRUPT_H
4
5#include <linux/config.h>
6#include <linux/kernel.h>
7#include <linux/linkage.h>
8#include <linux/bitops.h>
9#include <linux/preempt.h>
10#include <linux/cpumask.h>
11#include <linux/hardirq.h>
12#include <asm/atomic.h>
13#include <asm/ptrace.h>
14#include <asm/system.h>
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30typedef int irqreturn_t;
31
32#define IRQ_NONE (0)
33#define IRQ_HANDLED (1)
34#define IRQ_RETVAL(x) ((x) != 0)
35
36struct irqaction {
37 irqreturn_t (*handler)(int, void *, struct pt_regs *);
38 unsigned long flags;
39 cpumask_t mask;
40 const char *name;
41 void *dev_id;
42 struct irqaction *next;
43 int irq;
44 struct proc_dir_entry *dir;
45};
46
47extern irqreturn_t no_action(int cpl, void *dev_id, struct pt_regs *regs);
48extern int request_irq(unsigned int,
49 irqreturn_t (*handler)(int, void *, struct pt_regs *),
50 unsigned long, const char *, void *);
51extern void free_irq(unsigned int, void *);
52
53
54#ifdef CONFIG_GENERIC_HARDIRQS
55extern void disable_irq_nosync(unsigned int irq);
56extern void disable_irq(unsigned int irq);
57extern void enable_irq(unsigned int irq);
58#endif
59
60
61
62
63#ifndef CONFIG_SMP
64static inline void __deprecated cli(void)
65{
66 local_irq_disable();
67}
68static inline void __deprecated sti(void)
69{
70 local_irq_enable();
71}
72static inline void __deprecated save_flags(unsigned long *x)
73{
74 local_save_flags(*x);
75}
76#define save_flags(x) save_flags(&x);
77static inline void __deprecated restore_flags(unsigned long x)
78{
79 local_irq_restore(x);
80}
81
82static inline void __deprecated save_and_cli(unsigned long *x)
83{
84 local_irq_save(*x);
85}
86#define save_and_cli(x) save_and_cli(&x)
87#endif
88
89
90#define local_bh_disable() \
91 do { add_preempt_count(SOFTIRQ_OFFSET); barrier(); } while (0)
92#define __local_bh_enable() \
93 do { barrier(); sub_preempt_count(SOFTIRQ_OFFSET); } while (0)
94
95extern void local_bh_enable(void);
96
97
98
99
100
101
102
103enum
104{
105 HI_SOFTIRQ=0,
106 TIMER_SOFTIRQ,
107 NET_TX_SOFTIRQ,
108 NET_RX_SOFTIRQ,
109 SCSI_SOFTIRQ,
110 TASKLET_SOFTIRQ
111};
112
113
114
115
116
117struct softirq_action
118{
119 void (*action)(struct softirq_action *);
120 void *data;
121};
122
123asmlinkage void do_softirq(void);
124extern void open_softirq(int nr, void (*action)(struct softirq_action*), void *data);
125extern void softirq_init(void);
126#define __raise_softirq_irqoff(nr) do { local_softirq_pending() |= 1UL << (nr); } while (0)
127extern void FASTCALL(raise_softirq_irqoff(unsigned int nr));
128extern void FASTCALL(raise_softirq(unsigned int nr));
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151struct tasklet_struct
152{
153 struct tasklet_struct *next;
154 unsigned long state;
155 atomic_t count;
156 void (*func)(unsigned long);
157 unsigned long data;
158};
159
160#define DECLARE_TASKLET(name, func, data) \
161struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
162
163#define DECLARE_TASKLET_DISABLED(name, func, data) \
164struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
165
166
167enum
168{
169 TASKLET_STATE_SCHED,
170 TASKLET_STATE_RUN
171};
172
173#ifdef CONFIG_SMP
174static inline int tasklet_trylock(struct tasklet_struct *t)
175{
176 return !test_and_set_bit(TASKLET_STATE_RUN, &(t)->state);
177}
178
179static inline void tasklet_unlock(struct tasklet_struct *t)
180{
181 smp_mb__before_clear_bit();
182 clear_bit(TASKLET_STATE_RUN, &(t)->state);
183}
184
185static inline void tasklet_unlock_wait(struct tasklet_struct *t)
186{
187 while (test_bit(TASKLET_STATE_RUN, &(t)->state)) { barrier(); }
188}
189#else
190#define tasklet_trylock(t) 1
191#define tasklet_unlock_wait(t) do { } while (0)
192#define tasklet_unlock(t) do { } while (0)
193#endif
194
195extern void FASTCALL(__tasklet_schedule(struct tasklet_struct *t));
196
197static inline void tasklet_schedule(struct tasklet_struct *t)
198{
199 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
200 __tasklet_schedule(t);
201}
202
203extern void FASTCALL(__tasklet_hi_schedule(struct tasklet_struct *t));
204
205static inline void tasklet_hi_schedule(struct tasklet_struct *t)
206{
207 if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
208 __tasklet_hi_schedule(t);
209}
210
211
212static inline void tasklet_disable_nosync(struct tasklet_struct *t)
213{
214 atomic_inc(&t->count);
215 smp_mb__after_atomic_inc();
216}
217
218static inline void tasklet_disable(struct tasklet_struct *t)
219{
220 tasklet_disable_nosync(t);
221 tasklet_unlock_wait(t);
222 smp_mb();
223}
224
225static inline void tasklet_enable(struct tasklet_struct *t)
226{
227 smp_mb__before_atomic_dec();
228 atomic_dec(&t->count);
229}
230
231static inline void tasklet_hi_enable(struct tasklet_struct *t)
232{
233 smp_mb__before_atomic_dec();
234 atomic_dec(&t->count);
235}
236
237extern void tasklet_kill(struct tasklet_struct *t);
238extern void tasklet_kill_immediate(struct tasklet_struct *t, unsigned int cpu);
239extern void tasklet_init(struct tasklet_struct *t,
240 void (*func)(unsigned long), unsigned long data);
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE)
271static inline unsigned long probe_irq_on(void)
272{
273 return 0;
274}
275static inline int probe_irq_off(unsigned long val)
276{
277 return 0;
278}
279static inline unsigned int probe_irq_mask(unsigned long val)
280{
281 return 0;
282}
283#else
284extern unsigned long probe_irq_on(void);
285extern int probe_irq_off(unsigned long);
286extern unsigned int probe_irq_mask(unsigned long);
287#endif
288
289#endif
290