From 7e74a046a1fb22198b95d2bf2b565a56fbf3cbce Mon Sep 17 00:00:00 2001 From: Vinayak Kariappa Chettimada Date: Sun, 3 Nov 2024 04:51:26 +0100 Subject: [PATCH] Bluetooth: Controller: Fix ISO Sync Receiver is_abort_cb Fix ISO Sync Receiver implementation to correctly prevent subevent from pre-empted in the unreserve time space. Signed-off-by: Vinayak Kariappa Chettimada --- .../ll_sw/nordic/lll/lll_sync_iso.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync_iso.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync_iso.c index d20be607915..b3af4fd8404 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync_iso.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_sync_iso.c @@ -46,6 +46,7 @@ static void prepare_bh(void *param); static int create_prepare_cb(struct lll_prepare_param *p); static int prepare_cb(struct lll_prepare_param *p); static int prepare_cb_common(struct lll_prepare_param *p); +static int is_abort_cb(void *next, void *curr, lll_prepare_cb_t *resume_cb); static void abort_cb(struct lll_prepare_param *prepare_param, void *param); static void isr_rx_estab(void *param); static void isr_rx(void *param); @@ -147,7 +148,7 @@ static void create_prepare_bh(void *param) int err; /* Invoke common pipeline handling of prepare */ - err = lll_prepare(lll_is_abort_cb, abort_cb, create_prepare_cb, 0U, + err = lll_prepare(is_abort_cb, abort_cb, create_prepare_cb, 0U, param); LL_ASSERT(!err || err == -EINPROGRESS); } @@ -157,7 +158,7 @@ static void prepare_bh(void *param) int err; /* Invoke common pipeline handling of prepare */ - err = lll_prepare(lll_is_abort_cb, abort_cb, prepare_cb, 0U, param); + err = lll_prepare(is_abort_cb, abort_cb, prepare_cb, 0U, param); LL_ASSERT(!err || err == -EINPROGRESS); } @@ -405,6 +406,20 @@ static int prepare_cb_common(struct lll_prepare_param *p) return 0; } +static int is_abort_cb(void *next, void *curr, lll_prepare_cb_t *resume_cb) +{ + if (next != curr) { + struct lll_sync_iso *lll; + + lll = curr; + if (lll->bn_curr <= lll->bn) { + return 0; + } + } + + return -ECANCELED; +} + static void abort_cb(struct lll_prepare_param *prepare_param, void *param) { struct event_done_extra *e;