Skip to content

Commit 31efdfb

Browse files
cvinayakrlubos
authored andcommitted
[nrf fromtree] Bluetooth: Controller: Fix ticker to prefer ticker node started
Fix ticker implementation to prefer to keep ticker node started in case of race condition to start and stop. Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no> (cherry picked from commit f4e05e3) Signed-off-by: Vinayak Kariappa Chettimada <vich@nordicsemi.no>
1 parent 5951daa commit 31efdfb

File tree

4 files changed

+102
-1
lines changed

4 files changed

+102
-1
lines changed

subsys/bluetooth/controller/Kconfig.ll_sw_split

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ config BT_LLL_VENDOR_NORDIC
5555
select BT_TICKER_REMAINDER_GET if BT_BROADCASTER && BT_CTLR_ADV_EXT
5656
select BT_TICKER_LAZY_GET if BT_CTLR_ADV_PERIODIC || BT_CTLR_CENTRAL_ISO
5757

58+
select BT_TICKER_PREFER_START_BEFORE_STOP if BT_TICKER_SLOT_AGNOSTIC
59+
5860
default y
5961
help
6062
Use Nordic Lower Link Layer implementation.
@@ -1036,6 +1038,21 @@ config BT_TICKER_SLOT_AGNOSTIC
10361038
reservations and collision handling, and operates as a simple
10371039
multi-instance programmable timer.
10381040

1041+
config BT_TICKER_PREFER_START_BEFORE_STOP
1042+
bool "Ticker prefer start before stop request"
1043+
help
1044+
Under race conditions wherein for a given ticker node if a number of
1045+
start and stop operations are enqueued towards ticker_job by a said
1046+
user execution context, then start operations is preferred to be
1047+
processed before stop operations.
1048+
1049+
Without this option, the default behavior is to defer all start
1050+
requests after all stop requests enqueued by all user context having
1051+
been processed. The rationale for default behavior being that under
1052+
race conditions, start followed by stop requests, or start before stop
1053+
requests, the said ticker node is always scheduled and at timeout the
1054+
execution context can take decision based on its execution state.
1055+
10391056
config BT_CTLR_JIT_SCHEDULING
10401057
bool "Just-in-Time Scheduling"
10411058
select BT_TICKER_SLOT_AGNOSTIC

