From 26363ee0115c0a263b831fae2b5735ccc042a438 Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Thu, 11 Jul 2024 07:32:52 +0200 Subject: [PATCH] Bluetooth: Controller: Ext Adv Auxiliary PDUs with ticks_slot_window Add implementation for Extended Advertising Auxiliary PDUs to use ticks slot window feature. Signed-off-by: Vinayak Kariappa Chettimada --- .../bluetooth/controller/Kconfig.ll_sw_split | 7 ++++ .../bluetooth/controller/ll_sw/ull_adv_aux.c | 36 +++++++++++++++---- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/subsys/bluetooth/controller/Kconfig.ll_sw_split b/subsys/bluetooth/controller/Kconfig.ll_sw_split index 9e6f07456fa0bbb..f4fadeb3ae62fed 100644 --- a/subsys/bluetooth/controller/Kconfig.ll_sw_split +++ b/subsys/bluetooth/controller/Kconfig.ll_sw_split @@ -430,6 +430,13 @@ config BT_CTLR_ADV_RESERVE_MAX corresponding to the Advertising Data present at the time of the start/enable of Advertising is used. +config BT_CTLR_ADV_AUX_SLOT_WINDOW + bool "Reschedule Extended Advertising Auxiliary PDUs" + depends on BT_BROADCASTER && BT_CTLR_ADV_EXT + select BT_TICKER_EXT + help + Reschedule Extended Advertising Auxiliary PDUs. + config BT_CTLR_ADV_ISO_RESERVE_MAX bool "Use maximum Broadcast ISO event time reservation" depends on BT_CTLR_ADV_ISO diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c b/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c index 482239a617a4a01..39c16be7d23e9fc 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c +++ b/subsys/bluetooth/controller/ll_sw/ull_adv_aux.c @@ -71,11 +71,18 @@ static void ticker_cb(uint32_t ticks_at_expire, uint32_t ticks_drift, static struct ll_adv_aux_set ll_adv_aux_pool[CONFIG_BT_CTLR_ADV_AUX_SET]; static void *adv_aux_free; -#if defined(CONFIG_BT_CTLR_ADV_PERIODIC) && defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO) +#if defined(CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW) || \ + (defined(CONFIG_BT_CTLR_ADV_PERIODIC) && \ + defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO)) +#if defined(CONFIG_BT_CTLR_ADV_PERIODIC) && \ + defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO) static void ticker_update_op_cb(uint32_t status, void *param); +#endif /* CONFIG_BT_CTLR_ADV_PERIODIC && CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ static struct ticker_ext ll_adv_aux_ticker_ext[CONFIG_BT_CTLR_ADV_AUX_SET]; -#endif /* !CONFIG_BT_CTLR_ADV_PERIODIC && CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ +#endif /* CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW || + * (CONFIG_BT_CTLR_ADV_PERIODIC && CONFIG_BT_TICKER_EXT_EXPIRE_INFO) + */ #endif /* (CONFIG_BT_CTLR_ADV_AUX_SET > 0) */ static uint16_t did_unique[PDU_ADV_SID_COUNT]; @@ -2600,6 +2607,11 @@ uint32_t ull_adv_aux_start(struct ll_adv_aux_set *aux, uint32_t ticks_anchor, aux_handle = ull_adv_aux_handle_get(aux); interval_us = aux->interval * PERIODIC_INT_UNIT_US; +#if defined(CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW) + ll_adv_aux_ticker_ext[aux_handle].ticks_slot_window = + ULL_ADV_RANDOM_DELAY + aux->ull.ticks_slot; +#endif /* CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW */ + #if defined(CONFIG_BT_CTLR_ADV_PERIODIC) && defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO) if (aux->lll.adv->sync) { const struct ll_adv_sync_set *sync = HDR_LLL2ULL(aux->lll.adv->sync); @@ -2612,14 +2624,22 @@ uint32_t ull_adv_aux_start(struct ll_adv_aux_set *aux, uint32_t ticks_anchor, } ll_adv_aux_ticker_ext[aux_handle].ext_timeout_func = ticker_cb; +#endif /* !CONFIG_BT_CTLR_ADV_PERIODIC || !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ +#if defined(CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW) || \ + (defined(CONFIG_BT_CTLR_ADV_PERIODIC) && \ + defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO)) ret_cb = TICKER_STATUS_BUSY; ret = ticker_start_ext( -#else /* !CONFIG_BT_CTLR_ADV_PERIODIC || !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ +#else /* !CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW && + * !(CONFIG_BT_CTLR_ADV_PERIODIC && CONFIG_BT_TICKER_EXT_EXPIRE_INFO) + */ ret_cb = TICKER_STATUS_BUSY; ret = ticker_start( -#endif /* !CONFIG_BT_CTLR_ADV_PERIODIC || !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ +#endif /* !CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW && + * !(CONFIG_BT_CTLR_ADV_PERIODIC && CONFIG_BT_TICKER_EXT_EXPIRE_INFO) + */ TICKER_INSTANCE_ID_CTLR, TICKER_USER_ID_THREAD, (TICKER_ID_ADV_AUX_BASE + aux_handle), ticks_anchor, 0U, @@ -2628,10 +2648,14 @@ uint32_t ull_adv_aux_start(struct ll_adv_aux_set *aux, uint32_t ticks_anchor, (aux->ull.ticks_slot + ticks_slot_overhead), ticker_cb, aux, ull_ticker_status_give, (void *)&ret_cb -#if defined(CONFIG_BT_CTLR_ADV_PERIODIC) && defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO) +#if defined(CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW) || \ + (defined(CONFIG_BT_CTLR_ADV_PERIODIC) && \ + defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO)) , &ll_adv_aux_ticker_ext[aux_handle] -#endif /* !CONFIG_BT_CTLR_ADV_PERIODIC || !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */ +#endif /* CONFIG_BT_CTLR_ADV_AUX_SLOT_WINDOW || + * (CONFIG_BT_CTLR_ADV_PERIODIC && CONFIG_BT_TICKER_EXT_EXPIRE_INFO) + */ ); ret = ull_ticker_status_take(ret, &ret_cb);