Bluetooth: Controller: Fix MFIFO_DEFINE to reduce FLASH usage
Fix MFIFO_DEFINE to reduce FLASH usage by moving the pool outside the struct that is static initialized. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
parent
01be4aff40
commit
8e5c9c3b8a
4 changed files with 73 additions and 69 deletions
|
@ -939,17 +939,18 @@ ll_rx_get_again:
|
|||
link = memq_peek(memq_ll_rx.head, memq_ll_rx.tail, (void **)&rx);
|
||||
if (link) {
|
||||
#if defined(CONFIG_BT_CONN) || defined(CONFIG_BT_CTLR_ADV_ISO)
|
||||
cmplt = tx_cmplt_get(handle, &mfifo_tx_ack.f, rx->ack_last);
|
||||
cmplt = tx_cmplt_get(handle, &mfifo_fifo_tx_ack.f,
|
||||
rx->ack_last);
|
||||
if (!cmplt) {
|
||||
uint8_t f, cmplt_prev, cmplt_curr;
|
||||
uint16_t h;
|
||||
|
||||
cmplt_curr = 0U;
|
||||
f = mfifo_tx_ack.f;
|
||||
f = mfifo_fifo_tx_ack.f;
|
||||
do {
|
||||
cmplt_prev = cmplt_curr;
|
||||
cmplt_curr = tx_cmplt_get(&h, &f,
|
||||
mfifo_tx_ack.l);
|
||||
mfifo_fifo_tx_ack.l);
|
||||
} while ((cmplt_prev != 0U) ||
|
||||
(cmplt_prev != cmplt_curr));
|
||||
#endif /* CONFIG_BT_CONN || CONFIG_BT_CTLR_ADV_ISO */
|
||||
|
@ -1016,7 +1017,8 @@ ll_rx_get_again:
|
|||
#if defined(CONFIG_BT_CONN) || defined(CONFIG_BT_CTLR_ADV_ISO)
|
||||
}
|
||||
} else {
|
||||
cmplt = tx_cmplt_get(handle, &mfifo_tx_ack.f, mfifo_tx_ack.l);
|
||||
cmplt = tx_cmplt_get(handle, &mfifo_fifo_tx_ack.f,
|
||||
mfifo_fifo_tx_ack.l);
|
||||
#endif /* CONFIG_BT_CONN || CONFIG_BT_CTLR_ADV_ISO */
|
||||
}
|
||||
|
||||
|
@ -1714,7 +1716,7 @@ void ll_rx_put(memq_link_t *link, void *rx)
|
|||
/* Serialize Tx ack with Rx enqueue by storing reference to
|
||||
* last element index in Tx ack FIFO.
|
||||
*/
|
||||
rx_hdr->ack_last = mfifo_tx_ack.l;
|
||||
rx_hdr->ack_last = mfifo_fifo_tx_ack.l;
|
||||
#endif /* CONFIG_BT_CONN || CONFIG_BT_CTLR_ADV_ISO */
|
||||
|
||||
/* Enqueue the Rx object */
|
||||
|
@ -2560,8 +2562,8 @@ static uint8_t tx_cmplt_get(uint16_t *handle, uint8_t *first, uint8_t last)
|
|||
uint8_t next;
|
||||
|
||||
next = *first;
|
||||
tx = mfifo_dequeue_iter_get(mfifo_tx_ack.m, mfifo_tx_ack.s,
|
||||
mfifo_tx_ack.n, mfifo_tx_ack.f, last,
|
||||
tx = mfifo_dequeue_iter_get(mfifo_fifo_tx_ack.m, mfifo_tx_ack.s,
|
||||
mfifo_tx_ack.n, mfifo_fifo_tx_ack.f, last,
|
||||
&next);
|
||||
if (!tx) {
|
||||
return 0;
|
||||
|
@ -2676,8 +2678,8 @@ next_ack:
|
|||
#endif /* CONFIG_BT_CTLR_ADV_ISO || CONFIG_BT_CTLR_CONN_ISO */
|
||||
|
||||
*first = next;
|
||||
tx = mfifo_dequeue_iter_get(mfifo_tx_ack.m, mfifo_tx_ack.s,
|
||||
mfifo_tx_ack.n, mfifo_tx_ack.f,
|
||||
tx = mfifo_dequeue_iter_get(mfifo_fifo_tx_ack.m, mfifo_tx_ack.s,
|
||||
mfifo_tx_ack.n, mfifo_fifo_tx_ack.f,
|
||||
last, &next);
|
||||
} while (tx && tx->handle == *handle);
|
||||
|
||||
|
|
|
@ -1384,7 +1384,7 @@ void ull_conn_link_tx_release(void *link)
|
|||
|
||||
uint8_t ull_conn_ack_last_idx_get(void)
|
||||
{
|
||||
return mfifo_conn_ack.l;
|
||||
return mfifo_fifo_conn_ack.l;
|
||||
}
|
||||
|
||||
memq_link_t *ull_conn_ack_peek(uint8_t *ack_last, uint16_t *handle,
|
||||
|
@ -1397,7 +1397,7 @@ memq_link_t *ull_conn_ack_peek(uint8_t *ack_last, uint16_t *handle,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
*ack_last = mfifo_conn_ack.l;
|
||||
*ack_last = mfifo_fifo_conn_ack.l;
|
||||
|
||||
*handle = lll_tx->handle;
|
||||
*tx = lll_tx->node;
|
||||
|
@ -1410,8 +1410,8 @@ memq_link_t *ull_conn_ack_by_last_peek(uint8_t last, uint16_t *handle,
|
|||
{
|
||||
struct lll_tx *lll_tx;
|
||||
|
||||
lll_tx = mfifo_dequeue_get(mfifo_conn_ack.m, mfifo_conn_ack.s,
|
||||
mfifo_conn_ack.f, last);
|
||||
lll_tx = mfifo_dequeue_get(mfifo_fifo_conn_ack.m, mfifo_conn_ack.s,
|
||||
mfifo_fifo_conn_ack.f, last);
|
||||
if (!lll_tx) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -144,10 +144,10 @@ void ull_drift_ticks_get(struct node_rx_event_done *done,
|
|||
* enqueuing pointers to memory elements with associated memq links.
|
||||
*/
|
||||
#define RXFIFO_ALLOC(_name, _count) \
|
||||
ull_rxfifo_alloc(mfifo_##_name.s, mfifo_##_name.n, mfifo_##_name.f, \
|
||||
&mfifo_##_name.l, mfifo_##_name.m, \
|
||||
&mem_pool_##_name.free, &mem_link_##_name.free, \
|
||||
_count)
|
||||
ull_rxfifo_alloc(mfifo_##_name.s, mfifo_##_name.n, \
|
||||
mfifo_fifo_##_name.f, &mfifo_fifo_##_name.l, \
|
||||
mfifo_fifo_##_name.m, &mem_pool_##_name.free, \
|
||||
&mem_link_##_name.free, _count)
|
||||
|
||||
/**
|
||||
* @brief Initialize and allocate MFIFO and pools
|
||||
|
@ -161,8 +161,9 @@ void ull_drift_ticks_get(struct node_rx_event_done *done,
|
|||
* @details Enqueues an RX node back into the FIFO.
|
||||
*/
|
||||
#define RXFIFO_RELEASE(_name, _link, _rx) \
|
||||
ull_rxfifo_release(mfifo_##_name.s, mfifo_##_name.n, mfifo_##_name.f, \
|
||||
&mfifo_##_name.l, mfifo_##_name.m, _link, \
|
||||
ull_rxfifo_release(mfifo_##_name.s, mfifo_##_name.n, \
|
||||
mfifo_fifo_##_name.f, &mfifo_fifo_##_name.l, \
|
||||
mfifo_fifo_##_name.m, _link, \
|
||||
(struct node_rx_hdr *)_rx)
|
||||
|
||||
void ull_rxfifo_alloc(uint8_t s, uint8_t n, uint8_t f, uint8_t *l, uint8_t *m,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2018-2019 Nordic Semiconductor ASA
|
||||
* Copyright (c) 2018-2024 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
@ -41,28 +41,26 @@
|
|||
* different, but it is trailing and sizeof is not applied here, so it can
|
||||
* be a flexible array member.
|
||||
*/
|
||||
#define MFIFO_DEFINE(name, sz, cnt) \
|
||||
struct { \
|
||||
/* TODO: const, optimise RAM use */ \
|
||||
/* TODO: Separate s,n,f,l out into common struct */ \
|
||||
uint16_t const s; /* Stride between elements */ \
|
||||
uint16_t const n; /* Number of buffers */ \
|
||||
uint8_t f; /* First. Read index */ \
|
||||
uint8_t l; /* Last. Write index */ \
|
||||
uint8_t MALIGN(4) m[MROUND(sz) * ((cnt) + 1)]; \
|
||||
} mfifo_##name = { \
|
||||
.n = ((cnt) + 1), \
|
||||
.s = MROUND(sz), \
|
||||
.f = 0, \
|
||||
.l = 0, \
|
||||
}
|
||||
#define MFIFO_DEFINE(name, sz, cnt) \
|
||||
const struct { \
|
||||
uint16_t s; /* Stride between elements */ \
|
||||
uint16_t n; /* Number of buffers */ \
|
||||
} mfifo_##name = { \
|
||||
.s = MROUND(sz), \
|
||||
.n = ((cnt) + 1), \
|
||||
}; \
|
||||
static struct { \
|
||||
uint8_t MALIGN(4) m[MROUND(sz) * ((cnt) + 1)]; \
|
||||
uint8_t f; /* First. Read index */ \
|
||||
uint8_t l; /* Last. Write index */ \
|
||||
} mfifo_fifo_##name;
|
||||
|
||||
/**
|
||||
* @brief Initialize an MFIFO to be empty
|
||||
* @details API 1 and 2. An MFIFO is empty if first == last
|
||||
*/
|
||||
#define MFIFO_INIT(name) \
|
||||
mfifo_##name.f = mfifo_##name.l = 0
|
||||
mfifo_fifo_##name.f = mfifo_fifo_##name.l = 0
|
||||
|
||||
/**
|
||||
* @brief Non-destructive: Allocate buffer from the queue's tail, by index
|
||||
|
@ -79,8 +77,8 @@
|
|||
* @param idx[out] Index of newly allocated buffer
|
||||
* @return True if buffer could be allocated; otherwise false
|
||||
*/
|
||||
static inline bool mfifo_enqueue_idx_get(uint8_t count, uint8_t first, uint8_t last,
|
||||
uint8_t *idx)
|
||||
static inline bool mfifo_enqueue_idx_get(uint8_t count, uint8_t first,
|
||||
uint8_t last, uint8_t *idx)
|
||||
{
|
||||
/* Non-destructive: Advance write-index modulo 'count' */
|
||||
last = last + 1;
|
||||
|
@ -109,15 +107,15 @@ static inline bool mfifo_enqueue_idx_get(uint8_t count, uint8_t first, uint8_t l
|
|||
* @return True if buffer could be allocated; otherwise false
|
||||
*/
|
||||
#define MFIFO_ENQUEUE_IDX_GET(name, i) \
|
||||
mfifo_enqueue_idx_get(mfifo_##name.n, mfifo_##name.f, \
|
||||
mfifo_##name.l, (i))
|
||||
mfifo_enqueue_idx_get(mfifo_##name.n, mfifo_fifo_##name.f, \
|
||||
mfifo_fifo_##name.l, (i))
|
||||
|
||||
/**
|
||||
* @brief Commit a previously allocated buffer (=void-ptr)
|
||||
* @details API 2
|
||||
*/
|
||||
static inline void mfifo_by_idx_enqueue(uint8_t *fifo, uint8_t size, uint8_t idx,
|
||||
void *mem, uint8_t *last)
|
||||
static inline void mfifo_by_idx_enqueue(uint8_t *fifo, uint8_t size,
|
||||
uint8_t idx, void *mem, uint8_t *last)
|
||||
{
|
||||
/* API 2: fifo is array of void-ptrs */
|
||||
void **p = (void **)(fifo + (*last) * size); /* buffer preceding idx */
|
||||
|
@ -132,8 +130,8 @@ static inline void mfifo_by_idx_enqueue(uint8_t *fifo, uint8_t size, uint8_t idx
|
|||
* @details API 2
|
||||
*/
|
||||
#define MFIFO_BY_IDX_ENQUEUE(name, i, mem) \
|
||||
mfifo_by_idx_enqueue(mfifo_##name.m, mfifo_##name.s, (i), \
|
||||
(mem), &mfifo_##name.l)
|
||||
mfifo_by_idx_enqueue(mfifo_fifo_##name.m, mfifo_##name.s, (i), \
|
||||
(mem), &mfifo_fifo_##name.l)
|
||||
|
||||
/**
|
||||
* @brief Non-destructive: Allocate buffer from named queue
|
||||
|
@ -142,8 +140,9 @@ static inline void mfifo_by_idx_enqueue(uint8_t *fifo, uint8_t size, uint8_t idx
|
|||
* To commit the enqueue process, mfifo_enqueue() must be called afterwards
|
||||
* @return Index of newly allocated buffer; only valid if mem != NULL
|
||||
*/
|
||||
static inline uint8_t mfifo_enqueue_get(uint8_t *fifo, uint8_t size, uint8_t count,
|
||||
uint8_t first, uint8_t last, void **mem)
|
||||
static inline uint8_t mfifo_enqueue_get(uint8_t *fifo, uint8_t size,
|
||||
uint8_t count, uint8_t first,
|
||||
uint8_t last, void **mem)
|
||||
{
|
||||
uint8_t idx;
|
||||
|
||||
|
@ -172,9 +171,9 @@ static inline uint8_t mfifo_enqueue_get(uint8_t *fifo, uint8_t size, uint8_t cou
|
|||
* @return Index to the buffer one-ahead of allocated buffer
|
||||
*/
|
||||
#define MFIFO_ENQUEUE_GET(name, mem) \
|
||||
mfifo_enqueue_get(mfifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.n, mfifo_##name.f, \
|
||||
mfifo_##name.l, (mem))
|
||||
mfifo_enqueue_get(mfifo_fifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.n, mfifo_fifo_##name.f, \
|
||||
mfifo_fifo_##name.l, (mem))
|
||||
|
||||
/**
|
||||
* @brief Atomically commit a previously allocated buffer
|
||||
|
@ -201,14 +200,15 @@ static inline void mfifo_enqueue(uint8_t idx, uint8_t *last)
|
|||
* @param idx[in] Index one-ahead of previously allocated buffer
|
||||
*/
|
||||
#define MFIFO_ENQUEUE(name, idx) \
|
||||
mfifo_enqueue((idx), &mfifo_##name.l)
|
||||
mfifo_enqueue((idx), &mfifo_fifo_##name.l)
|
||||
|
||||
/**
|
||||
* @brief Number of available buffers
|
||||
* @details API 1 and 2
|
||||
* Empty if first == last
|
||||
*/
|
||||
static inline uint8_t mfifo_avail_count_get(uint8_t count, uint8_t first, uint8_t last)
|
||||
static inline uint8_t mfifo_avail_count_get(uint8_t count, uint8_t first,
|
||||
uint8_t last)
|
||||
{
|
||||
if (last >= first) {
|
||||
return last - first;
|
||||
|
@ -222,15 +222,15 @@ static inline uint8_t mfifo_avail_count_get(uint8_t count, uint8_t first, uint8_
|
|||
* @details API 1 and 2
|
||||
*/
|
||||
#define MFIFO_AVAIL_COUNT_GET(name) \
|
||||
mfifo_avail_count_get(mfifo_##name.n, mfifo_##name.f, \
|
||||
mfifo_##name.l)
|
||||
mfifo_avail_count_get(mfifo_##name.n, mfifo_fifo_##name.f, \
|
||||
mfifo_fifo_##name.l)
|
||||
|
||||
/**
|
||||
* @brief Non-destructive peek
|
||||
* @details API 1
|
||||
*/
|
||||
static inline void *mfifo_dequeue_get(uint8_t *fifo, uint8_t size, uint8_t first,
|
||||
uint8_t last)
|
||||
static inline void *mfifo_dequeue_get(uint8_t *fifo, uint8_t size,
|
||||
uint8_t first, uint8_t last)
|
||||
{
|
||||
if (first == last) {
|
||||
return NULL;
|
||||
|
@ -244,15 +244,15 @@ static inline void *mfifo_dequeue_get(uint8_t *fifo, uint8_t size, uint8_t first
|
|||
* @details API 1
|
||||
*/
|
||||
#define MFIFO_DEQUEUE_GET(name) \
|
||||
mfifo_dequeue_get(mfifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.f, mfifo_##name.l)
|
||||
mfifo_dequeue_get(mfifo_fifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_fifo_##name.f, mfifo_fifo_##name.l)
|
||||
|
||||
/**
|
||||
* @brief Non-destructive: Peek at head (oldest) buffer
|
||||
* @details API 2
|
||||
*/
|
||||
static inline void *mfifo_dequeue_peek(uint8_t *fifo, uint8_t size, uint8_t first,
|
||||
uint8_t last)
|
||||
static inline void *mfifo_dequeue_peek(uint8_t *fifo, uint8_t size,
|
||||
uint8_t first, uint8_t last)
|
||||
{
|
||||
if (first == last) {
|
||||
return NULL; /* Queue is empty */
|
||||
|
@ -267,11 +267,12 @@ static inline void *mfifo_dequeue_peek(uint8_t *fifo, uint8_t size, uint8_t firs
|
|||
* @details API 2
|
||||
*/
|
||||
#define MFIFO_DEQUEUE_PEEK(name) \
|
||||
mfifo_dequeue_peek(mfifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.f, mfifo_##name.l)
|
||||
mfifo_dequeue_peek(mfifo_fifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_fifo_##name.f, mfifo_fifo_##name.l)
|
||||
|
||||
static inline void *mfifo_dequeue_iter_get(uint8_t *fifo, uint8_t size, uint8_t count,
|
||||
uint8_t first, uint8_t last, uint8_t *idx)
|
||||
static inline void *mfifo_dequeue_iter_get(uint8_t *fifo, uint8_t size,
|
||||
uint8_t count, uint8_t first,
|
||||
uint8_t last, uint8_t *idx)
|
||||
{
|
||||
void *p;
|
||||
uint8_t i;
|
||||
|
@ -297,9 +298,9 @@ static inline void *mfifo_dequeue_iter_get(uint8_t *fifo, uint8_t size, uint8_t
|
|||
}
|
||||
|
||||
#define MFIFO_DEQUEUE_ITER_GET(name, idx) \
|
||||
mfifo_dequeue_iter_get(mfifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.n, mfifo_##name.f, \
|
||||
mfifo_##name.l, (idx))
|
||||
mfifo_dequeue_iter_get(mfifo_fifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.n, mfifo_fifo_##name.f, \
|
||||
mfifo_fifo_##name.l, (idx))
|
||||
|
||||
/**
|
||||
* @brief Dequeue head-buffer from queue of buffers
|
||||
|
@ -345,6 +346,6 @@ static inline void *mfifo_dequeue(uint8_t *fifo, uint8_t size, uint8_t count,
|
|||
* @return Head buffer; or NULL if queue was empty
|
||||
*/
|
||||
#define MFIFO_DEQUEUE(name) \
|
||||
mfifo_dequeue(mfifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.n, mfifo_##name.l, \
|
||||
&mfifo_##name.f)
|
||||
mfifo_dequeue(mfifo_fifo_##name.m, mfifo_##name.s, \
|
||||
mfifo_##name.n, mfifo_fifo_##name.l, \
|
||||
&mfifo_fifo_##name.f)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue