From d7acb9355c1535bbc1c9975604ec326d4c642c98 Mon Sep 17 00:00:00 2001 From: Troels Nilsson Date: Wed, 21 Dec 2022 16:23:10 +0100 Subject: [PATCH] Bluetooth: controller: Fix JIT rescheduling for ext. advertising Fixes two issues with the JIT scheduler: Rescheduling of primary advertising packets for extended advertising when using the JIT scheduler did not work, since the done events for the primary events never made it into the reschedule logic The EVENT_DONE_EXTRA_TYPE_ADV_AUX event (for auxillary packets) could cause a "reschedule" for a primary event that was actually sent successfully (causing it to be sent twice) Signed-off-by: Troels Nilsson --- subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c | 4 ++-- subsys/bluetooth/controller/ll_sw/ull_adv.c | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c index 91cc8ed9884..d7cf4149bb8 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c @@ -1372,10 +1372,10 @@ static void isr_done(void *param) #endif /* CONFIG_BT_CTLR_ADV_INDICATION */ #if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_CTLR_JIT_SCHEDULING) -#if defined(CONFIG_BT_CTLR_ADV_EXT) +#if defined(CONFIG_BT_CTLR_ADV_EXT) && !defined(CONFIG_BT_CTLR_JIT_SCHEDULING) /* If no auxiliary PDUs scheduled, generate primary radio event done */ if (!lll->aux) -#endif /* CONFIG_BT_CTLR_ADV_EXT */ +#endif /* CONFIG_BT_CTLR_ADV_EXT && !CONFIG_BT_CTLR_JIT_SCHEDULING */ { struct event_done_extra *extra; diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv.c b/subsys/bluetooth/controller/ll_sw/ull_adv.c index 49fd54c2fcc..14eaf08d469 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_adv.c +++ b/subsys/bluetooth/controller/ll_sw/ull_adv.c @@ -1995,7 +1995,7 @@ void ull_adv_done(struct node_rx_event_done *done) lll = &adv->lll; #if defined(CONFIG_BT_CTLR_JIT_SCHEDULING) - if (done->extra.result != DONE_COMPLETED) { + if (done->extra.type == EVENT_DONE_EXTRA_TYPE_ADV && done->extra.result != DONE_COMPLETED) { /* Event aborted or too late - try to re-schedule */ uint32_t ticks_elapsed; uint32_t ticks_now; @@ -2061,6 +2061,12 @@ void ull_adv_done(struct node_rx_event_done *done) adv->lll.hdr.score -= 1; } } +#if defined(CONFIG_BT_CTLR_ADV_EXT) + if (done->extra.type == EVENT_DONE_EXTRA_TYPE_ADV && adv->lll.aux) { + /* Primary event of extended advertising done - wait for aux done */ + return; + } +#endif /* CONFIG_BT_CTLR_ADV_EXT */ #endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */ #if defined(CONFIG_BT_CTLR_ADV_EXT)