Bluetooth: controller: Add IQ report mem pool management
Add functions that will allow to mangage IQ reports memory pool
e.g. allocate or relase new IQ report nodes.
Signed-off-by: Piotr Pryga <piotr.pryga@nordicsemi.no>
diff --git a/subsys/bluetooth/controller/ll_sw/lll_df.h b/subsys/bluetooth/controller/ll_sw/lll_df.h
index 5e341b3..4da241d 100644
--- a/subsys/bluetooth/controller/ll_sw/lll_df.h
+++ b/subsys/bluetooth/controller/ll_sw/lll_df.h
@@ -9,3 +9,12 @@
/* Provides number of available antennae for Direction Finding */
uint8_t lll_df_ant_num_get(void);
+
+/* Confirm if there is `count` of free IQ report node rx available and return
+ * pointer to first (oldest) one.
+ */
+void *ull_df_iq_report_alloc_peek(uint8_t count);
+/* Dequeue first (oldest) free IQ report node rx. If the node was peeked before
+ * returned pointer equals to peeked one.
+ */
+void *ull_df_iq_report_alloc(void);
diff --git a/subsys/bluetooth/controller/ll_sw/ull_df.c b/subsys/bluetooth/controller/ll_sw/ull_df.c
index 27c45a7..b73ba8c 100644
--- a/subsys/bluetooth/controller/ll_sw/ull_df.c
+++ b/subsys/bluetooth/controller/ll_sw/ull_df.c
@@ -162,6 +162,10 @@
mem_init(mem_link_iq_report.pool, sizeof(memq_link_t),
sizeof(mem_link_iq_report.pool) / sizeof(memq_link_t),
&mem_link_iq_report.free);
+
+ /* Allocate free IQ report node rx */
+ mem_link_iq_report.quota_pdu = IQ_REPORT_CNT;
+ ull_df_rx_iq_report_alloc(UINT8_MAX);
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
return 0;
}
@@ -431,6 +435,74 @@
*max_cte_len = LLL_DF_MAX_CTE_LEN;
}
+#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
+void *ull_df_iq_report_alloc_peek(uint8_t count)
+{
+ if (count > MFIFO_AVAIL_COUNT_GET(iq_report_free)) {
+ return NULL;
+ }
+
+ return MFIFO_DEQUEUE_PEEK(iq_report_free);
+}
+
+void *ull_df_iq_report_alloc_peek_iter(uint8_t *idx)
+{
+ return *(void **)MFIFO_DEQUEUE_ITER_GET(iq_report_free, idx);
+}
+
+void *ull_df_iq_report_alloc(void)
+{
+ return MFIFO_DEQUEUE(iq_report_free);
+}
+
+void ull_df_iq_report_link_release(memq_link_t *link)
+{
+ mem_release(link, &mem_link_iq_report.free);
+}
+
+void ull_df_iq_report_mem_release(struct node_rx_hdr *rx)
+{
+ mem_release(rx, &mem_iq_report.free);
+}
+
+void ull_iq_report_link_inc_quota(int8_t delta)
+{
+ LL_ASSERT(delta <= 0 || mem_link_iq_report.quota_pdu < IQ_REPORT_CNT);
+ mem_link_iq_report.quota_pdu += delta;
+}
+
+void ull_df_rx_iq_report_alloc(uint8_t max)
+{
+ uint8_t idx;
+
+ if (max > mem_link_iq_report.quota_pdu) {
+ max = mem_link_iq_report.quota_pdu;
+ }
+
+ while ((max--) && MFIFO_ENQUEUE_IDX_GET(iq_report_free, &idx)) {
+ memq_link_t *link;
+ struct node_rx_hdr *rx;
+
+ link = mem_acquire(&mem_link_iq_report.free);
+ if (!link) {
+ return;
+ }
+
+ rx = mem_acquire(&mem_iq_report.free);
+ if (!rx) {
+ mem_release(link, &mem_link_iq_report.free);
+ return;
+ }
+
+ rx->link = link;
+
+ MFIFO_BY_IDX_ENQUEUE(iq_report_free, idx, rx);
+
+ ull_iq_report_link_inc_quota(-1);
+ }
+}
+#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
+
#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX)
/* @brief Function releases unused memory for DF advertising configuration.
*
diff --git a/subsys/bluetooth/controller/ll_sw/ull_df.h b/subsys/bluetooth/controller/ll_sw/ull_df.h
index 45843c8..d2959c8 100644
--- a/subsys/bluetooth/controller/ll_sw/ull_df.h
+++ b/subsys/bluetooth/controller/ll_sw/ull_df.h
@@ -23,3 +23,14 @@
int ull_df_init(void);
int ull_df_reset(void);
+
+/* Release link to node_rx_iq_report memory. */
+void ull_df_iq_report_link_release(memq_link_t *link);
+/* Release memory of node_rx_iq_report. */
+void ull_df_iq_report_mem_release(struct node_rx_hdr *rx);
+/* Change quota of free node_iq_report links. Delta may be negative,
+ * then it will decrease number of free link elements.
+ */
+void ull_iq_report_link_inc_quota(int8_t delta);
+/* Allocate node_rx_iq_report in free report PDUs list */
+void ull_df_rx_iq_report_alloc(uint8_t max);