WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
oal_schedule.h
浏览该文件的文档.
1/*
2 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2022-2022. All rights reserved.
3 * Create: 2022-4-27
4 */
5
6// [ZBL] HCC/OAM
7#ifndef __OAL_SCHEDULE_H__
8#define __OAL_SCHEDULE_H__
9
10#include "oal_spinlock.h"
11#include "oal_time.h"
12#include "oal_timer.h"
13#include "oal_schedule_hcm.h"
14
15#ifdef __cplusplus
16#if __cplusplus
17extern "C" {
18#endif
19#endif
20
21typedef struct _oal_wakelock_stru_ {
22#ifdef CONFIG_HAS_WAKELOCK
23 struct wake_lock wakelock; /* wakelock锁 */
24 osal_spinlock lock; /* wakelock锁操作spinlock锁 */
25#endif
26 osal_ulong lock_count; /* 持有wakelock锁的次数 */
27 osal_ulong locked_addr; /* the locked address */
29
30#define oal_in_interrupt() in_interrupt()
31
33
34#define OAL_S_IRUGO S_IRUGO
35
36#define oal_module_init(_module_name)
37#define oal_module_exit(_module_name)
38#define oal_module_symbol(_symbol)
39
40#ifdef CONFIG_RW_LOCK
41typedef rwlock_t oal_rwlock_stru;
42#else
43typedef struct _oal_rwlock_stru {
44 unsigned long rwlock_id;
46#endif
47
48/*****************************************************************************
49 函 数 名 : oal_rw_lock_init
50 功能描述 : 读写锁初始化,把读写锁设置为1(未锁状态)。
51 输入参数 : lock: 读写锁结构体地址
52 输出参数 : 无
53 返 回 值 :
54 调用函数 :
55 被调函数 :
56
57 修改历史 :
58 1.日 期 : 2012年10月12日
59 修改内容 : 新生成函数
60
61*****************************************************************************/
63{
64#ifdef CONFIG_RW_LOCK
65 rwlock_init(lock);
66#else
67 unref_param(lock);
68#endif
69}
70
71/*****************************************************************************
72 函 数 名 : oal_rw_lock_read_lock
73 功能描述 : 获得指定的读锁
74 输入参数 : lock: 读写锁结构体地址
75 输出参数 : 无
76 返 回 值 :
77 调用函数 :
78 被调函数 :
79
80 修改历史 :
81 1.日 期 : 2012年10月12日
82 修改内容 : 新生成函数
83
84*****************************************************************************/
86{
87#ifdef CONFIG_RW_LOCK
88 read_lock(lock);
89#else
90 unref_param(lock);
91#endif
92}
93
94/*****************************************************************************
95 函 数 名 : oal_rw_lock_read_unlock
96 功能描述 : 释放指定的读锁
97 输入参数 : lock: 读写锁结构体地址
98 输出参数 : 无
99 返 回 值 :
100 调用函数 :
101 被调函数 :
102
103 修改历史 :
104 1.日 期 : 2012年10月12日
105 修改内容 : 新生成函数
106
107*****************************************************************************/
109{
110#ifdef CONFIG_RW_LOCK
111 read_unlock(lock);
112#else
113 unref_param(lock);
114#endif
115}
116
117/*****************************************************************************
118 函 数 名 : oal_rw_lock_write_lock
119 功能描述 : 获得指定的写锁
120 输入参数 : lock: 读写锁结构体地址
121 输出参数 : 无
122 返 回 值 :
123 调用函数 :
124 被调函数 :
125
126 修改历史 :
127 1.日 期 : 2012年10月12日
128 修改内容 : 新生成函数
129
130*****************************************************************************/
132{
133#ifdef CONFIG_RW_LOCK
134 write_lock(lock);
135#else
136 unref_param(lock);
137#endif
138}
139
140/*****************************************************************************
141 函 数 名 : oal_rw_lock_write_unlock
142 功能描述 : 释放指定的写锁
143 输入参数 : lock: 读写锁结构体地址
144 输出参数 : 无
145 返 回 值 :
146 调用函数 :
147 被调函数 :
148
149 修改历史 :
150 1.日 期 : 2012年10月12日
151 修改内容 : 新生成函数
152
153*****************************************************************************/
155{
156#ifdef CONFIG_RW_LOCK
157 write_unlock(lock);
158#else
159 unref_param(lock);
160#endif
161}
162
164{
165#if (defined CONFIG_HAS_WAKELOCK)
166 memset_s((osal_void*)wakelock, sizeof(oal_wakelock_stru), 0, sizeof(oal_wakelock_stru));
167
168 wakeup_source_init(&wakelock->wakelock, name ? name : "wake_lock_null");
169 osal_spin_lock_init(&wakelock->lock);
170 wakelock->lock_count = 0;
171 wakelock->locked_addr = 0;
172 /* add to local list */
173 osal_list_add_tail(&wakelock->list, oal_get_wakelock_head());
174#else
175 unref_param(wakelock);
176 unref_param(name);
177#endif
178}
179
181{
182#if (defined CONFIG_HAS_WAKELOCK)
183 osal_list_del(&wakelock->list);
184 osal_spin_lock_destroy(&wakelock->lock);
185 wakeup_source_trash(&wakelock->wakelock);
186#else
187 unref_param(wakelock);
188#endif
189}
190
192{
193#if (defined CONFIG_HAS_WAKELOCK)
194 osal_ulong flags;
195
196 osal_spin_lock_irqsave(&wakelock->lock, &flags);
197 if (!wakelock->lock_count) {
198 __pm_stay_awake(&wakelock->wakelock);
199 wakelock->locked_addr = (osal_ulong)_RET_IP_;
200 }
201 wakelock->lock_count++;
202 if (OAL_UNLIKELY(wakelock->debug)) {
203 wifi_printf(KERN_DEBUG"wakelock[%s] lockcnt:%lu <==%pf\n", wakelock->wakelock.name, wakelock->lock_count,
204 (osal_void *)_RET_IP_);
205 }
206 osal_spin_unlock_irqrestore(&wakelock->lock, &flags);
207#else
208 unref_param(wakelock);
209#endif
210}
211
213{
214#if (defined CONFIG_HAS_WAKELOCK)
215 osal_ulong flags;
216
217 osal_spin_lock_irqsave(&wakelock->lock, &flags);
218 if (wakelock->lock_count) {
219 wakelock->lock_count--;
220 if (!wakelock->lock_count) {
221 __pm_relax(&wakelock->wakelock);
222 wakelock->locked_addr = (osal_ulong)0x0;
223 }
224
225 if (OAL_UNLIKELY(wakelock->debug)) {
226 wifi_printf(KERN_DEBUG"wakeunlock[%s] lockcnt:%lu <==%pf\n", wakelock->wakelock.name, wakelock->lock_count,
227 (osal_void *)_RET_IP_);
228 }
229 }
230 osal_spin_unlock_irqrestore(&wakelock->lock, &flags);
231#else
232 unref_param(wakelock);
233#endif
234}
235
236#ifdef __cplusplus
237 #if __cplusplus
238 }
239 #endif
240#endif
241
242#endif /* end of oal_schedule.h */
#define unref_param(P)
Definition dmac_misc_type.h:33
#define OAL_INLINE
Definition driver_soc_common.h:47
int osal_spin_lock_init(osal_spinlock *lock)
Initialize a spin lock.
Definition osal_spinlock.c:15
void osal_spin_lock_irqsave(osal_spinlock *lock, unsigned long *flags)
acquire the spin_lock.
Definition osal_spinlock.c:89
void osal_spin_lock_destroy(osal_spinlock *lock)
Destroy the spin_lock.
Definition osal_spinlock.c:116
void osal_spin_unlock_irqrestore(osal_spinlock *lock, unsigned long *flags)
release the spin_lock.
Definition osal_spinlock.c:103
rwlock_t oal_rwlock_stru
Definition oal_schedule.h:53
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_write_unlock(oal_rwlock_stru *lock)
Definition oal_schedule.h:154
OAL_STATIC OAL_INLINE void oal_wake_lock(oal_wakelock_stru *wakelock)
Definition oal_schedule.h:191
osal_u32(* oal_module_func_t)(osal_void)
Definition oal_schedule.h:32
OAL_STATIC OAL_INLINE osal_void oal_wake_lock_exit(oal_wakelock_stru *wakelock)
Definition oal_schedule.h:180
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_write_lock(oal_rwlock_stru *lock)
Definition oal_schedule.h:131
struct _oal_wakelock_stru_ oal_wakelock_stru
struct _oal_rwlock_stru oal_rwlock_stru
OAL_STATIC OAL_INLINE osal_void oal_wake_lock_init(oal_wakelock_stru *wakelock, char *name)
Definition oal_schedule.h:163
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_init(oal_rwlock_stru *lock)
Definition oal_schedule.h:62
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_read_unlock(oal_rwlock_stru *lock)
Definition oal_schedule.h:108
OAL_STATIC OAL_INLINE void oal_wake_unlock(oal_wakelock_stru *wakelock)
Definition oal_schedule.h:212
OAL_STATIC OAL_INLINE osal_void oal_rw_lock_read_lock(oal_rwlock_stru *lock)
Definition oal_schedule.h:85
#define OAL_UNLIKELY(_expr)
Definition oal_plat_type.h:43
struct osal_list_head * oal_get_wakelock_head(void)
#define wifi_printf(fmt, arg...)
Definition oal_util_hcm.h:44
void osal_void
Definition osal_types.h:29
unsigned int osal_u32
Definition osal_types.h:13
unsigned long osal_ulong
Definition osal_types.h:15
errno_t memset_s(void *dest, size_t destMax, int c, size_t count)
#define OAL_STATIC
Definition soc_wifi_service_api.c:30
Definition oal_schedule.h:43
unsigned long rwlock_id
Definition oal_schedule.h:44
Definition oal_schedule.h:35
osal_u32 debug
Definition oal_schedule.h:44
struct wakeup_source wakelock
Definition oal_schedule.h:37
osal_ulong lock_count
Definition oal_schedule.h:42
struct osal_list_head list
Definition oal_schedule.h:39
osal_ulong locked_addr
Definition oal_schedule.h:43
osal_spinlock lock
Definition oal_schedule.h:38
Definition osal_spinlock.h:18