Skip to content

Commit f64d123

Browse files
cvinayakcarlescufi
authored andcommitted
Bluetooth: Controller: Fix missing ext adv terminate event
Fix missing Extended Advertising terminate event and advertising scheduling not being stopped. Under race conditions, auxiliary event is aborted without the generation of done extra event which is suppose to stop the scheduling when max events count is used. The fix now generates the done extra event. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 05c85dd commit f64d123

File tree

1 file changed

+32
-2
lines changed

1 file changed

+32
-2
lines changed

subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_aux.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949

5050
static int init_reset(void);
5151
static int prepare_cb(struct lll_prepare_param *p);
52+
#if !defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO)
53+
static void isr_early_abort(void *param);
54+
#endif /* !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */
5255
static void isr_done(void *param);
5356
#if defined(CONFIG_BT_CTLR_ADV_AUX_PDU_BACK2BACK)
5457
static void isr_tx_chain(void *param);
@@ -188,7 +191,7 @@ static int prepare_cb(struct lll_prepare_param *p)
188191

189192
/* Abort if no aux_ptr filled */
190193
if (unlikely(!pri_hdr->aux_ptr || !PDU_ADV_AUX_PTR_OFFSET_GET(aux_ptr))) {
191-
radio_isr_set(lll_isr_early_abort, lll);
194+
radio_isr_set(isr_early_abort, lll);
192195
radio_disable();
193196

194197
return 0;
@@ -325,7 +328,7 @@ static int prepare_cb(struct lll_prepare_param *p)
325328
if (overhead) {
326329
LL_ASSERT_OVERHEAD(overhead);
327330

328-
radio_isr_set(lll_isr_abort, lll);
331+
radio_isr_set(isr_done, lll);
329332
radio_disable();
330333

331334
return -ECANCELED;
@@ -347,6 +350,33 @@ static int prepare_cb(struct lll_prepare_param *p)
347350
return 0;
348351
}
349352

353+
#if !defined(CONFIG_BT_TICKER_EXT_EXPIRE_INFO)
354+
static void isr_race(void *param)
355+
{
356+
radio_status_reset();
357+
}
358+
359+
static void isr_early_abort(void *param)
360+
{
361+
struct event_done_extra *extra;
362+
int err;
363+
364+
/* Generate auxiliary radio event done */
365+
extra = ull_done_extra_type_set(EVENT_DONE_EXTRA_TYPE_ADV_AUX);
366+
LL_ASSERT(extra);
367+
368+
radio_isr_set(isr_race, param);
369+
if (!radio_is_idle()) {
370+
radio_disable();
371+
}
372+
373+
err = lll_hfclock_off();
374+
LL_ASSERT(err >= 0);
375+
376+
lll_done(NULL);
377+
}
378+
#endif /* !CONFIG_BT_TICKER_EXT_EXPIRE_INFO */
379+
350380
static void isr_done(void *param)
351381
{
352382
struct event_done_extra *extra;

0 commit comments

Comments
 (0)