00001 00042 #ifndef ARCH_SOFTIRQ_H_INCLUDED 00043 #define ARCH_SOFTIRQ_H_INCLUDED 00044 00045 #include <bitops.h> 00046 #include <compiler.h> 00047 #include <interrupt.h> 00048 #include <types.h> 00049 00055 00056 typedef bool softirq_flags_t; 00057 00058 static inline void softirq_poll(void) 00059 { 00060 assert(!cpu_irq_is_enabled()); 00061 00062 while (1) { 00063 struct softirq_desc *desc; 00064 unsigned int id; 00065 00066 id = bit_array_find_first_one_bit(softirq_priv_status, 00067 SOFTIRQ_NR_IDS); 00068 if (id >= SOFTIRQ_NR_IDS) 00069 break; 00070 clear_bit(id, softirq_priv_status); 00071 00072 cpu_irq_enable(); 00073 00074 desc = &softirq_priv_table[id]; 00075 assert(desc->handler); 00076 desc->handler(desc->data); 00077 00078 cpu_irq_disable(); 00079 } 00080 } 00081 00082 static inline void softirq_disable(void) 00083 { 00084 /* Nothing to do on AVR since softirqs are run synchronously */ 00085 barrier(); 00086 } 00087 00088 static inline void softirq_enable(void) 00089 { 00090 /* Nothing to do on AVR since softirqs are run synchronously */ 00091 barrier(); 00092 } 00093 00094 static inline bool softirq_is_enabled_flags(softirq_flags_t flags) 00095 { 00096 return flags; 00097 } 00098 00099 static inline bool softirq_is_enabled(void) 00100 { 00101 /* 00102 * Softirq on AVR are always enabled since softirqs are run 00103 * synchronously. 00104 */ 00105 return true; 00106 } 00107 00108 static inline softirq_flags_t softirq_save(void) 00109 { 00110 /* 00111 * Softirq on AVR are always enabled since softirqs are run 00112 * synchronously. 00113 */ 00114 return true; 00115 } 00116 00117 static inline void softirq_restore(softirq_flags_t flags) 00118 { 00119 if (softirq_is_enabled_flags(flags)) 00120 softirq_enable(); 00121 } 00122 00124 00125 #endif /* ARCH_SOFTIRQ_H_INCLUDED */
1.6.3