Skip to content

Commit e3ecab3

Browse files
cvinayakcarlescufi
authored andcommitted
Bluetooth: Controller: Fix ISO Data timestamp when FT > 1
Fix ISO data timestamp to reflect the SDU reference point and not the ISO event anchor point when PDUs received after retransmissions. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 7fa77a6 commit e3ecab3

File tree

5 files changed

+16
-1
lines changed

5 files changed

+16
-1
lines changed

subsys/bluetooth/controller/ll_sw/lll_conn_iso.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ struct lll_conn_iso_group {
7777
uint8_t role:1; /* 0: CENTRAL, 1: PERIPHERAL*/
7878
uint8_t paused:1; /* 1: CIG is paused */
7979

80+
/* ISO interval to calculate timestamp under FT > 1 */
81+
uint32_t iso_interval_us;
82+
8083
/* Accumulates LLL prepare callback latencies */
8184
uint16_t latency_prepare;
8285
uint16_t latency_event;

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,7 @@ static void isr_rx(void *param)
716716
(cis_lll->rx.bn_curr <= cis_lll->rx.bn) &&
717717
(pdu_rx->sn == cis_lll->nesn) &&
718718
ull_iso_pdu_rx_alloc_peek(2U)) {
719+
struct lll_conn_iso_group *cig_lll;
719720
struct node_rx_iso_meta *iso_meta;
720721

721722
cis_lll->nesn++;
@@ -753,6 +754,10 @@ static void isr_rx(void *param)
753754
iso_meta->timestamp =
754755
HAL_TICKER_TICKS_TO_US(radio_tmr_start_get()) +
755756
radio_tmr_ready_restore();
757+
cig_lll = ull_conn_iso_lll_group_get_by_stream(cis_lll);
758+
iso_meta->timestamp -= (cis_lll->event_count -
759+
(cis_lll->rx.payload_count / cis_lll->rx.bn)) *
760+
cig_lll->iso_interval_us;
756761
iso_meta->timestamp %=
757762
HAL_TICKER_TICKS_TO_US(BIT(HAL_TICKER_CNTR_MSBIT + 1U));
758763
iso_meta->status = 0U;
@@ -788,8 +793,8 @@ static void isr_rx(void *param)
788793

789794
isr_rx_next_subevent:
790795
if (cie || (se_curr == cis_lll->nse)) {
791-
struct lll_conn_iso_stream *old_cis_lll;
792796
struct lll_conn_iso_stream *next_cis_lll;
797+
struct lll_conn_iso_stream *old_cis_lll;
793798
struct lll_conn_iso_group *cig_lll;
794799
struct lll_conn *next_conn_lll;
795800
uint8_t phy;

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ static void isr_rx(void *param)
545545
(cis_lll->rx.bn_curr <= cis_lll->rx.bn) &&
546546
(pdu_rx->sn == cis_lll->nesn) &&
547547
ull_iso_pdu_rx_alloc_peek(2U)) {
548+
struct lll_conn_iso_group *cig_lll;
548549
struct node_rx_iso_meta *iso_meta;
549550

550551
cis_lll->nesn++;
@@ -584,6 +585,10 @@ static void isr_rx(void *param)
584585
HAL_TICKER_TICKS_TO_US(radio_tmr_start_get()) +
585586
radio_tmr_aa_restore() - cis_offset_first -
586587
addr_us_get(cis_lll->rx.phy);
588+
cig_lll = ull_conn_iso_lll_group_get_by_stream(cis_lll);
589+
iso_meta->timestamp -= (cis_lll->event_count -
590+
(cis_lll->rx.payload_count / cis_lll->rx.bn)) *
591+
cig_lll->iso_interval_us;
587592
iso_meta->timestamp %=
588593
HAL_TICKER_TICKS_TO_US(BIT(HAL_TICKER_CNTR_MSBIT + 1U));
589594
iso_meta->status = 0U;

subsys/bluetooth/controller/ll_sw/ull_central_iso.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,7 @@ uint8_t ll_cig_parameters_commit(uint8_t cig_id, uint16_t *handles)
254254
}
255255

256256
iso_interval_us = cig->iso_interval * ISO_INT_UNIT_US;
257+
cig->lll.iso_interval_us = iso_interval_us;
257258

258259
lll_hdr_init(&cig->lll, cig);
259260
max_se_length = 0U;

subsys/bluetooth/controller/ll_sw/ull_peripheral_iso.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ uint8_t ull_peripheral_iso_acquire(struct ll_conn *acl,
191191

192192
cig->iso_interval = sys_le16_to_cpu(req->iso_interval);
193193
iso_interval_us = cig->iso_interval * CONN_INT_UNIT_US;
194+
cig->lll.iso_interval_us = iso_interval_us;
194195

195196
cig->cig_id = req->cig_id;
196197
cig->lll.handle = LLL_HANDLE_INVALID;

0 commit comments

Comments
 (0)