Skip to content

Commit 3e9dffb

Browse files
krish2718nashif
authored andcommitted
modules: nrf_wifi: Use spinlocks
Zephyr provides spinlock APIs which can be locked even during the interrupt context. Signed-off-by: Chaitanya Tata <Chaitanya.Tata@nordicsemi.no>
1 parent 1f1a2e2 commit 3e9dffb

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

modules/nrf_wifi/os/shim.c

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -202,53 +202,66 @@ static void zep_shim_qspi_cpy_to(void *priv, unsigned long addr, const void *src
202202
}
203203
#endif /* !CONFIG_NRF71_ON_IPC */
204204

205+
struct zep_shim_spinlock {
206+
struct k_spinlock lock;
207+
k_spinlock_key_t key;
208+
};
209+
205210
static void *zep_shim_spinlock_alloc(void)
206211
{
207-
struct k_mutex *lock = NULL;
208-
209-
lock = zep_shim_mem_zalloc(sizeof(*lock));
212+
struct zep_shim_spinlock *slock = NULL;
210213

211-
if (!lock) {
214+
slock = k_calloc(sizeof(*slock), sizeof(char));
215+
if (!slock) {
212216
LOG_ERR("%s: Unable to allocate memory for spinlock", __func__);
213217
}
214218

215-
return lock;
219+
return slock;
216220
}
217221

218222
static void zep_shim_spinlock_free(void *lock)
219223
{
220224
#if defined(CONFIG_NRF_WIFI_GLOBAL_HEAP)
221225
k_free(lock);
222-
#else /* CONFIG_NRF_WIFI_GLOBAL_HEAP */
226+
#else
223227
k_heap_free(&wifi_drv_ctrl_mem_pool, lock);
224-
#endif /* CONFIG_NRF_WIFI_GLOBAL_HEAP */
228+
#endif
225229
}
226230

227231
static void zep_shim_spinlock_init(void *lock)
228232
{
229-
k_mutex_init(lock);
233+
/* No explicit initialization needed for k_spinlock_t */
234+
ARG_UNUSED(lock);
230235
}
231236

232237
static void zep_shim_spinlock_take(void *lock)
233238
{
234-
k_mutex_lock(lock, K_FOREVER);
239+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
240+
241+
slock->key = k_spin_lock(&slock->lock);
235242
}
236243

237244
static void zep_shim_spinlock_rel(void *lock)
238245
{
239-
k_mutex_unlock(lock);
246+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
247+
248+
k_spin_unlock(&slock->lock, slock->key);
240249
}
241250

242251
static void zep_shim_spinlock_irq_take(void *lock, unsigned long *flags)
243252
{
253+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
254+
244255
ARG_UNUSED(flags);
245-
k_mutex_lock(lock, K_FOREVER);
256+
slock->key = k_spin_lock(&slock->lock);
246257
}
247258

248259
static void zep_shim_spinlock_irq_rel(void *lock, unsigned long *flags)
249260
{
261+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
262+
250263
ARG_UNUSED(flags);
251-
k_mutex_unlock(lock);
264+
k_spin_unlock(&slock->lock, slock->key);
252265
}
253266

254267
static int zep_shim_pr_dbg(const char *fmt, va_list args)

0 commit comments

Comments
 (0)