| /* |
| * Copyright (c) 2025 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| /** |
| * @brief File containing API definitions for the |
| * SPSC queue management layer of the nRF71 Wi-Fi driver. |
| */ |
| #include <zephyr/kernel.h> |
| #include <zephyr/logging/log.h> |
| |
| LOG_MODULE_DECLARE(wifi_nrf_bus, CONFIG_WIFI_NRF70_BUSLIB_LOG_LEVEL); |
| |
| #include "spsc_qm.h" |
| |
| spsc_queue_t *spsc32_init(uint32_t address, size_t size) |
| { |
| return spsc_pbuf_init((void *)address, size, 0); |
| } |
| |
| bool spsc32_push(spsc_queue_t *queue, uint32_t value) |
| { |
| char *pbuf; |
| uint8_t len = sizeof(uint32_t); |
| |
| if (spsc_pbuf_alloc(queue, len, &pbuf) != len) { |
| LOG_ERR("%s: Failed to allocate buffer", __func__); |
| return false; |
| } |
| |
| memcpy(pbuf, &value, len); |
| spsc_pbuf_commit(queue, len); |
| |
| return true; |
| } |
| |
| bool spsc32_pop(spsc_queue_t *queue, uint32_t *out_value) |
| { |
| char *buf; |
| uint16_t plen = spsc_pbuf_claim(queue, &buf); |
| |
| if (plen == 0) { |
| LOG_ERR("%s: Failed to claim buffer", __func__); |
| return false; |
| } |
| |
| spsc_pbuf_free(queue, plen); |
| |
| *out_value = *((uint32_t *)buf); |
| |
| return true; |
| } |
| |
| bool spsc32_read_head(spsc_queue_t *queue, uint32_t *out_value) |
| { |
| char *buf; |
| uint16_t plen = spsc_pbuf_claim(queue, &buf); |
| |
| if (plen == 0) { |
| LOG_ERR("%s: Failed to claim buffer", __func__); |
| return false; |
| } |
| |
| *out_value = *((uint32_t *)buf); |
| |
| return true; |
| } |
| |
| bool spsc32_is_empty(spsc_queue_t *queue) |
| { |
| char *buf; |
| |
| return spsc_pbuf_claim(queue, &buf) == 0; |
| } |
| |
| bool spsc32_is_full(spsc_queue_t *queue) |
| { |
| char *pbuf; |
| uint8_t len = sizeof(uint32_t); |
| |
| return spsc_pbuf_alloc(queue, len, &pbuf) != len; |
| } |