diff --git a/subsys/bluetooth/controller/Kconfig.ll_sw_split b/subsys/bluetooth/controller/Kconfig.ll_sw_split index a7884d963bb..1727d6ab31a 100644 --- a/subsys/bluetooth/controller/Kconfig.ll_sw_split +++ b/subsys/bluetooth/controller/Kconfig.ll_sw_split @@ -284,6 +284,17 @@ config BT_CTRL_ADV_ADI_IN_SCAN_RSP help Enable ADI field in AUX_SCAN_RSP PDU +config BT_CTLR_SCAN_AUX_SYNC_RESERVE_MIN + bool "Use minimal Scan Auxiliary and Periodic Sync PDU time reservation" + depends on (BT_OBSERVER && BT_CTLR_ADV_EXT) || BT_CTLR_SYNC_PERIODIC + default y + help + Use minimal time reservation for Auxiliary and Periodic Sync PDU + reception. A peer device could scheduling multiple advertising sets + in a short duration with small PDUs hence using the minimal time + reservation would avoid skipping closely scheduled reception of + multiple Auxiliary or Periodic Sync PDUs. + config BT_CTLR_SYNC_PERIODIC_SKIP_ON_SCAN_AUX bool "Skip Periodic Sync event on overlap with Extended Scan Event" depends on BT_CTLR_SYNC_PERIODIC diff --git a/subsys/bluetooth/controller/ll_sw/pdu.h b/subsys/bluetooth/controller/ll_sw/pdu.h index f3f5dfc82c9..b1e02538105 100644 --- a/subsys/bluetooth/controller/ll_sw/pdu.h +++ b/subsys/bluetooth/controller/ll_sw/pdu.h @@ -41,6 +41,14 @@ /* Advertisement channel maximum payload size */ #if defined(CONFIG_BT_CTLR_ADV_EXT) + +/* Extended Scan and Periodic Sync Rx PDU time reservation */ +#if defined(CONFIG_BT_CTLR_SCAN_AUX_SYNC_RESERVE_MIN) +#define PDU_AC_EXT_PAYLOAD_RX_SIZE 0U +#else /* !CONFIG_BT_CTLR_SCAN_AUX_SYNC_RESERVE_MIN */ +#define PDU_AC_EXT_PAYLOAD_RX_SIZE PDU_AC_EXT_PAYLOAD_SIZE_MAX +#endif /* !CONFIG_BT_CTLR_SCAN_AUX_SYNC_RESERVE_MIN */ + #define PDU_AC_EXT_HEADER_SIZE_MIN offsetof(struct pdu_adv_com_ext_adv, \ ext_hdr_adv_data) #define PDU_AC_EXT_HEADER_SIZE_MAX 63 diff --git a/subsys/bluetooth/controller/ll_sw/ull_scan_aux.c b/subsys/bluetooth/controller/ll_sw/ull_scan_aux.c index df8d868c15b..454953bf5e0 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_scan_aux.c +++ b/subsys/bluetooth/controller/ll_sw/ull_scan_aux.c @@ -654,7 +654,8 @@ void ull_scan_aux_setup(memq_link_t *link, struct node_rx_hdr *rx) aux->ull.ticks_slot = HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_START_US + ready_delay_us + - PDU_AC_MAX_US(0U, lll_aux->phy) + + PDU_AC_MAX_US(PDU_AC_EXT_PAYLOAD_RX_SIZE, + lll_aux->phy) + EVENT_OVERHEAD_END_US); ticks_slot_offset = MAX(aux->ull.ticks_active_to_start, diff --git a/subsys/bluetooth/controller/ll_sw/ull_sync.c b/subsys/bluetooth/controller/ll_sw/ull_sync.c index 8304c47baaa..98197db94a1 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_sync.c +++ b/subsys/bluetooth/controller/ll_sw/ull_sync.c @@ -761,7 +761,8 @@ void ull_sync_setup(struct ll_scan_set *scan, struct ll_scan_aux_set *aux, sync->ull.ticks_slot = HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_START_US + ready_delay_us + - PDU_AC_MAX_US(0U, lll->phy) + + PDU_AC_MAX_US(PDU_AC_EXT_PAYLOAD_RX_SIZE, + lll->phy) + EVENT_OVERHEAD_END_US); ticks_slot_offset = MAX(sync->ull.ticks_active_to_start,