@@ -276,11 +276,11 @@ static void ticker_update_adv_assert(u32_t status, void *params);
276
276
#if defined(CONFIG_BT_CONN )
277
277
#if defined(CONFIG_BT_PERIPHERAL )
278
278
static void ticker_stop_adv_assert (u32_t status , void * params );
279
- static void ticker_update_slave_assert (u32_t status , void * params );
280
279
#endif /* CONFIG_BT_PERIPHERAL */
281
280
#if defined(CONFIG_BT_CENTRAL )
282
281
static void ticker_stop_scan_assert (u32_t status , void * params );
283
282
#endif /* CONFIG_BT_CENTRAL */
283
+ static void ticker_update_conn_assert (u32_t status , void * params );
284
284
static void ticker_stop_conn_assert (u32_t status , void * params );
285
285
static void ticker_start_conn_assert (u32_t status , void * params );
286
286
#endif /* CONFIG_BT_CONN */
@@ -2380,6 +2380,11 @@ static inline u8_t isr_rx_conn_pkt_ctrl_dle(struct pdu_data *pdu_data_rx,
2380
2380
eff_tx_time ;
2381
2381
#endif /* CONFIG_BT_CTLR_PHY */
2382
2382
2383
+ /* flag an event length update*/
2384
+ _radio .conn_curr -> evt_len_upd = 1U ;
2385
+ _radio .conn_curr -> evt_len_adv = 1U ;
2386
+
2387
+ /* Request Rx buffer resize */
2383
2388
_radio .conn_curr -> llcp_length .ack =
2384
2389
(_radio .conn_curr -> llcp_length .req - 1 );
2385
2390
_radio .conn_curr -> llcp_length .state =
@@ -2420,6 +2425,10 @@ static inline u8_t isr_rx_conn_pkt_ctrl_dle(struct pdu_data *pdu_data_rx,
2420
2425
_radio .conn_curr -> max_tx_time = eff_tx_time ;
2421
2426
#endif /* CONFIG_BT_CTLR_PHY */
2422
2427
2428
+ /* flag an event length update*/
2429
+ _radio .conn_curr -> evt_len_upd = 1U ;
2430
+ _radio .conn_curr -> evt_len_adv = 0U ;
2431
+
2423
2432
/* prepare event params */
2424
2433
lr -> max_rx_octets = eff_rx_octets ;
2425
2434
lr -> max_tx_octets = eff_tx_octets ;
@@ -4318,8 +4327,10 @@ static inline u32_t isr_close_scan(void)
4318
4327
#if defined(CONFIG_BT_CONN )
4319
4328
static inline void isr_close_conn (void )
4320
4329
{
4321
- u32_t ticks_drift_plus ;
4322
4330
u32_t ticks_drift_minus ;
4331
+ u32_t ticks_drift_plus ;
4332
+ u32_t ticks_slot_minus ;
4333
+ u32_t ticks_slot_plus ;
4323
4334
u16_t latency_event ;
4324
4335
u16_t elapsed_event ;
4325
4336
u8_t reason_peer ;
@@ -4345,10 +4356,12 @@ static inline void isr_close_conn(void)
4345
4356
return ;
4346
4357
}
4347
4358
4348
- ticks_drift_plus = 0U ;
4349
- ticks_drift_minus = 0U ;
4350
4359
latency_event = _radio .conn_curr -> latency_event ;
4351
4360
elapsed_event = latency_event + 1 ;
4361
+ ticks_drift_minus = 0U ;
4362
+ ticks_drift_plus = 0U ;
4363
+ ticks_slot_minus = 0U ;
4364
+ ticks_slot_plus = 0U ;
4352
4365
4353
4366
/* calculate drift if anchor point sync-ed */
4354
4367
if (_radio .packet_counter &&
@@ -4579,8 +4592,65 @@ static inline void isr_close_conn(void)
4579
4592
lazy = _radio .conn_curr -> latency_event + 1 ;
4580
4593
}
4581
4594
4582
- #if defined(CONFIG_BT_PERIPHERAL )
4595
+ #if defined(CONFIG_BT_CTLR_DATA_LENGTH ) || defined(CONFIG_BT_CTLR_PHY )
4596
+ /* TODO: Design connection event length use. for only reserve for single
4597
+ * trx.
4598
+ */
4599
+ if (_radio .conn_curr -> evt_len_upd ) {
4600
+ u32_t ready_delay , rx_time , tx_time , ticks_slot ;
4601
+ struct connection * conn = _radio .conn_curr ;
4602
+
4603
+ /* Reset event length update flag */
4604
+ conn -> evt_len_upd = 0U ;
4605
+
4606
+ #if defined(CONFIG_BT_CTLR_PHY )
4607
+ ready_delay = (conn -> role ) ?
4608
+ radio_rx_ready_delay_get (conn -> phy_rx , 1 ) :
4609
+ radio_tx_ready_delay_get (conn -> phy_tx ,
4610
+ conn -> phy_flags );
4611
+ #if defined(CONFIG_BT_CTLR_DATA_LENGTH )
4612
+ tx_time = conn -> max_tx_time ;
4613
+ if (conn -> evt_len_adv ) {
4614
+ rx_time = conn -> llcp_length .rx_time ;
4615
+ } else {
4616
+ rx_time = conn -> max_rx_time ;
4617
+ }
4618
+ #else /* !CONFIG_BT_CTLR_DATA_LENGTH */
4619
+ tx_time = MAX (RADIO_PKT_TIME (PDU_DC_PAYLOAD_SIZE_MIN , 0 ),
4620
+ RADIO_PKT_TIME (PDU_DC_PAYLOAD_SIZE_MIN ,
4621
+ conn -> phy_tx ));
4622
+ rx_time = MAX (RADIO_PKT_TIME (PDU_DC_PAYLOAD_SIZE_MIN , 0 ),
4623
+ RADIO_PKT_TIME (PDU_DC_PAYLOAD_SIZE_MIN ,
4624
+ conn -> phy_rx ));
4625
+ #endif /* !CONFIG_BT_CTLR_DATA_LENGTH */
4626
+ #else /* !CONFIG_BT_CTLR_PHY */
4627
+ ready_delay = (conn -> role ) ?
4628
+ radio_rx_ready_delay_get (0 , 0 ) :
4629
+ radio_tx_ready_delay_get (0 , 0 );
4630
+ tx_time = RADIO_PKT_TIME (conn -> max_tx_octets , 0 );
4631
+ if (conn -> evt_len_adv ) {
4632
+ rx_time = RADIO_PKT_TIME (conn -> llcp_length .rx_octets ,
4633
+ 0 );
4634
+ } else {
4635
+ rx_time = RADIO_PKT_TIME (conn -> max_rx_octets , 0 );
4636
+ }
4637
+ #endif /* !CONFIG_BT_CTLR_PHY */
4638
+
4639
+ ticks_slot = HAL_TICKER_US_TO_TICKS (RADIO_TICKER_START_PART_US +
4640
+ ready_delay + RADIO_TIFS +
4641
+ rx_time + tx_time + 4 );
4642
+
4643
+ if (ticks_slot > conn -> hdr .ticks_slot ) {
4644
+ ticks_slot_plus = ticks_slot - conn -> hdr .ticks_slot ;
4645
+ } else {
4646
+ ticks_slot_minus = conn -> hdr .ticks_slot - ticks_slot ;
4647
+ }
4648
+ conn -> hdr .ticks_slot = ticks_slot ;
4649
+ }
4650
+ #endif
4651
+
4583
4652
if ((ticks_drift_plus != 0 ) || (ticks_drift_minus != 0 ) ||
4653
+ (ticks_slot_plus != 0 ) || (ticks_slot_minus != 0 ) ||
4584
4654
(lazy != 0 ) || (force != 0 )) {
4585
4655
u32_t ticker_status ;
4586
4656
u8_t ticker_id = RADIO_TICKER_ID_FIRST_CONNECTION +
@@ -4596,14 +4666,14 @@ static inline void isr_close_conn(void)
4596
4666
ticker_update (RADIO_TICKER_INSTANCE_ID_RADIO ,
4597
4667
RADIO_TICKER_USER_ID_WORKER ,
4598
4668
ticker_id ,
4599
- ticks_drift_plus , ticks_drift_minus , 0 , 0 ,
4600
- lazy , force , ticker_update_slave_assert ,
4669
+ ticks_drift_plus , ticks_drift_minus ,
4670
+ ticks_slot_plus , ticks_slot_minus ,
4671
+ lazy , force , ticker_update_conn_assert ,
4601
4672
(void * )(u32_t )ticker_id );
4602
4673
LL_ASSERT ((ticker_status == TICKER_STATUS_SUCCESS ) ||
4603
4674
(ticker_status == TICKER_STATUS_BUSY ) ||
4604
4675
(_radio .ticker_id_stop == ticker_id ));
4605
4676
}
4606
- #endif /* CONFIG_BT_PERIPHERAL */
4607
4677
}
4608
4678
#endif /* CONFIG_BT_CONN */
4609
4679
@@ -4809,15 +4879,6 @@ static void ticker_stop_adv_assert(u32_t status, void *params)
4809
4879
LL_ASSERT (_radio .ticker_id_prepare != RADIO_TICKER_ID_ADV );
4810
4880
}
4811
4881
}
4812
-
4813
- static void ticker_update_slave_assert (u32_t status , void * params )
4814
- {
4815
- u8_t ticker_id = (u32_t )params & 0xFF ;
4816
-
4817
- LL_ASSERT ((status == TICKER_STATUS_SUCCESS ) ||
4818
- (_radio .ticker_id_stop == ticker_id ) ||
4819
- (_radio .ticker_id_upd == ticker_id ));
4820
- }
4821
4882
#endif /* CONFIG_BT_PERIPHERAL */
4822
4883
4823
4884
#if defined(CONFIG_BT_CENTRAL )
@@ -4847,6 +4908,15 @@ static void ticker_stop_scan_assert(u32_t status, void *params)
4847
4908
}
4848
4909
#endif /* CONFIG_BT_CENTRAL */
4849
4910
4911
+ static void ticker_update_conn_assert (u32_t status , void * params )
4912
+ {
4913
+ u8_t ticker_id = (u32_t )params & 0xFF ;
4914
+
4915
+ LL_ASSERT ((status == TICKER_STATUS_SUCCESS ) ||
4916
+ (_radio .ticker_id_stop == ticker_id ) ||
4917
+ (_radio .ticker_id_upd == ticker_id ));
4918
+ }
4919
+
4850
4920
static void ticker_stop_conn_assert (u32_t status , void * params )
4851
4921
{
4852
4922
LL_ASSERT (status == TICKER_STATUS_SUCCESS );
@@ -8105,6 +8175,9 @@ static inline int event_len_prep(struct connection *conn)
8105
8175
conn -> max_rx_time = conn -> llcp_length .rx_time ;
8106
8176
#endif /* CONFIG_BT_CTLR_PHY */
8107
8177
8178
+ /* Reset event length update advanced flag */
8179
+ conn -> evt_len_adv = 0U ;
8180
+
8108
8181
/** TODO This design is exception as memory initialization
8109
8182
* and allocation is done in radio context here, breaking the
8110
8183
* rule that the rx buffers are allocated in application
@@ -8492,6 +8565,9 @@ static inline void event_phy_upd_ind_prep(struct connection *conn,
8492
8565
conn -> max_tx_time = eff_tx_time ;
8493
8566
conn -> max_rx_time = eff_rx_time ;
8494
8567
8568
+ /* flag an event length update*/
8569
+ conn -> evt_len_upd = 1U ;
8570
+
8495
8571
#if defined(CONFIG_BT_CTLR_DATA_LENGTH )
8496
8572
/* Prepare the rx packet structure */
8497
8573
node_rx = packet_rx_reserve_get (2 );
0 commit comments