diff --git a/subsys/bluetooth/controller/ll_sw/ull_conn.c b/subsys/bluetooth/controller/ll_sw/ull_conn.c index 7e2e9659704..0090e3a6da2 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn.c +++ b/subsys/bluetooth/controller/ll_sw/ull_conn.c @@ -1084,7 +1084,14 @@ void ull_conn_done(struct node_rx_event_done *done) } /* Events elapsed used in timeout checks below */ +#if defined(CONFIG_BT_CTLR_CONN_META) + /* If event has shallow expiry do not add latency, but rely on + * accumulated lazy count. + */ + latency_event = conn->common.is_must_expire ? 0 : lll->latency_event; +#else latency_event = lll->latency_event; +#endif elapsed_event = latency_event + 1; /* Slave drift compensation calc and new latency or diff --git a/subsys/bluetooth/controller/ll_sw/ull_conn_types.h b/subsys/bluetooth/controller/ll_sw/ull_conn_types.h index 964ed71918e..627ca701e5b 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_conn_types.h +++ b/subsys/bluetooth/controller/ll_sw/ull_conn_types.h @@ -59,6 +59,9 @@ struct ll_conn { union { struct { uint8_t fex_valid:1; +#if defined(CONFIG_BT_CTLR_CONN_META) + uint8_t is_must_expire:1; +#endif /* CONFIG_BT_CTLR_CONN_META */ } common; #if defined(CONFIG_BT_PERIPHERAL) diff --git a/subsys/bluetooth/controller/ll_sw/ull_master.c b/subsys/bluetooth/controller/ll_sw/ull_master.c index 94f1b2d8eba..f90eb8a2979 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_master.c +++ b/subsys/bluetooth/controller/ll_sw/ull_master.c @@ -750,6 +750,9 @@ void ull_master_ticker_cb(uint32_t ticks_at_expire, uint32_t remainder, uint16_t return; } +#if defined(CONFIG_BT_CTLR_CONN_META) + conn->common.is_must_expire = (lazy == TICKER_LAZY_MUST_EXPIRE); +#endif /* If this is a must-expire callback, LLCP state machine does not need * to know. Will be called with lazy > 0 when scheduled in air. */ diff --git a/subsys/bluetooth/controller/ll_sw/ull_slave.c b/subsys/bluetooth/controller/ll_sw/ull_slave.c index 6c619610f9f..5bec57b47b4 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_slave.c +++ b/subsys/bluetooth/controller/ll_sw/ull_slave.c @@ -375,6 +375,9 @@ void ull_slave_ticker_cb(uint32_t ticks_at_expire, uint32_t remainder, return; } +#if defined(CONFIG_BT_CTLR_CONN_META) + conn->common.is_must_expire = (lazy == TICKER_LAZY_MUST_EXPIRE); +#endif /* If this is a must-expire callback, LLCP state machine does not need * to know. Will be called with lazy > 0 when scheduled in air. */