Bluetooth: controller: ULL: Add node_rx_iq_report handling in ULL RX path

Add handling of Direction Finding node_rx_iq_report type in ULL.
This is required to correctly deliver IQ samples collected by
LLL during receive of PDU including CTE.

Signed-off-by: Piotr Pryga <piotr.pryga@nordicsemi.no>
This commit is contained in:
Piotr Pryga 2021-04-01 09:22:11 +02:00 committed by Carles Cufí
parent ff94b9f676
commit 2f4e014f14
2 changed files with 34 additions and 2 deletions

View File

@ -41,6 +41,7 @@
#include "ll_sw/lll_sync.h"
#include "ll_sw/lll_conn.h"
#include "ll_sw/lll_conn_iso.h"
#include "lll/lll_df_types.h"
#include "ll_sw/ull_adv_types.h"
#include "ll_sw/ull_scan_types.h"
@ -5735,6 +5736,11 @@ static void encode_control(struct node_rx_pdu *node_rx,
case NODE_RX_TYPE_SYNC_LOST:
le_per_adv_sync_lost(pdu_data, node_rx, buf);
break;
#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
case NODE_RX_TYPE_IQ_SAMPLE_REPORT:
/* ToDo change to actual handling of the report */
break;
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#endif /* CONFIG_BT_CTLR_ADV_EXT */
#endif /* CONFIG_BT_OBSERVER */
@ -6185,7 +6191,6 @@ uint8_t hci_get_class(struct node_rx_pdu *node_rx)
#if defined(CONFIG_BT_CTLR_PROFILE_ISR)
case NODE_RX_TYPE_PROFILE:
#endif /* CONFIG_BT_CTLR_PROFILE_ISR */
return HCI_CLASS_EVT_DISCARDABLE;
#endif
@ -6208,6 +6213,9 @@ uint8_t hci_get_class(struct node_rx_pdu *node_rx)
case NODE_RX_TYPE_SYNC:
case NODE_RX_TYPE_SYNC_REPORT:
case NODE_RX_TYPE_SYNC_LOST:
#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
case NODE_RX_TYPE_IQ_SAMPLE_REPORT:
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#endif /* CONFIG_BT_OBSERVER */

View File

@ -831,7 +831,12 @@ void ll_rx_dequeue(void)
(void **)&rx);
LL_ASSERT(link);
mem_release(link, &mem_link_rx.free);
#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
if (rx->type != NODE_RX_TYPE_IQ_SAMPLE_REPORT)
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
{
mem_release(link, &mem_link_rx.free);
}
/* handle object specific clean up */
switch (rx->type) {
@ -920,6 +925,13 @@ void ll_rx_dequeue(void)
}
break;
#endif /* CONFIG_BT_BROADCASTER */
#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
case NODE_RX_TYPE_IQ_SAMPLE_REPORT:
{
ull_df_iq_report_link_release(link);
}
break;
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
#endif /* CONFIG_BT_CTLR_ADV_EXT */
#if defined(CONFIG_BT_CONN)
@ -1304,6 +1316,15 @@ void ll_rx_mem_release(void **node_rx)
ull_sync_release(sync);
}
break;
#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
case NODE_RX_TYPE_IQ_SAMPLE_REPORT:
{
ull_iq_report_link_inc_quota(1);
ull_df_iq_report_mem_release(rx_free);
ull_df_rx_iq_report_alloc(1);
}
break;
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#if defined(CONFIG_BT_CONN)
@ -2242,6 +2263,9 @@ static inline int rx_demux_rx(memq_link_t *link, struct node_rx_hdr *rx)
case NODE_RX_TYPE_EXT_AUX_REPORT:
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
case NODE_RX_TYPE_SYNC_REPORT:
#if defined(CONFIG_BT_CTLR_DF_SCAN_CTE_RX)
case NODE_RX_TYPE_IQ_SAMPLE_REPORT:
#endif /* CONFIG_BT_CTLR_DF_SCAN_CTE_RX */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
{
struct pdu_adv *adv;