2 * Copyright (c) 2013 Qualcomm Atheros, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted (subject to the limitations in the
7 * disclaimer below) provided that the following conditions are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the
17 * * Neither the name of Qualcomm Atheros nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE
22 * GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT
23 * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
24 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
32 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
33 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 * @ingroup adf_os_public
38 * This file abstracts locking operations.
41 #ifndef _ADF_OS_LOCK_H
42 #define _ADF_OS_LOCK_H
44 #include <adf_os_types.h>
45 #include <adf_os_lock_pvt.h>
48 * @brief Platform spinlock object
50 typedef __adf_os_spinlock_t adf_os_spinlock_t;
53 * @brief Platform mutex object
55 typedef __adf_os_mutex_t adf_os_mutex_t;
58 * @brief Initialize a mutex
60 * @param[in] m mutex to initialize
62 static inline void adf_os_init_mutex(adf_os_mutex_t *m)
64 __adf_os_init_mutex(m);
68 * @brief Take the mutex
70 * @param[in] m mutex to take
72 static inline int adf_os_mutex_acquire(adf_os_mutex_t *m)
74 return (__adf_os_mutex_acquire(m));
78 * @brief Give the mutex
80 * @param[in] m mutex to give
82 static inline void adf_os_mutex_release(adf_os_mutex_t *m)
84 __adf_os_mutex_release(m);
88 * @brief Initialize a spinlock
90 * @param[in] lock spinlock object pointer
93 adf_os_spinlock_init(adf_os_spinlock_t *lock)
95 __adf_os_spinlock_init(lock);
100 * @brief Acquire a spinlock by disabling the interrupts
102 * @param[in] lock spinlock object pointer
103 * @param[out] flags flags used to hold interrupt state
106 adf_os_spin_lock_irq(adf_os_spinlock_t *lock, a_uint32_t *flags)
108 __adf_os_spin_lock_irq(lock,flags);
113 * @brief Release a spinlock & restore the irq
115 * @param[in] lock spinlock object pointer
116 * @param[in] flags flags filled in by @ref adf_os_spin_lock_irq
119 adf_os_spin_unlock_irq(adf_os_spinlock_t *lock, a_uint32_t *flags)
121 __adf_os_spin_unlock_irq(lock,flags);
126 * @brief locks the spinlock mutex in soft irq context
128 * @param[in] lock spinlock object pointer
131 adf_os_spin_lock_bh(adf_os_spinlock_t *lock)
133 __adf_os_spin_lock_bh(lock);
138 * @brief unlocks the spinlock mutex in soft irq context
140 * @param[in] lock spinlock object pointer
143 adf_os_spin_unlock_bh(adf_os_spinlock_t *lock)
145 __adf_os_spin_unlock_bh(lock);
150 * @brief Execute the input function with spinlock held and interrupt disabled.
152 * @param[in] hdl OS handle
153 * @param[in] lock spinlock to be held for the critical region
154 * @param[in] func critical region function that to be executed
155 * @param[in] context context of the critical region function
157 * @return Boolean status returned by the critical region function
159 static inline a_bool_t
160 adf_os_spinlock_irq_exec(adf_os_handle_t hdl,
161 adf_os_spinlock_t *lock,
162 adf_os_irqlocked_func_t func,
165 return __adf_os_spinlock_irq_exec(hdl, lock, func, arg);