Bluetooth: Controller: Add BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX Kconfig

Add BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX Kconfig to allow the
omit of EVENT_OVERHEAD_START_US and EVENT_OVERHEAD_END_US in
the time reservation calculations.

Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
This commit is contained in:
Vinayak Kariappa Chettimada 2023-05-05 10:15:02 +05:30 committed by Carles Cufí
commit 3c2b1f952c
9 changed files with 152 additions and 24 deletions

View file

@ -632,6 +632,17 @@ config BT_CTLR_CENTRAL_RESERVE_MAX
Note, currently this value is only used to space multiple central
connections and not for actual ticker time reservations.
config BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX
bool "Reserve maximum event overhead in time reservations"
default y
help
Use radio event scheduling CPU time overhead in calculations of event
time reservations.
If this option is disabled, then Peripheral ACL and Peripheral ISO
role will not include CPU time overhead. Other role will continue to
use CPU overheads in their event time reservations.
config BT_CTLR_SLOT_RESERVATION_UPDATE
bool "Update event length reservation after PHY or DLE update"
depends on (BT_CTLR_DATA_LENGTH || BT_CTLR_PHY)

View file

@ -97,6 +97,7 @@ uint8_t ll_create_connection(uint16_t scan_interval, uint16_t scan_window,
uint16_t max_tx_time;
uint16_t max_rx_time;
memq_link_t *link;
uint32_t slot_us;
uint8_t hop;
int err;
@ -360,10 +361,13 @@ conn_is_valid:
#endif /* CONFIG_BT_CTLR_ADV_EXT */
#endif /* CONFIG_BT_CTLR_DATA_LENGTH */
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(
EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US +
ready_delay_us + max_tx_time + EVENT_IFS_US + max_rx_time +
(EVENT_CLOCK_JITTER_US << 1));
/* Calculate event time reservation */
slot_us = max_tx_time + max_rx_time;
slot_us += EVENT_IFS_US + (EVENT_CLOCK_JITTER_US << 1);
slot_us += ready_delay_us;
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(slot_us);
#if defined(CONFIG_BT_CTLR_PRIVACY)
ull_filter_scan_update(filter_policy);

View file

@ -864,9 +864,15 @@ uint8_t ull_central_iso_setup(uint16_t cis_handle,
} else if (CONFIG_BT_CTLR_CENTRAL_SPACING > 0) {
uint32_t cis_offset;
cis_offset = MAX((HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
(EVENT_TICKER_RES_MARGIN_US << 1U) + cig->sync_delay -
cis->sync_delay), *cis_offset_min);
cis_offset = HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
(EVENT_TICKER_RES_MARGIN_US << 1U);
cis_offset += cig->sync_delay - cis->sync_delay;
if (cis_offset < *cis_offset_min) {
cis_offset = *cis_offset_min;
}
cis->offset = cis_offset;
#endif /* CONFIG_BT_CTLR_CENTRAL_SPACING */
@ -942,8 +948,9 @@ int ull_central_iso_cis_offset_get(uint16_t cis_handle,
#endif /* CONFIG_BT_CTLR_CENTRAL_SPACING != 0 */
*cis_offset_min = HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
(EVENT_TICKER_RES_MARGIN_US << 1U) +
cig->sync_delay - cis->sync_delay;
(EVENT_TICKER_RES_MARGIN_US << 1U);
*cis_offset_min += cig->sync_delay - cis->sync_delay;
return 0;
}
@ -984,7 +991,6 @@ static void mfy_cig_offset_get(void *param)
offset_min_us += cig->sync_delay - cis->sync_delay;
conn = ll_conn_get(cis->lll.acl_handle);
conn_interval_us = (uint32_t)conn->lll.interval * CONN_INT_UNIT_US;
while (offset_min_us >= (conn_interval_us + PDU_CIS_OFFSET_MIN_US)) {
offset_min_us -= conn_interval_us;

View file

@ -1233,7 +1233,7 @@ void ull_conn_done(struct node_rx_event_done *done)
#if defined(CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE)
#if defined(CONFIG_BT_CTLR_DATA_LENGTH) || defined(CONFIG_BT_CTLR_PHY)
if (lll->evt_len_upd) {
uint32_t ready_delay, rx_time, tx_time, ticks_slot;
uint32_t ready_delay, rx_time, tx_time, ticks_slot, slot_us;
lll->evt_len_upd = 0;
#if defined(CONFIG_BT_CTLR_PHY)
@ -1257,10 +1257,18 @@ void ull_conn_done(struct node_rx_event_done *done)
tx_time = PDU_DC_MAX_US(lll->dle.eff.max_tx_octets, 0);
rx_time = PDU_DC_MAX_US(lll->dle.eff.max_rx_octets, 0);
#endif /* CONFIG_BT_CTLR_PHY */
ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(
EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US +
ready_delay + EVENT_IFS_US + rx_time + tx_time +
(EVENT_CLOCK_JITTER_US << 1));
/* Calculate event time reservation */
slot_us = tx_time + rx_time;
slot_us += EVENT_IFS_US + (EVENT_CLOCK_JITTER_US << 1);
slot_us += ready_delay;
if (IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX) ||
!conn->lll.role) {
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
}
ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(slot_us);
if (ticks_slot > conn->ull.ticks_slot) {
ticks_slot_plus = ticks_slot - conn->ull.ticks_slot;
} else {

View file

@ -972,7 +972,9 @@ void ull_conn_iso_start(struct ll_conn *conn, uint16_t cis_handle,
/* Below is time reservation for sequential packing */
slot_us = cis->lll.sub_interval * cis->lll.nse;
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
if (IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX)) {
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
}
/* FIXME: How to use ready_delay_us in the time reservation?
* i.e. when CISes use different PHYs? Is that even

View file

@ -89,6 +89,7 @@ void ull_periph_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
uint16_t max_rx_time;
uint16_t win_offset;
memq_link_t *link;
uint32_t slot_us;
uint8_t chan_sel;
void *node;
@ -360,10 +361,19 @@ void ull_periph_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
#endif /* !CONFIG_BT_CTLR_DATA_LENGTH */
#if defined(CONFIG_BT_CTLR_PHY)
ready_delay_us = lll_radio_rx_ready_delay_get(lll->phy_rx, 1);
#else
ready_delay_us = lll_radio_rx_ready_delay_get(0, 0);
#endif
ready_delay_us = lll_radio_rx_ready_delay_get(lll->phy_rx, PHY_FLAGS_S8);
#else /* CONFIG_BT_CTLR_PHY */
ready_delay_us = lll_radio_rx_ready_delay_get(0U, 0U);
#endif /* CONFIG_BT_CTLR_PHY */
/* Calculate event time reservation */
slot_us = max_rx_time + max_tx_time;
slot_us += EVENT_IFS_US + (EVENT_CLOCK_JITTER_US << 1);
slot_us += ready_delay_us;
if (IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX)) {
slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
}
/* TODO: active_to_start feature port */
conn->ull.ticks_active_to_start = 0U;
@ -371,10 +381,7 @@ void ull_periph_setup(struct node_rx_hdr *rx, struct node_rx_ftr *ftr,
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_XTAL_US);
conn->ull.ticks_preempt_to_start =
HAL_TICKER_US_TO_TICKS(EVENT_OVERHEAD_PREEMPT_MIN_US);
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(
EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US +
ready_delay_us + max_rx_time + EVENT_IFS_US + max_tx_time +
(EVENT_CLOCK_JITTER_US << 1));
conn->ull.ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL(slot_us);
ticks_slot_offset = MAX(conn->ull.ticks_active_to_start,
conn->ull.ticks_prepare_to_start);

View file

@ -110,6 +110,10 @@ uint8_t ll_cis_accept(uint16_t handle)
} else {
cis_offset_min = HAL_TICKER_TICKS_TO_US(conn->ull.ticks_slot) +
(EVENT_TICKER_RES_MARGIN_US << 1U);
if (!IS_ENABLED(CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX)) {
cis_offset_min += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US;
}
}
/* Accept request */

View file

@ -0,0 +1,76 @@
CONFIG_BT=y
CONFIG_BT_CTLR=y
CONFIG_BT_LL_SW_SPLIT=y
CONFIG_BT_CTLR_DUP_FILTER_LEN=16
CONFIG_BT_CTLR_CONN_PARAM_REQ=y
CONFIG_BT_CTLR_LE_PING=y
CONFIG_BT_CTLR_PRIVACY=n
CONFIG_BT_CTLR_EXT_SCAN_FP=n
CONFIG_BT_DATA_LEN_UPDATE=n
CONFIG_BT_PHY_UPDATE=y
CONFIG_BT_CTLR_CHAN_SEL_2=y
CONFIG_BT_CTLR_MIN_USED_CHAN=y
CONFIG_BT_CTLR_ADV_EXT=y
CONFIG_BT_CTLR_ADV_PERIODIC=y
CONFIG_BT_CTLR_ADV_ISO=y
CONFIG_BT_CTLR_SYNC_PERIODIC=y
CONFIG_BT_CTLR_SYNC_ISO=y
CONFIG_BT_CTLR_CENTRAL_ISO=y
CONFIG_BT_CTLR_PERIPHERAL_ISO=y
CONFIG_BT_CTLR_DTM_HCI=y
CONFIG_BT_CTLR_ADVANCED_FEATURES=y
CONFIG_BT_CTLR_PHY_2M=y
CONFIG_BT_CTLR_PHY_2M_NRF=y
CONFIG_BT_CTLR_PHY_CODED=y
CONFIG_BT_CTLR_ADV_AUX_PDU_BACK2BACK=y
CONFIG_BT_CTLR_LLL_PRIO=0
CONFIG_BT_CTLR_ULL_HIGH_PRIO=1
CONFIG_BT_CTLR_XTAL_ADVANCED=n
CONFIG_BT_CTLR_SCHED_ADVANCED=y
CONFIG_BT_CTLR_RADIO_ENABLE_FAST=y
CONFIG_BT_CTLR_TIFS_HW=n
CONFIG_BT_CTLR_FAST_ENC=y
CONFIG_BT_CTLR_TX_RETRY_DISABLE=y
CONFIG_BT_CTLR_CONN_RSSI=y
CONFIG_BT_CTLR_ADV_INDICATION=y
CONFIG_BT_CTLR_SCAN_REQ_NOTIFY=y
CONFIG_BT_CTLR_SCAN_REQ_RSSI=y
CONFIG_BT_CTLR_SCAN_INDICATION=y
CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX=n
CONFIG_BT_CTLR_PROFILE_ISR=y
CONFIG_BT_CTLR_DEBUG_PINS=y
CONFIG_BT_CTLR_TEST=y
CONFIG_BT_HCI_VS_EXT=y
CONFIG_BT_HCI_MESH_EXT=n
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_PER_ADV=y
CONFIG_BT_PER_ADV_SYNC=y
CONFIG_BT_ISO_BROADCASTER=y
CONFIG_BT_ISO_SYNC_RECEIVER=y
CONFIG_BT_ISO_CENTRAL=y
CONFIG_BT_ISO_PERIPHERAL=y
CONFIG_BT_SMP=y
CONFIG_BT_SIGNING=y
CONFIG_BT_SMP_SC_ONLY=y
CONFIG_BT_TINYCRYPT_ECC=y
CONFIG_BT_USE_DEBUG_KEYS=y
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
CONFIG_BT_GATT_CLIENT=y
CONFIG_BT_DEBUG_MONITOR_UART=y
CONFIG_BT_HCI_CORE_LOG_LEVEL_DBG=y
CONFIG_BT_CONN_LOG_LEVEL_DBG=y
CONFIG_BT_KEYS_LOG_LEVEL_DBG=y
CONFIG_BT_L2CAP_LOG_LEVEL_DBG=y
CONFIG_BT_SMP_LOG_LEVEL_DBG=y
CONFIG_BT_HCI_DRIVER_LOG_LEVEL_DBG=y
CONFIG_BT_SMP_SELFTEST=y
CONFIG_BT_ATT_LOG_LEVEL_DBG=y
CONFIG_BT_GATT_LOG_LEVEL_DBG=y
CONFIG_BT_BREDR=n
CONFIG_DEBUG=y
CONFIG_FLASH=y
CONFIG_SOC_FLASH_NRF_RADIO_SYNC_TICKER=n
CONFIG_ZTEST=y
CONFIG_ZTEST_NEW_API=y

View file

@ -122,6 +122,16 @@ tests:
integration_platforms:
- nrf52840dk_nrf52840
- nrf52dk_nrf52832
bluetooth.init.test_ctlr_5_x_dbg:
extra_args:
- CONF_FILE=prj_ctlr_5_x_dbg.conf
- DTC_OVERLAY_FILE=pa_lna.overlay
platform_allow:
- nrf52840dk_nrf52840
- nrf52dk_nrf52832
integration_platforms:
- nrf52840dk_nrf52840
- nrf52dk_nrf52832
bluetooth.init.test_ctlr_sw_switch_single_timer:
extra_args:
- CONF_FILE=prj_ctlr.conf