1 /* Public domain. */ 2 3 #ifndef _LINUX_INTERRUPT_H 4 #define _LINUX_INTERRUPT_H 5 6 #include <sys/task.h> 7 8 #include <machine/intr.h> 9 #include <linux/hardirq.h> 10 #include <linux/irqflags.h> 11 #include <linux/atomic.h> 12 #include <linux/compiler.h> 13 #include <linux/irqreturn.h> 14 15 #define IRQF_SHARED 0 16 17 #define request_irq(irq, hdlr, flags, name, dev) (0) 18 #define free_irq(irq, dev) 19 20 typedef irqreturn_t (*irq_handler_t)(int, void *); 21 22 struct tasklet_struct { 23 void (*func)(unsigned long); 24 unsigned long data; 25 unsigned long state; 26 atomic_t count; 27 struct task task; 28 }; 29 30 #define TASKLET_STATE_SCHED 1 31 #define TASKLET_STATE_RUN 0 32 33 extern struct taskq *taskletq; 34 void tasklet_run(void *); 35 36 static inline void 37 tasklet_init(struct tasklet_struct *ts, void (*func)(unsigned long), 38 unsigned long data) 39 { 40 ts->func = func; 41 ts->data = data; 42 ts->state = 0; 43 atomic_set(&ts->count, 0); 44 task_set(&ts->task, tasklet_run, ts); 45 } 46 47 static inline int 48 tasklet_trylock(struct tasklet_struct *ts) 49 { 50 return !test_and_set_bit(TASKLET_STATE_RUN, &ts->state); 51 } 52 53 static inline void 54 tasklet_unlock(struct tasklet_struct *ts) 55 { 56 smp_mb__before_atomic(); 57 clear_bit(TASKLET_STATE_RUN, &ts->state); 58 } 59 60 static inline void 61 tasklet_unlock_wait(struct tasklet_struct *ts) 62 { 63 while (test_bit(TASKLET_STATE_RUN, &ts->state)) 64 barrier(); 65 } 66 67 static inline void 68 tasklet_kill(struct tasklet_struct *ts) 69 { 70 clear_bit(TASKLET_STATE_SCHED, &ts->state); 71 task_del(taskletq, &ts->task); 72 tasklet_unlock_wait(ts); 73 } 74 75 static inline void 76 tasklet_schedule(struct tasklet_struct *ts) 77 { 78 set_bit(TASKLET_STATE_SCHED, &ts->state); 79 task_add(taskletq, &ts->task); 80 } 81 82 static inline void 83 tasklet_hi_schedule(struct tasklet_struct *ts) 84 { 85 set_bit(TASKLET_STATE_SCHED, &ts->state); 86 task_add(taskletq, &ts->task); 87 } 88 89 static inline void 90 tasklet_disable_nosync(struct tasklet_struct *ts) 91 { 92 atomic_inc(&ts->count); 93 smp_mb__after_atomic(); 94 } 95 96 static inline void 97 tasklet_enable(struct tasklet_struct *ts) 98 { 99 smp_mb__before_atomic(); 100 atomic_dec(&ts->count); 101 } 102 103 #endif 104