From 23ef75f6d9f0c00288795e4f2e73d0b4317b77d1 Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Mon, 27 Apr 2020 16:52:32 +0530 Subject: [PATCH] Bluetooth: controller: split: Fix Low Latency Prepare Done Fix the Low Latency Prepare Done that disables ULL_LOW context executions inside a radio event, so that ticker_job_idle_get is invoked from ULL_LOW instead of LLL context so that its enqueued alongwith others scheduled in ULL_LOW. This is avoid premature disable of ULL_LOW context executions. Signed-off-by: Vinayak Kariappa Chettimada --- .../controller/ll_sw/nordic/lll/lll.c | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c index 4bf06cb2e0e..99d6c8442b9 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll.c @@ -67,6 +67,7 @@ static void preempt_ticker_cb(uint32_t ticks_at_expire, uint32_t remainder, static void preempt(void *param); #else /* CONFIG_BT_CTLR_LOW_LAT */ #if (CONFIG_BT_CTLR_LLL_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO) +static void mfy_ticker_job_idle_get(void *param); static void ticker_op_job_disable(uint32_t status, void *op_context); #endif #endif /* CONFIG_BT_CTLR_LOW_LAT */ @@ -245,15 +246,17 @@ int lll_prepare_done(void *param) { #if defined(CONFIG_BT_CTLR_LOW_LAT) && \ (CONFIG_BT_CTLR_LLL_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO) + static memq_link_t link; + static struct mayfly mfy = {0, 0, &link, NULL, mfy_ticker_job_idle_get}; uint32_t ret; - /* Ticker Job Silence */ - ret = ticker_job_idle_get(TICKER_INSTANCE_ID_CTLR, - TICKER_USER_ID_LLL, - ticker_op_job_disable, NULL); + ret = mayfly_enqueue(TICKER_USER_ID_LLL, TICKER_USER_ID_ULL_LOW, + 1, &mfy); + if (ret) { + return -EFAULT; + } - return ((ret == TICKER_STATUS_SUCCESS) || - (ret == TICKER_STATUS_BUSY)) ? 0 : -EFAULT; + return 0; #else return 0; #endif /* CONFIG_BT_CTLR_LOW_LAT */ @@ -731,6 +734,18 @@ preempt_next: #else /* CONFIG_BT_CTLR_LOW_LAT */ #if (CONFIG_BT_CTLR_LLL_PRIO == CONFIG_BT_CTLR_ULL_LOW_PRIO) +static void mfy_ticker_job_idle_get(void *param) +{ + uint32_t ret; + + /* Ticker Job Silence */ + ret = ticker_job_idle_get(TICKER_INSTANCE_ID_CTLR, + TICKER_USER_ID_LLL, + ticker_op_job_disable, NULL); + LL_ASSERT((ret == TICKER_STATUS_SUCCESS) || + (ret == TICKER_STATUS_BUSY)); +} + static void ticker_op_job_disable(uint32_t status, void *op_context) { ARG_UNUSED(status);