1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: Implementation for wifi os api
15 */
16
17 #if defined(CONFIG_OS_OSAL)
18
19 #include "stdio.h"
20 #include "securec.h"
21 #include "wifi_osdep.h"
22 #include "std_def.h"
23
24 static osal_event g_wifi_event[(int)WIFI_EVENT_MAX] = {0};
25
os_tick_cnt_get(void)26 unsigned long long os_tick_cnt_get(void)
27 {
28 return osal_get_jiffies();
29 }
30
os_intlock(unsigned int * int_save)31 void os_intlock(unsigned int *int_save)
32 {
33 if (int_save == NULL) {
34 return;
35 }
36 *int_save = osal_irq_lock();
37 }
38
os_intrestore(unsigned int int_save)39 void os_intrestore(unsigned int int_save)
40 {
41 osal_irq_restore(int_save);
42 }
43
44 /* os task api */
os_task_lock(unsigned int * int_save)45 void os_task_lock(unsigned int *int_save)
46 {
47 (void)int_save;
48 osal_kthread_lock();
49 }
50
os_task_unlock(unsigned int int_save)51 void os_task_unlock(unsigned int int_save)
52 {
53 (void)int_save;
54 osal_kthread_unlock();
55 }
56
os_task_delay(unsigned int ms)57 void os_task_delay(unsigned int ms)
58 {
59 (void)osal_msleep(ms);
60 }
61
os_task_create(unsigned int * task_id,wifi_task_attr * attr)62 int os_task_create(unsigned int *task_id, wifi_task_attr *attr)
63 {
64 if (task_id == NULL || attr == NULL) {
65 return WIFI_OS_FAIL;
66 }
67
68 osal_task *task = osal_kthread_create((osal_kthread_handler)attr->task_entry, (void *)attr->arg,
69 attr->task_name, attr->stack_size);
70 if (task == NULL) {
71 WIFI_ERR_LOG("task %s create failed.\n", attr->task_name);
72 return WIFI_OS_FAIL;
73 }
74
75 (void)osal_kthread_set_priority(task, attr->task_prio);
76 *task_id = (uintptr_t)task;
77 return WIFI_OS_OK;
78 }
79
os_task_delete(unsigned int task_id)80 void os_task_delete(unsigned int task_id)
81 {
82 osal_kthread_destroy((osal_task *)task_id, 0);
83 }
84
85 /* os event api */
os_event_init(unsigned int * id,wifi_event_enum num)86 int os_event_init(unsigned int *id, wifi_event_enum num)
87 {
88 if (num >= WIFI_EVENT_MAX || id == NULL) {
89 return WIFI_OS_FAIL;
90 }
91 if (g_wifi_event[num].event != NULL) {
92 goto exit;
93 }
94 if (osal_event_init(&g_wifi_event[num]) != OSAL_SUCCESS) {
95 WIFI_ERR_LOG("event init failed.\n");
96 return WIFI_OS_FAIL;
97 }
98 exit:
99 *id = (unsigned int)num;
100 return WIFI_OS_OK;
101 }
102
os_event_read(unsigned int id,unsigned int mask,unsigned int * event_bits,unsigned int flag,unsigned int timeout_ms)103 int os_event_read(unsigned int id, unsigned int mask, unsigned int *event_bits,
104 unsigned int flag, unsigned int timeout_ms)
105 {
106 if (id >= WIFI_EVENT_MAX || event_bits == NULL) {
107 *event_bits = 0;
108 return WIFI_OS_FAIL;
109 }
110
111 int ret = osal_event_read(&g_wifi_event[id], mask, timeout_ms, flag);
112 /* Currently unable to sense whether it has timed out */
113 if (ret == OSAL_FAILURE) {
114 *event_bits = 0;
115 return WIFI_OS_FAIL;
116 }
117 *event_bits = (unsigned int)ret;
118 return WIFI_OS_OK;
119 }
120
os_event_poll(unsigned int id,unsigned int mask,unsigned int * event_bits,unsigned int flag)121 int os_event_poll(unsigned int id, unsigned int mask, unsigned int *event_bits, unsigned int flag)
122 {
123 if (id >= WIFI_EVENT_MAX || event_bits == NULL) {
124 *event_bits = 0;
125 return WIFI_OS_FAIL;
126 }
127
128 /* osal dont support event poll */
129 return os_event_read(id, mask, event_bits, flag, 0);
130 }
131
os_event_write(unsigned int id,unsigned int events)132 int os_event_write(unsigned int id, unsigned int events)
133 {
134 if (id >= WIFI_EVENT_MAX) {
135 return WIFI_OS_FAIL;
136 }
137
138 if (osal_event_write(&g_wifi_event[id], events) != OSAL_SUCCESS) {
139 WIFI_ERR_LOG("event write failed.\n");
140 return WIFI_OS_FAIL;
141 }
142 return WIFI_OS_OK;
143 }
144
os_event_clear(unsigned int id,unsigned int events)145 int os_event_clear(unsigned int id, unsigned int events)
146 {
147 if (id >= WIFI_EVENT_MAX) {
148 return WIFI_OS_FAIL;
149 }
150
151 if (osal_event_clear(&g_wifi_event[id], ~events) != OSAL_SUCCESS) {
152 WIFI_ERR_LOG("event clear failed.\n");
153 return WIFI_OS_FAIL;
154 }
155 return WIFI_OS_OK;
156 }
157
os_event_del(unsigned int id)158 int os_event_del(unsigned int id)
159 {
160 if (id >= WIFI_EVENT_MAX) {
161 return WIFI_OS_FAIL;
162 }
163
164 if (osal_event_destroy(&g_wifi_event[id]) != OSAL_SUCCESS) {
165 WIFI_ERR_LOG("event destroy failed.\n");
166 return WIFI_OS_FAIL;
167 }
168 return WIFI_OS_OK;
169 }
170
171 /* os mux api */
os_mux_create(unsigned int * mux_id)172 int os_mux_create(unsigned int *mux_id)
173 {
174 if (mux_id == NULL) {
175 return WIFI_OS_FAIL;
176 }
177
178 osal_mutex *mux = osal_kmalloc(sizeof(osal_mutex), OSAL_GFP_KERNEL);
179 if (mux == NULL) {
180 return WIFI_OS_FAIL;
181 }
182 (void)memset_s(mux, sizeof(osal_mutex), 0, sizeof(osal_mutex));
183
184 if (osal_mutex_init(mux) != OSAL_SUCCESS) {
185 osal_kfree(mux);
186 WIFI_ERR_LOG("mux init failed.\n");
187 return WIFI_OS_FAIL;
188 }
189 *mux_id = (unsigned int)(uintptr_t)mux;
190 return WIFI_OS_OK;
191 }
192
os_mux_pend(unsigned int mux_id,unsigned int timeout_ms)193 int os_mux_pend(unsigned int mux_id, unsigned int timeout_ms)
194 {
195 osal_mutex *mux = (osal_mutex *)(uintptr_t)(mux_id);
196
197 if (osal_mutex_lock_timeout(mux, timeout_ms) != OSAL_SUCCESS) {
198 WIFI_ERR_LOG("mux pend failed.\n");
199 return WIFI_OS_FAIL;
200 }
201 return WIFI_OS_OK;
202 }
203
os_mux_post(unsigned int mux_id)204 int os_mux_post(unsigned int mux_id)
205 {
206 osal_mutex *mux = (osal_mutex *)(uintptr_t)(mux_id);
207
208 osal_mutex_unlock(mux);
209
210 return WIFI_OS_OK;
211 }
212
os_mux_delete(unsigned int mux_id)213 int os_mux_delete(unsigned int mux_id)
214 {
215 osal_mutex *mux = (osal_mutex *)(uintptr_t)(mux_id);
216
217 osal_mutex_destroy(mux);
218 osal_kfree(mux);
219
220 return WIFI_OS_OK;
221 }
222
223 #endif /* CONFIG_OS_OSAL */
224