From bd3ee8608ca4e1c30b46e4fa303465aa62ca7ed9 Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Sat, 22 Jan 2022 07:31:03 +0530 Subject: [PATCH] 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 --- subsys/bluetooth/controller/ll_sw/ull.c | 129 +++++++++++------- .../bluetooth/controller/ll_sw/ull_internal.h | 2 +- 2 files changed, 84 insertions(+), 47 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/ull.c b/subsys/bluetooth/controller/ll_sw/ull.c index 1d6fc2e7255..0e7faacaba8 100644 --- a/subsys/bluetooth/controller/ll_sw/ull.c +++ b/subsys/bluetooth/controller/ll_sw/ull.c @@ -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; diff --git a/subsys/bluetooth/controller/ll_sw/ull_internal.h b/subsys/bluetooth/controller/ll_sw/ull_internal.h index 7af79c1033d..7f1ed3cdd06 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_internal.h +++ b/subsys/bluetooth/controller/ll_sw/ull_internal.h @@ -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);