Bluetooth: Controller: Refactor rx link and node rx release

Refactor implemenation of rx link and node rx release, and
replenish of their quota.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2022-01-22 07:31:03 +05:30 committed by Carles Cufí
parent 6c8ae61bb1
commit bd3ee8608c
2 changed files with 84 additions and 47 deletions

View File

@ -475,7 +475,18 @@ static void perform_lll_reset(void *param);
static inline void *mark_set(void **m, void *param);
static inline void *mark_unset(void **m, void *param);
static inline void *mark_get(void *m);
static inline void rx_alloc(uint8_t max);
static void rx_replenish_all(void);
#if defined(CONFIG_BT_CONN) || \
(defined(CONFIG_BT_OBSERVER) && defined(CONFIG_BT_CTLR_ADV_EXT)) || \
defined(CONFIG_BT_CTLR_ADV_PERIODIC) || \
defined(CONFIG_BT_CTLR_ADV_ISO)
static void rx_release_replenish(struct node_rx_hdr *rx);
static void rx_link_dequeue_release_quota_inc(memq_link_t *link);
#endif /* CONFIG_BT_CONN ||
* (CONFIG_BT_OBSERVER && CONFIG_BT_CTLR_ADV_EXT) ||
* CONFIG_BT_CTLR_ADV_PERIODIC ||
* CONFIG_BT_CTLR_ADV_ISO
*/
static void rx_demux(void *param);
#if defined(CONFIG_BT_CTLR_LOW_LAT_ULL)
static void rx_demux_yield(void);
@ -489,7 +500,8 @@ static inline void rx_demux_conn_tx_ack(uint8_t ack_last, uint16_t handle,
static inline int rx_demux_rx(memq_link_t *link, struct node_rx_hdr *rx);
static inline void rx_demux_event_done(memq_link_t *link,
struct node_rx_hdr *rx);
static inline void ll_rx_link_inc_quota(int8_t delta);
static void ll_rx_link_quota_inc(void);
static void ll_rx_link_quota_dec(void);
static void disabled_cb(void *param);
#if !defined(CONFIG_BT_CTLR_LOW_LAT_ULL)
static void ull_done(void *param);
@ -867,15 +879,8 @@ ll_rx_get_again:
* marked for release
*/
} else if (rx->type == NODE_RX_TYPE_RELEASE) {
(void)memq_dequeue(memq_ll_rx.tail,
&memq_ll_rx.head, NULL);
mem_release(link, &mem_link_rx.free);
ll_rx_link_inc_quota(1);
mem_release(rx, &mem_pdu_rx.free);
rx_alloc(1);
rx_link_dequeue_release_quota_inc(link);
rx_release_replenish(rx);
goto ll_rx_get_again;
#endif /* CONFIG_BT_CONN ||
@ -884,40 +889,28 @@ ll_rx_get_again:
#if defined(CONFIG_BT_CTLR_ADV_PERIODIC)
} else if (rx->type == NODE_RX_TYPE_SYNC_CHM_COMPLETE) {
(void)memq_dequeue(memq_ll_rx.tail,
&memq_ll_rx.head, NULL);
mem_release(link, &mem_link_rx.free);
ll_rx_link_inc_quota(1);
rx_link_dequeue_release_quota_inc(link);
/* Remove Channel Map Update Indication from
* ACAD.
*/
ull_adv_sync_chm_complete(rx);
mem_release(rx, &mem_pdu_rx.free);
rx_alloc(1);
rx_release_replenish(rx);
goto ll_rx_get_again;
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
#if defined(CONFIG_BT_CTLR_ADV_ISO)
} else if (rx->type == NODE_RX_TYPE_BIG_CHM_COMPLETE) {
(void)memq_dequeue(memq_ll_rx.tail,
&memq_ll_rx.head, NULL);
mem_release(link, &mem_link_rx.free);
ll_rx_link_inc_quota(1);
rx_link_dequeue_release_quota_inc(link);
/* Update Channel Map in BIGInfo present in
* Periodic Advertising PDU.
*/
ull_adv_iso_chm_complete(rx);
mem_release(rx, &mem_pdu_rx.free);
rx_alloc(1);
rx_release_replenish(rx);
goto ll_rx_get_again;
#endif /* CONFIG_BT_CTLR_ADV_ISO */
@ -948,7 +941,7 @@ void ll_rx_dequeue(void)
(void **)&rx);
LL_ASSERT(link);
mem_release(link, &mem_link_rx.free);
ll_rx_link_release(link);
/* handle object specific clean up */
switch (rx->type) {
@ -976,7 +969,7 @@ void ll_rx_dequeue(void)
link_free = rx_curr->link;
rx_curr = rx_curr->rx_ftr.extra;
mem_release(link_free, &mem_link_rx.free);
ll_rx_link_release(link_free);
}
}
break;
@ -1083,7 +1076,7 @@ void ll_rx_dequeue(void)
rx_free = adv->node_rx_cc_free;
adv->node_rx_cc_free = NULL;
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_release(rx_free);
}
}
@ -1280,7 +1273,7 @@ void ll_rx_mem_release(void **node_rx)
#if defined(CONFIG_BT_BROADCASTER)
#if defined(CONFIG_BT_CTLR_ADV_EXT)
case NODE_RX_TYPE_EXT_ADV_TERMINATE:
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_release(rx_free);
break;
#if defined(CONFIG_BT_CTLR_ADV_ISO)
@ -1303,7 +1296,7 @@ void ll_rx_mem_release(void **node_rx)
#if defined(CONFIG_BT_CTLR_ADV_EXT)
case NODE_RX_TYPE_EXT_SCAN_TERMINATE:
{
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_release(rx_free);
}
break;
#endif /* CONFIG_BT_CTLR_ADV_EXT */
@ -1319,7 +1312,7 @@ void ll_rx_mem_release(void **node_rx)
#if defined(CONFIG_BT_PERIPHERAL)
} else if (cc->status == BT_HCI_ERR_ADV_TIMEOUT) {
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_release(rx_free);
break;
#endif /* !CONFIG_BT_PERIPHERAL */
@ -1423,8 +1416,8 @@ void ll_rx_mem_release(void **node_rx)
*/
case NODE_RX_TYPE_NONE:
LL_ASSERT(rx_free->type != NODE_RX_TYPE_NONE);
ll_rx_link_inc_quota(1);
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_link_quota_inc();
ll_rx_release(rx_free);
break;
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
@ -1449,7 +1442,7 @@ void ll_rx_mem_release(void **node_rx)
*/
scan = (void *)rx_free->rx_ftr.param;
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_release(rx_free);
/* pick the sync context before scan context
* is cleanup of sync context association.
@ -1493,7 +1486,7 @@ void ll_rx_mem_release(void **node_rx)
(void *)((struct node_rx_pdu *)rx_free)->pdu;
if (!se->status) {
mem_release(rx_free, &mem_pdu_rx.free);
ll_rx_release(rx_free);
break;
}
@ -1554,21 +1547,31 @@ void ll_rx_mem_release(void **node_rx)
*node_rx = rx;
rx_alloc(UINT8_MAX);
rx_replenish_all();
}
static inline void ll_rx_link_inc_quota(int8_t delta)
static void ll_rx_link_quota_update(int8_t delta)
{
LL_ASSERT(delta <= 0 || mem_link_rx.quota_pdu < RX_CNT);
mem_link_rx.quota_pdu += delta;
}
static void ll_rx_link_quota_inc(void)
{
ll_rx_link_quota_update(1);
}
static void ll_rx_link_quota_dec(void)
{
ll_rx_link_quota_update(-1);
}
void *ll_rx_link_alloc(void)
{
return mem_acquire(&mem_link_rx.free);
}
void ll_rx_link_release(void *link)
void ll_rx_link_release(memq_link_t *link)
{
mem_release(link, &mem_link_rx.free);
}
@ -2090,7 +2093,7 @@ static inline int init_reset(void)
/* Allocate rx free buffers */
mem_link_rx.quota_pdu = RX_CNT;
rx_alloc(UINT8_MAX);
rx_replenish_all();
return 0;
}
@ -2156,7 +2159,7 @@ static inline void *mark_get(void *m)
return m;
}
static inline void rx_alloc(uint8_t max)
static void rx_replenish(uint8_t max)
{
uint8_t idx;
@ -2175,7 +2178,7 @@ static inline void rx_alloc(uint8_t max)
rx = mem_acquire(&mem_pdu_rx.free);
if (!rx) {
mem_release(link, &mem_link_rx.free);
ll_rx_link_release(link);
return;
}
@ -2183,7 +2186,7 @@ static inline void rx_alloc(uint8_t max)
MFIFO_BY_IDX_ENQUEUE(pdu_rx_free, idx, rx);
ll_rx_link_inc_quota(-1);
ll_rx_link_quota_dec();
max--;
}
@ -2208,7 +2211,7 @@ static inline void rx_alloc(uint8_t max)
rx = mem_acquire(&mem_pdu_rx.free);
if (!rx) {
mem_release(link, &mem_link_rx.free);
ll_rx_link_release(link);
return;
}
@ -2217,11 +2220,45 @@ static inline void rx_alloc(uint8_t max)
MFIFO_BY_IDX_ENQUEUE(ll_pdu_rx_free, idx, rx);
ll_rx_link_inc_quota(-1);
ll_rx_link_quota_dec();
}
#endif /* CONFIG_BT_CONN */
}
static void rx_replenish_all(void)
{
rx_replenish(UINT8_MAX);
}
#if defined(CONFIG_BT_CONN) || \
(defined(CONFIG_BT_OBSERVER) && defined(CONFIG_BT_CTLR_ADV_EXT)) || \
defined(CONFIG_BT_CTLR_ADV_PERIODIC) || \
defined(CONFIG_BT_CTLR_ADV_ISO)
static void rx_replenish_one(void)
{
rx_replenish(1U);
}
static void rx_release_replenish(struct node_rx_hdr *rx)
{
ll_rx_release(rx);
rx_replenish_one();
}
static void rx_link_dequeue_release_quota_inc(memq_link_t *link)
{
(void)memq_dequeue(memq_ll_rx.tail,
&memq_ll_rx.head, NULL);
ll_rx_link_release(link);
ll_rx_link_quota_inc();
}
#endif /* CONFIG_BT_CONN ||
* (CONFIG_BT_OBSERVER && CONFIG_BT_CTLR_ADV_EXT) ||
* CONFIG_BT_CTLR_ADV_PERIODIC ||
* CONFIG_BT_CTLR_ADV_ISO
*/
static void rx_demux(void *param)
{
memq_link_t *link;

View File

@ -32,7 +32,7 @@ static inline void ull_hdr_init(struct ull_hdr *hdr)
}
void *ll_rx_link_alloc(void);
void ll_rx_link_release(void *link);
void ll_rx_link_release(memq_link_t *link);
void *ll_rx_alloc(void);
void ll_rx_release(void *node_rx);
void *ll_pdu_rx_alloc_peek(uint8_t count);