Skip to content

Commit 1c86636

Browse files
cvinayakkartben
authored andcommitted
Bluetooth: Controller: Fix Central ISO related to elapsed events value
Fix incorrect elapsed events value when event prepare are aborted in the pipeline. This can caused premature supervision timeouts. Relates to commit 247037b ("Bluetooth: Controller: Fix incorrect elapsed events value"). Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 810aba8 commit 1c86636

File tree

1 file changed

+11
-16
lines changed

1 file changed

+11
-16
lines changed

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

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -92,23 +92,12 @@ int lll_central_iso_reset(void)
9292

9393
void lll_central_iso_prepare(void *param)
9494
{
95-
struct lll_conn_iso_group *cig_lll;
96-
struct lll_prepare_param *p;
97-
uint16_t elapsed;
9895
int err;
9996

10097
/* Initiate HF clock start up */
10198
err = lll_hfclock_on();
10299
LL_ASSERT(err >= 0);
103100

104-
/* Instants elapsed */
105-
p = param;
106-
elapsed = p->lazy + 1U;
107-
108-
/* Save the (latency + 1) for use in event and/or supervision timeout */
109-
cig_lll = p->param;
110-
cig_lll->latency_prepare += elapsed;
111-
112101
/* Invoke common pipeline handling of prepare */
113102
err = lll_prepare(lll_is_abort_cb, abort_cb, prepare_cb, 0U, param);
114103
LL_ASSERT(!err || err == -EINPROGRESS);
@@ -135,7 +124,6 @@ static int prepare_cb(struct lll_prepare_param *p)
135124
struct ull_hdr *ull;
136125
uint32_t remainder;
137126
uint32_t start_us;
138-
uint16_t lazy;
139127
uint32_t ret;
140128
uint8_t phy;
141129
int err = 0;
@@ -173,9 +161,9 @@ static int prepare_cb(struct lll_prepare_param *p)
173161
&data_chan_prn_s,
174162
&data_chan_remap_idx);
175163

176-
/* Store the current event latency */
177-
cig_lll->latency_event = cig_lll->latency_prepare;
178-
lazy = cig_lll->latency_prepare - 1U;
164+
/* Calculate the current event latency */
165+
cig_lll->lazy_prepare = p->lazy;
166+
cig_lll->latency_event = cig_lll->latency_prepare + cig_lll->lazy_prepare;
179167

180168
/* Reset accumulated latencies */
181169
cig_lll->latency_prepare = 0U;
@@ -395,13 +383,13 @@ static int prepare_cb(struct lll_prepare_param *p)
395383

396384
static void abort_cb(struct lll_prepare_param *prepare_param, void *param)
397385
{
386+
struct lll_conn_iso_group *cig_lll;
398387
int err;
399388

400389
/* NOTE: This is not a prepare being cancelled */
401390
if (!prepare_param) {
402391
struct lll_conn_iso_stream *next_cis_lll;
403392
struct lll_conn_iso_stream *cis_lll;
404-
struct lll_conn_iso_group *cig_lll;
405393

406394
cis_lll = ull_conn_iso_lll_stream_get(cis_handle_curr);
407395
cig_lll = param;
@@ -431,6 +419,13 @@ static void abort_cb(struct lll_prepare_param *prepare_param, void *param)
431419
err = lll_hfclock_off();
432420
LL_ASSERT(err >= 0);
433421

422+
/* Get reference to CIG LLL context */
423+
cig_lll = prepare_param->param;
424+
425+
/* Accumulate the latency as event is aborted while being in pipeline */
426+
cig_lll->lazy_prepare = prepare_param->lazy;
427+
cig_lll->latency_prepare += (cig_lll->lazy_prepare + 1U);
428+
434429
lll_done(param);
435430
}
436431

0 commit comments

Comments
 (0)