@@ -711,7 +711,13 @@ uint8_t ll_apto_get(uint16_t handle, uint16_t *apto)
711
711
return BT_HCI_ERR_UNKNOWN_CONN_ID ;
712
712
}
713
713
714
- * apto = conn -> apto_reload * conn -> lll .interval * 125U / 1000 ;
714
+ if (conn -> lll .interval >= BT_HCI_LE_INTERVAL_MIN ) {
715
+ * apto = conn -> apto_reload * conn -> lll .interval *
716
+ CONN_INT_UNIT_US / (10U * USEC_PER_MSEC );
717
+ } else {
718
+ * apto = conn -> apto_reload * (conn -> lll .interval + 1U ) *
719
+ CONN_LOW_LAT_INT_UNIT_US / (10U * USEC_PER_MSEC );
720
+ }
715
721
716
722
return 0 ;
717
723
}
@@ -725,9 +731,17 @@ uint8_t ll_apto_set(uint16_t handle, uint16_t apto)
725
731
return BT_HCI_ERR_UNKNOWN_CONN_ID ;
726
732
}
727
733
728
- conn -> apto_reload = RADIO_CONN_EVENTS (apto * 10U * 1000U ,
729
- conn -> lll .interval *
730
- CONN_INT_UNIT_US );
734
+ if (conn -> lll .interval >= BT_HCI_LE_INTERVAL_MIN ) {
735
+ conn -> apto_reload =
736
+ RADIO_CONN_EVENTS (apto * 10U * USEC_PER_MSEC ,
737
+ conn -> lll .interval *
738
+ CONN_INT_UNIT_US );
739
+ } else {
740
+ conn -> apto_reload =
741
+ RADIO_CONN_EVENTS (apto * 10U * USEC_PER_MSEC ,
742
+ (conn -> lll .interval + 1U ) *
743
+ CONN_LOW_LAT_INT_UNIT_US );
744
+ }
731
745
732
746
return 0 ;
733
747
}
@@ -1061,8 +1075,17 @@ void ull_conn_done(struct node_rx_event_done *done)
1061
1075
if (0 ) {
1062
1076
#if defined(CONFIG_BT_PERIPHERAL )
1063
1077
} else if (lll -> role ) {
1064
- ull_drift_ticks_get (done , & ticks_drift_plus ,
1065
- & ticks_drift_minus );
1078
+ if (!conn -> periph .drift_skip ) {
1079
+ ull_drift_ticks_get (done , & ticks_drift_plus ,
1080
+ & ticks_drift_minus );
1081
+
1082
+ if (ticks_drift_plus || ticks_drift_minus ) {
1083
+ conn -> periph .drift_skip =
1084
+ ull_ref_get (& conn -> ull );
1085
+ }
1086
+ } else {
1087
+ conn -> periph .drift_skip -- ;
1088
+ }
1066
1089
1067
1090
if (!ull_tx_q_peek (& conn -> tx_q )) {
1068
1091
ull_conn_tx_demux (UINT8_MAX );
@@ -1106,10 +1129,18 @@ void ull_conn_done(struct node_rx_event_done *done)
1106
1129
else {
1107
1130
/* Start supervision timeout, if not started already */
1108
1131
if (!conn -> supervision_expire ) {
1109
- const uint32_t conn_interval_us = conn -> lll .interval * CONN_INT_UNIT_US ;
1132
+ uint32_t conn_interval_us ;
1133
+
1134
+ if (conn -> lll .interval >= BT_HCI_LE_INTERVAL_MIN ) {
1135
+ conn_interval_us = conn -> lll .interval *
1136
+ CONN_INT_UNIT_US ;
1137
+ } else {
1138
+ conn_interval_us = (conn -> lll .interval + 1U ) *
1139
+ CONN_LOW_LAT_INT_UNIT_US ;
1140
+ }
1110
1141
1111
1142
conn -> supervision_expire = RADIO_CONN_EVENTS (
1112
- (conn -> supervision_timeout * 10U * 1000U ),
1143
+ (conn -> supervision_timeout * 10U * USEC_PER_MSEC ),
1113
1144
conn_interval_us );
1114
1145
}
1115
1146
}
@@ -2186,17 +2217,22 @@ void ull_conn_update_parameters(struct ll_conn *conn, uint8_t is_cu_proc, uint8_
2186
2217
uint32_t win_offset_us , uint16_t interval , uint16_t latency ,
2187
2218
uint16_t timeout , uint16_t instant )
2188
2219
{
2189
- struct lll_conn * lll ;
2220
+ uint16_t conn_interval_unit_old ;
2221
+ uint16_t conn_interval_unit_new ;
2190
2222
uint32_t ticks_win_offset = 0U ;
2223
+ uint16_t conn_interval_old_us ;
2224
+ uint16_t conn_interval_new_us ;
2191
2225
uint32_t ticks_slot_overhead ;
2192
2226
uint16_t conn_interval_old ;
2193
2227
uint16_t conn_interval_new ;
2194
2228
uint32_t conn_interval_us ;
2195
- uint32_t periodic_us ;
2196
- uint16_t latency_upd ;
2229
+ uint32_t ticks_at_expire ;
2197
2230
uint16_t instant_latency ;
2231
+ uint32_t ready_delay_us ;
2198
2232
uint16_t event_counter ;
2199
- uint32_t ticks_at_expire ;
2233
+ uint32_t periodic_us ;
2234
+ uint16_t latency_upd ;
2235
+ struct lll_conn * lll ;
2200
2236
2201
2237
lll = & conn -> lll ;
2202
2238
@@ -2220,16 +2256,89 @@ void ull_conn_update_parameters(struct ll_conn *conn, uint8_t is_cu_proc, uint8_
2220
2256
}
2221
2257
#endif /* CONFIG_BT_CTLR_XTAL_ADVANCED */
2222
2258
2259
+ #if defined(CONFIG_BT_CTLR_PHY )
2260
+ ready_delay_us = lll_radio_tx_ready_delay_get (lll -> phy_tx ,
2261
+ lll -> phy_flags );
2262
+ #else
2263
+ ready_delay_us = lll_radio_tx_ready_delay_get (0U , 0U );
2264
+ #endif
2265
+
2223
2266
/* compensate for instant_latency due to laziness */
2224
- conn_interval_old = instant_latency * lll -> interval ;
2225
- latency_upd = conn_interval_old / interval ;
2226
- conn_interval_new = latency_upd * interval ;
2227
- if (conn_interval_new > conn_interval_old ) {
2228
- ticks_at_expire += HAL_TICKER_US_TO_TICKS ((conn_interval_new - conn_interval_old ) *
2229
- CONN_INT_UNIT_US );
2267
+ if (lll -> interval >= BT_HCI_LE_INTERVAL_MIN ) {
2268
+ conn_interval_old = instant_latency * lll -> interval ;
2269
+ conn_interval_unit_old = CONN_INT_UNIT_US ;
2230
2270
} else {
2231
- ticks_at_expire -= HAL_TICKER_US_TO_TICKS ((conn_interval_old - conn_interval_new ) *
2232
- CONN_INT_UNIT_US );
2271
+ conn_interval_old = instant_latency * (lll -> interval + 1U );
2272
+ conn_interval_unit_old = CONN_LOW_LAT_INT_UNIT_US ;
2273
+ }
2274
+
2275
+ if (interval >= BT_HCI_LE_INTERVAL_MIN ) {
2276
+ uint16_t max_tx_time ;
2277
+ uint16_t max_rx_time ;
2278
+ uint32_t slot_us ;
2279
+
2280
+ conn_interval_new = interval ;
2281
+ conn_interval_unit_new = CONN_INT_UNIT_US ;
2282
+ lll -> tifs_tx_us = EVENT_IFS_DEFAULT_US ;
2283
+ lll -> tifs_rx_us = EVENT_IFS_DEFAULT_US ;
2284
+ lll -> tifs_hcto_us = EVENT_IFS_DEFAULT_US ;
2285
+
2286
+ #if defined(CONFIG_BT_CTLR_DATA_LENGTH ) && \
2287
+ defined(CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE )
2288
+ max_tx_time = lll -> dle .eff .max_tx_time ;
2289
+ max_rx_time = lll -> dle .eff .max_rx_time ;
2290
+
2291
+ #else /* !CONFIG_BT_CTLR_DATA_LENGTH ||
2292
+ * !CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE
2293
+ */
2294
+ max_tx_time = PDU_DC_MAX_US (PDU_DC_PAYLOAD_SIZE_MIN , PHY_1M );
2295
+ max_rx_time = PDU_DC_MAX_US (PDU_DC_PAYLOAD_SIZE_MIN , PHY_1M );
2296
+ #if defined(CONFIG_BT_CTLR_PHY )
2297
+ max_tx_time = MAX (max_tx_time , PDU_DC_MAX_US (PDU_DC_PAYLOAD_SIZE_MIN , lll -> phy_tx ));
2298
+ max_rx_time = MAX (max_rx_time , PDU_DC_MAX_US (PDU_DC_PAYLOAD_SIZE_MIN , lll -> phy_rx ));
2299
+ #endif /* !CONFIG_BT_CTLR_PHY */
2300
+ #endif /* !CONFIG_BT_CTLR_DATA_LENGTH ||
2301
+ * !CONFIG_BT_CTLR_SLOT_RESERVATION_UPDATE
2302
+ */
2303
+
2304
+ /* Calculate event time reservation */
2305
+ slot_us = max_tx_time + max_rx_time ;
2306
+ slot_us += lll -> tifs_rx_us + (EVENT_CLOCK_JITTER_US << 1 );
2307
+ slot_us += ready_delay_us ;
2308
+
2309
+ if (IS_ENABLED (CONFIG_BT_CTLR_EVENT_OVERHEAD_RESERVE_MAX ) ||
2310
+ (lll -> role == BT_HCI_ROLE_CENTRAL )) {
2311
+ slot_us += EVENT_OVERHEAD_START_US + EVENT_OVERHEAD_END_US ;
2312
+ }
2313
+
2314
+ conn -> ull .ticks_slot = HAL_TICKER_US_TO_TICKS_CEIL (slot_us );
2315
+
2316
+ } else {
2317
+ conn_interval_new = interval + 1U ;
2318
+ conn_interval_unit_new = CONN_LOW_LAT_INT_UNIT_US ;
2319
+ lll -> tifs_tx_us = CONFIG_BT_CTLR_EVENT_IFS_LOW_LAT_US ;
2320
+ lll -> tifs_rx_us = CONFIG_BT_CTLR_EVENT_IFS_LOW_LAT_US ;
2321
+ lll -> tifs_hcto_us = CONFIG_BT_CTLR_EVENT_IFS_LOW_LAT_US ;
2322
+ /* Reserve only the processing overhead, on overlap the
2323
+ * is_abort_cb mechanism will ensure to continue the event so
2324
+ * as to not loose anchor point sync.
2325
+ */
2326
+ conn -> ull .ticks_slot =
2327
+ HAL_TICKER_US_TO_TICKS_CEIL (EVENT_OVERHEAD_START_US );
2328
+ }
2329
+
2330
+ conn_interval_us = conn_interval_new * conn_interval_unit_new ;
2331
+ periodic_us = conn_interval_us ;
2332
+
2333
+ conn_interval_old_us = conn_interval_old * conn_interval_unit_old ;
2334
+ latency_upd = conn_interval_old_us / conn_interval_us ;
2335
+ conn_interval_new_us = latency_upd * conn_interval_us ;
2336
+ if (conn_interval_new_us > conn_interval_old_us ) {
2337
+ ticks_at_expire += HAL_TICKER_US_TO_TICKS (
2338
+ conn_interval_new_us - conn_interval_old_us );
2339
+ } else {
2340
+ ticks_at_expire -= HAL_TICKER_US_TO_TICKS (
2341
+ conn_interval_old_us - conn_interval_new_us );
2233
2342
}
2234
2343
2235
2344
lll -> latency_prepare += conn -> llcp .prep .lazy ;
@@ -2238,15 +2347,14 @@ void ull_conn_update_parameters(struct ll_conn *conn, uint8_t is_cu_proc, uint8_
2238
2347
/* calculate the offset */
2239
2348
if (IS_ENABLED (CONFIG_BT_CTLR_LOW_LAT )) {
2240
2349
ticks_slot_overhead =
2241
- MAX (conn -> ull .ticks_active_to_start , conn -> ull .ticks_prepare_to_start );
2350
+ MAX (conn -> ull .ticks_active_to_start ,
2351
+ conn -> ull .ticks_prepare_to_start );
2352
+
2242
2353
} else {
2243
2354
ticks_slot_overhead = 0U ;
2244
2355
}
2245
2356
2246
2357
/* calculate the window widening and interval */
2247
- conn_interval_us = interval * CONN_INT_UNIT_US ;
2248
- periodic_us = conn_interval_us ;
2249
-
2250
2358
switch (lll -> role ) {
2251
2359
#if defined(CONFIG_BT_PERIPHERAL )
2252
2360
case BT_HCI_ROLE_PERIPHERAL :
@@ -2333,7 +2441,13 @@ void ull_conn_update_peer_sca(struct ll_conn *conn)
2333
2441
lll = & conn -> lll ;
2334
2442
2335
2443
/* calculate the window widening and interval */
2336
- conn_interval_us = lll -> interval * CONN_INT_UNIT_US ;
2444
+ if (lll -> interval >= BT_HCI_LE_INTERVAL_MIN ) {
2445
+ conn_interval_us = lll -> interval *
2446
+ CONN_INT_UNIT_US ;
2447
+ } else {
2448
+ conn_interval_us = (lll -> interval + 1U ) *
2449
+ CONN_LOW_LAT_INT_UNIT_US ;
2450
+ }
2337
2451
periodic_us = conn_interval_us ;
2338
2452
2339
2453
lll -> periph .window_widening_periodic_us =
0 commit comments