Initial cut of the open ath9k htc firmware.
[open-ath9k-htc-firmware.git] / target_firmware / magpie_fw_dev / build / magpie_1_1 / sboot / cmnos / tasklet / src / cmnos_tasklet.c
1 #include "sys_cfg.h"
2
3 #include "athos_api.h"
4 #include "tasklet_api.h"
5
6 ////////////////////////////////////////////
7
8 typedef struct _tasklet_context {
9     A_tasklet_t *schedule_tasks;
10 } tasklet_context;
11
12 static tasklet_context g_tasklet_ctx;
13
14 /* Initialize timer software.  Called once during initialization. */
15 LOCAL void
16 cmnos_tasklet_init(void)
17 {
18     //timer_list = NULL;
19     g_tasklet_ctx.schedule_tasks = NULL;
20 }
21
22 LOCAL void 
23 cmnos_tasklet_init_task(A_TASKLET_FUNC fn, void * arg, A_tasklet_t *tasklet)
24 {
25     tasklet->func = fn;
26     tasklet->arg  = arg;
27     tasklet->next = NULL;
28     tasklet->state = A_TASKLET_STATE_DISABLE;
29 }
30
31 LOCAL void 
32 cmnos_tasklet_schedule(A_tasklet_t *tasklet)
33 {
34     if ( tasklet->state == A_TASKLET_STATE_SCHEDULED ) {
35         return;
36     }
37     
38     tasklet->state = A_TASKLET_STATE_SCHEDULED;
39     if ( g_tasklet_ctx.schedule_tasks == NULL ) {
40         g_tasklet_ctx.schedule_tasks = tasklet;
41     } else {
42         tasklet->next = g_tasklet_ctx.schedule_tasks;
43         g_tasklet_ctx.schedule_tasks = tasklet;
44     }
45 }
46
47 LOCAL void 
48 cmnos_tasklet_disable(A_tasklet_t *tasklet)
49 {
50     A_tasklet_t *tmp;
51     A_tasklet_t *prev = NULL;
52     
53     if ( tasklet->state != A_TASKLET_STATE_SCHEDULED ) {
54         return;
55     }
56         
57     tmp = g_tasklet_ctx.schedule_tasks;
58     while ( tmp != NULL ) {
59         if ( tmp == tasklet ) {
60             if ( prev == NULL ) {
61                 g_tasklet_ctx.schedule_tasks = NULL;
62             } else {
63                 prev->next = tmp->next;    
64             }
65             
66             tasklet->state = A_TASKLET_STATE_DISABLE;
67             break;
68         } else {
69             prev = tmp;
70             tmp = tmp->next;
71         }
72     }
73 }
74
75 LOCAL void
76 cmnos_tasklet_run(void)
77 {
78     A_tasklet_t *tmp;
79     
80     tmp = g_tasklet_ctx.schedule_tasks;
81     while ( tmp != NULL ) {
82         g_tasklet_ctx.schedule_tasks = tmp->next;
83         tmp->next = NULL;
84         
85         tmp->state = A_TASKLET_STATE_RUNNING;
86         tmp->func(tmp->arg);
87         tmp->state = A_TASKLET_STATE_DISABLE;
88         
89         tmp = g_tasklet_ctx.schedule_tasks;
90     }  
91     
92     g_tasklet_ctx.schedule_tasks = NULL;
93 }
94
95 void
96 cmnos_tasklet_module_install(struct tasklet_api *tbl)
97 {
98     tbl->_tasklet_init         = cmnos_tasklet_init;
99     tbl->_tasklet_init_task    = cmnos_tasklet_init_task;
100     tbl->_tasklet_disable      = cmnos_tasklet_disable;
101     tbl->_tasklet_schedule     = cmnos_tasklet_schedule;
102     tbl->_tasklet_run          = cmnos_tasklet_run;
103 }
104
105 //#define CMNOS_TASKLET_UT
106 #ifdef CMNOS_TASKLET_UT
107
108 #include <adf_os_defer.h>
109
110 adf_os_bh_t bh;
111 adf_os_bh_t bh2;
112
113 void test_tasklet(void *arg)
114 {
115     adf_os_bh_t *tmpBH = (adf_os_bh_t *)arg;
116     
117     if ( tmpBH == &bh ) 
118         adf_os_print("Tasklet1 running...\n");
119     else if ( tmpBH == &bh2 ) 
120         adf_os_print("Tasklet2 running...\n");       
121 }
122
123 void 
124 cmnos_tasklet_test()
125 {
126     adf_os_init_bh(NULL, &bh, test_tasklet, &bh);
127     adf_os_init_bh(NULL, &bh2, test_tasklet, &bh2);
128         
129     adf_os_sched_bh(NULL, &bh);
130     adf_os_sched_bh(NULL, &bh2);    
131 }
132
133 #endif
134
135
136