Skip to content

Commit 6b48969

Browse files
committed
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 e4348ad commit 6b48969

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

modules/nrf_wifi/os/shim.c

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -202,53 +202,63 @@ 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;
212+
struct zep_shim_spinlock *slock = NULL;
208213

209-
lock = zep_shim_mem_zalloc(sizeof(*lock));
214+
slock = k_calloc(sizeof(*slock), sizeof(char));
210215

211-
if (!lock) {
216+
if (!slock) {
212217
LOG_ERR("%s: Unable to allocate memory for spinlock", __func__);
213218
}
214219

215-
return lock;
220+
return slock;
216221
}
217222

218223
static void zep_shim_spinlock_free(void *lock)
219224
{
220225
#if defined(CONFIG_NRF_WIFI_GLOBAL_HEAP)
221226
k_free(lock);
222-
#else /* CONFIG_NRF_WIFI_GLOBAL_HEAP */
227+
#else
223228
k_heap_free(&wifi_drv_ctrl_mem_pool, lock);
224-
#endif /* CONFIG_NRF_WIFI_GLOBAL_HEAP */
229+
#endif
225230
}
226231

227232
static void zep_shim_spinlock_init(void *lock)
228233
{
229-
k_mutex_init(lock);
234+
/* No explicit initialization needed for k_spinlock_t */
235+
ARG_UNUSED(lock);
230236
}
231237

232238
static void zep_shim_spinlock_take(void *lock)
233239
{
234-
k_mutex_lock(lock, K_FOREVER);
240+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
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+
k_spin_unlock(&slock->lock, slock->key);
240248
}
241249

242250
static void zep_shim_spinlock_irq_take(void *lock, unsigned long *flags)
243251
{
252+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
244253
ARG_UNUSED(flags);
245-
k_mutex_lock(lock, K_FOREVER);
254+
slock->key = k_spin_lock(&slock->lock);
246255
}
247256

248257
static void zep_shim_spinlock_irq_rel(void *lock, unsigned long *flags)
249258
{
259+
struct zep_shim_spinlock *slock = (struct zep_shim_spinlock *)lock;
250260
ARG_UNUSED(flags);
251-
k_mutex_unlock(lock);
261+
k_spin_unlock(&slock->lock, slock->key);
252262
}
253263

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

0 commit comments

Comments
 (0)