• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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