@@ -4323,20 +4323,26 @@ static void event_stop(u32_t ticks_at_expire, u32_t remainder,
4323
4323
LL_ASSERT (!retval );
4324
4324
}
4325
4325
4326
- static void event_common_prepare (u32_t ticks_at_expire ,
4327
- u32_t remainder ,
4328
- u32_t * ticks_xtal_to_start ,
4329
- u32_t * ticks_active_to_start ,
4330
- u32_t ticks_preempt_to_start ,
4331
- u8_t ticker_id ,
4332
- ticker_timeout_func ticker_timeout_fp ,
4333
- void * context )
4326
+ static u32_t event_common_prepare (u32_t ticks_at_expire ,
4327
+ u32_t remainder ,
4328
+ u32_t * ticks_xtal_to_start ,
4329
+ u32_t * ticks_active_to_start ,
4330
+ u32_t ticks_preempt_to_start ,
4331
+ u8_t ticker_id ,
4332
+ ticker_timeout_func ticker_timeout_fp ,
4333
+ void * context )
4334
4334
{
4335
4335
u32_t ticker_status ;
4336
4336
u32_t _ticks_xtal_to_start = * ticks_xtal_to_start ;
4337
4337
u32_t _ticks_active_to_start = * ticks_active_to_start ;
4338
4338
u32_t ticks_to_start ;
4339
4339
4340
+ /* Check for stale ticks_at_expire */
4341
+ if (ticker_ticks_diff_get (ticker_ticks_now_get (), ticks_at_expire ) >
4342
+ TICKER_US_TO_TICKS (RADIO_TICKER_START_PART_US )) {
4343
+ return 1 ;
4344
+ }
4345
+
4340
4346
/* in case this event is short prepare, xtal to start duration will be
4341
4347
* active to start duration.
4342
4348
*/
@@ -4479,6 +4485,8 @@ static void event_common_prepare(u32_t ticks_at_expire,
4479
4485
LL_ASSERT (!retval );
4480
4486
}
4481
4487
#endif /* CONFIG_BLUETOOTH_CONTROLLER_XTAL_ADVANCED */
4488
+
4489
+ return 0 ;
4482
4490
}
4483
4491
4484
4492
static u8_t chan_sel_remap (u8_t * chan_map , u8_t chan_index )
@@ -4757,19 +4765,23 @@ static void adv_scan_configure(u8_t phy, u8_t flags)
4757
4765
void radio_event_adv_prepare (u32_t ticks_at_expire , u32_t remainder ,
4758
4766
u16_t lazy , void * context )
4759
4767
{
4768
+ u32_t err ;
4769
+
4760
4770
ARG_UNUSED (lazy );
4761
4771
ARG_UNUSED (context );
4762
4772
4763
4773
DEBUG_RADIO_PREPARE_A (1 );
4764
4774
4765
4775
LL_ASSERT (!_radio .ticker_id_prepare );
4766
- _radio .ticker_id_prepare = RADIO_TICKER_ID_ADV ;
4767
4776
4768
- event_common_prepare (ticks_at_expire , remainder ,
4769
- & _radio .advertiser .hdr .ticks_xtal_to_start ,
4770
- & _radio .advertiser .hdr .ticks_active_to_start ,
4771
- _radio .advertiser .hdr .ticks_preempt_to_start ,
4772
- RADIO_TICKER_ID_ADV , event_adv , NULL );
4777
+ err = event_common_prepare (ticks_at_expire , remainder ,
4778
+ & _radio .advertiser .hdr .ticks_xtal_to_start ,
4779
+ & _radio .advertiser .hdr .ticks_active_to_start ,
4780
+ _radio .advertiser .hdr .ticks_preempt_to_start ,
4781
+ RADIO_TICKER_ID_ADV , event_adv , NULL );
4782
+ if (!err ) {
4783
+ _radio .ticker_id_prepare = RADIO_TICKER_ID_ADV ;
4784
+ }
4773
4785
4774
4786
DEBUG_RADIO_PREPARE_A (0 );
4775
4787
}
@@ -4972,19 +4984,25 @@ void event_adv_stop(u32_t ticks_at_expire, u32_t remainder, u16_t lazy,
4972
4984
static void event_scan_prepare (u32_t ticks_at_expire , u32_t remainder ,
4973
4985
u16_t lazy , void * context )
4974
4986
{
4987
+ u32_t err ;
4988
+
4975
4989
ARG_UNUSED (lazy );
4976
4990
ARG_UNUSED (context );
4977
4991
4978
4992
DEBUG_RADIO_PREPARE_O (1 );
4979
4993
4980
4994
LL_ASSERT (!_radio .ticker_id_prepare );
4981
- _radio .ticker_id_prepare = RADIO_TICKER_ID_SCAN ;
4982
4995
4983
- event_common_prepare (ticks_at_expire , remainder ,
4984
- & _radio .scanner .hdr .ticks_xtal_to_start ,
4985
- & _radio .scanner .hdr .ticks_active_to_start ,
4986
- _radio .scanner .hdr .ticks_preempt_to_start ,
4987
- RADIO_TICKER_ID_SCAN , event_scan , NULL );
4996
+ err = event_common_prepare (ticks_at_expire , remainder ,
4997
+ & _radio .scanner .hdr .ticks_xtal_to_start ,
4998
+ & _radio .scanner .hdr .ticks_active_to_start ,
4999
+ _radio .scanner .hdr .ticks_preempt_to_start ,
5000
+ RADIO_TICKER_ID_SCAN , event_scan , NULL );
5001
+ if (err ) {
5002
+ goto skip ;
5003
+ }
5004
+
5005
+ _radio .ticker_id_prepare = RADIO_TICKER_ID_SCAN ;
4988
5006
4989
5007
#if defined(CONFIG_BLUETOOTH_CONTROLLER_SCHED_ADVANCED )
4990
5008
/* calc next group in us for the anchor where first connection event
@@ -5021,6 +5039,7 @@ static void event_scan_prepare(u32_t ticks_at_expire, u32_t remainder,
5021
5039
}
5022
5040
#endif /* CONFIG_BLUETOOTH_CONTROLLER_SCHED_ADVANCED */
5023
5041
5042
+ skip :
5024
5043
DEBUG_RADIO_PREPARE_O (0 );
5025
5044
}
5026
5045
@@ -6360,10 +6379,9 @@ static void event_connection_prepare(u32_t ticks_at_expire,
6360
6379
struct connection * conn )
6361
6380
{
6362
6381
u16_t event_counter ;
6382
+ u32_t err ;
6363
6383
6364
6384
LL_ASSERT (!_radio .ticker_id_prepare );
6365
- _radio .ticker_id_prepare =
6366
- RADIO_TICKER_ID_FIRST_CONNECTION + conn -> handle ;
6367
6385
6368
6386
/* Calc window widening */
6369
6387
if (conn -> role .slave .role != 0 ) {
@@ -6497,17 +6515,23 @@ static void event_connection_prepare(u32_t ticks_at_expire,
6497
6515
}
6498
6516
#endif /* CONFIG_BLUETOOTH_CONTROLLER_DATA_LENGTH */
6499
6517
6500
- /* Setup XTAL startup and radio active events */
6501
- event_common_prepare (ticks_at_expire , remainder ,
6502
- & conn -> hdr .ticks_xtal_to_start ,
6503
- & conn -> hdr .ticks_active_to_start ,
6504
- conn -> hdr .ticks_preempt_to_start ,
6505
- (RADIO_TICKER_ID_FIRST_CONNECTION + conn -> handle ),
6506
- (conn -> role .slave .role != 0 ) ? event_slave : event_master ,
6507
- conn );
6508
-
6509
6518
/* store the next event counter value */
6510
6519
conn -> event_counter = event_counter + 1 ;
6520
+
6521
+ /* Setup XTAL startup and radio active events */
6522
+ err = event_common_prepare (ticks_at_expire , remainder ,
6523
+ & conn -> hdr .ticks_xtal_to_start ,
6524
+ & conn -> hdr .ticks_active_to_start ,
6525
+ conn -> hdr .ticks_preempt_to_start ,
6526
+ (RADIO_TICKER_ID_FIRST_CONNECTION +
6527
+ conn -> handle ),
6528
+ (conn -> role .slave .role != 0 ) ? event_slave :
6529
+ event_master ,
6530
+ conn );
6531
+ if (!err ) {
6532
+ _radio .ticker_id_prepare = RADIO_TICKER_ID_FIRST_CONNECTION +
6533
+ conn -> handle ;
6534
+ }
6511
6535
}
6512
6536
6513
6537
static void connection_configure (struct connection * conn )
0 commit comments