subsys/bluetooth/controller/ticker/ticker.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ struct ticker_node {
5555
uint8_t force:1; /* If non-zero, node timeout should
5656
* be forced at next expiration
5757
*/
58+
#if defined(CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP)
5859
uint8_t start_pending:1; /* If non-zero, start is pending for
5960
* bottom half of ticker_job.
6061
*/
62+
#endif /* CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP */
6163
uint32_t ticks_periodic; /* If non-zero, interval
6264
* between expirations
6365
*/
@@ -1907,12 +1909,15 @@ static inline uint8_t ticker_job_list_manage(struct ticker_instance *instance,
19071909

19081910
/* if op is start, then skip update and stop ops */
19091911
if (user_op->op < TICKER_USER_OP_TYPE_UPDATE) {
1912+
#if defined(CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP)
19101913
if (user_op->op == TICKER_USER_OP_TYPE_START) {
19111914
/* Set start pending to validate a
19121915
* successive, inline stop operation.
19131916
*/
19141917
ticker->start_pending = 1U;
19151918
}
1919+
#endif /* CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP */
1920+
19161921
continue;
19171922
}
19181923

@@ -1923,7 +1928,10 @@ static inline uint8_t ticker_job_list_manage(struct ticker_instance *instance,
19231928
* set status and continue.
19241929
*/
19251930
if ((user_op->op > TICKER_USER_OP_TYPE_STOP_ABS) ||
1926-
(((state == 0U) && !ticker->start_pending) &&
1931+
((state == 0U) &&
1932+
#if defined(CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP)
1933+
!ticker->start_pending &&
1934+
#endif /* CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP */
19271935
(user_op->op != TICKER_USER_OP_TYPE_YIELD_ABS)) ||
19281936
((user_op->op == TICKER_USER_OP_TYPE_UPDATE) &&
19291937
(user_op->params.update.ticks_drift_plus == 0U) &&
@@ -2731,7 +2739,9 @@ static inline void ticker_job_list_insert(struct ticker_instance *instance,
27312739
continue;
27322740
}
27332741

2742+
#if defined(CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP)
27342743
ticker->start_pending = 0U;
2744+
#endif /* CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP */
27352745

27362746
if (((ticker->req -
27372747
ticker->ack) & 0xff) != 0U) {
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
CONFIG_BT=y
2+
CONFIG_BT_CTLR=y
3+
CONFIG_BT_LL_SW_SPLIT=y
4+
CONFIG_BT_CTLR_DUP_FILTER_LEN=16
5+
CONFIG_BT_CTLR_CONN_PARAM_REQ=y
6+
CONFIG_BT_CTLR_LE_PING=y
7+
CONFIG_BT_CTLR_PRIVACY=n
8+
CONFIG_BT_CTLR_EXT_SCAN_FP=n
9+
CONFIG_BT_DATA_LEN_UPDATE=n
10+
CONFIG_BT_PHY_UPDATE=y
11+
CONFIG_BT_CTLR_CHAN_SEL_2=y
12+
CONFIG_BT_CTLR_MIN_USED_CHAN=y
13+
CONFIG_BT_CTLR_ADV_EXT=y
14+
CONFIG_BT_CTLR_DTM_HCI=y
15+
CONFIG_BT_CTLR_ADVANCED_FEATURES=y
16+
CONFIG_BT_CTLR_PHY_2M=y
17+
CONFIG_BT_CTLR_PHY_2M_NRF=y
18+
CONFIG_BT_CTLR_PHY_CODED=y
19+
CONFIG_BT_CTLR_ADV_AUX_PDU_BACK2BACK=y
20+
CONFIG_BT_CTLR_LLL_PRIO=0
21+
CONFIG_BT_CTLR_ULL_HIGH_PRIO=1
22+
CONFIG_BT_CTLR_XTAL_ADVANCED=n
23+
CONFIG_BT_CTLR_SCHED_ADVANCED=n
24+
CONFIG_BT_CTLR_RADIO_ENABLE_FAST=y
25+
CONFIG_BT_CTLR_TIFS_HW=n
26+
CONFIG_BT_CTLR_FAST_ENC=y
27+
CONFIG_BT_CTLR_TX_RETRY_DISABLE=y
28+
CONFIG_BT_CTLR_CONN_RSSI=y
29+
CONFIG_BT_CTLR_ADV_INDICATION=y
30+
CONFIG_BT_CTLR_SCAN_REQ_NOTIFY=y
31+
CONFIG_BT_CTLR_SCAN_REQ_RSSI=y
32+
CONFIG_BT_CTLR_SCAN_INDICATION=y
33+
CONFIG_BT_CTLR_PROFILE_ISR=y
34+
CONFIG_BT_CTLR_DEBUG_PINS=y
35+
CONFIG_BT_CTLR_TEST=y
36+
CONFIG_BT_TICKER_EXT=n
37+
CONFIG_BT_TICKER_SLOT_AGNOSTIC=y
38+
CONFIG_BT_TICKER_PREFER_START_BEFORE_STOP=y
39+
CONFIG_BT_HCI_VS_EXT=y
40+
CONFIG_BT_HCI_MESH_EXT=n
41+
CONFIG_BT_PERIPHERAL=y
42+
CONFIG_BT_CENTRAL=y
43+
CONFIG_BT_SMP=y
44+
CONFIG_BT_SIGNING=y
45+
CONFIG_BT_SMP_SC_ONLY=y
46+
CONFIG_BT_TINYCRYPT_ECC=y
47+
CONFIG_BT_USE_DEBUG_KEYS=y
48+
CONFIG_BT_L2CAP_DYNAMIC_CHANNEL=y
49+
CONFIG_BT_GATT_CLIENT=y
50+
CONFIG_BT_DEBUG_MONITOR_UART=y
51+
CONFIG_BT_HCI_CORE_LOG_LEVEL_DBG=y
52+
CONFIG_BT_CONN_LOG_LEVEL_DBG=y
53+
CONFIG_BT_KEYS_LOG_LEVEL_DBG=y
54+
CONFIG_BT_L2CAP_LOG_LEVEL_DBG=y
55+
CONFIG_BT_SMP_LOG_LEVEL_DBG=y
56+
CONFIG_BT_HCI_DRIVER_LOG_LEVEL_DBG=y
57+
CONFIG_BT_SMP_SELFTEST=y
58+
CONFIG_BT_ATT_LOG_LEVEL_DBG=y
59+
CONFIG_BT_GATT_LOG_LEVEL_DBG=y
60+
CONFIG_BT_BREDR=n
61+
CONFIG_DEBUG=y
62+
CONFIG_FLASH=y
63+
CONFIG_SOC_FLASH_NRF_RADIO_SYNC_TICKER=n
64+
CONFIG_ZTEST=y
65+
CONFIG_ZTEST_NEW_API=y

tests/bluetooth/init/testcase.yaml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,15 @@ tests:
122122
integration_platforms:
123123
- nrf52840dk_nrf52840
124124
- nrf52dk_nrf52832
125+
bluetooth.init.test_ctlr_ticker:
126+
extra_args:
127+
- CONF_FILE=prj_ctlr_ticker.conf
128+
platform_allow:
129+
- nrf52840dk_nrf52840
130+
- nrf52dk_nrf52832
131+
integration_platforms:
132+
- nrf52840dk_nrf52840
133+
- nrf52dk_nrf52832
125134
bluetooth.init.test_ctlr_broadcaster:
126135
extra_args: CONF_FILE=prj_ctlr_broadcaster.conf
127136
platform_allow:

0 commit comments

Comments
 (0)