@@ -415,7 +415,7 @@ uint8_t ll_adv_sync_param_set(uint8_t handle, uint16_t interval, uint16_t flags)
415415#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX )
416416 if (extra_data ) {
417417 ull_adv_sync_extra_data_set_clear (extra_data_prev , extra_data ,
418- 0 , 0 , NULL );
418+ 0U , 0U , NULL );
419419 }
420420#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
421421
@@ -472,7 +472,7 @@ uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
472472#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX )
473473 if (extra_data ) {
474474 ull_adv_sync_extra_data_set_clear (extra_data_prev , extra_data ,
475- ULL_ADV_PDU_HDR_FIELD_AD_DATA , 0 , NULL );
475+ 0U , 0U , NULL );
476476 }
477477#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
478478
@@ -515,11 +515,14 @@ uint8_t ll_adv_sync_ad_data_set(uint8_t handle, uint8_t op, uint8_t len,
515515
516516uint8_t ll_adv_sync_enable (uint8_t handle , uint8_t enable )
517517{
518+ void * extra_data_prev , * extra_data ;
519+ struct pdu_adv * pdu_prev , * pdu ;
518520 struct lll_adv_sync * lll_sync ;
519521 struct ll_adv_sync_set * sync ;
520522 uint8_t sync_got_enabled ;
521523 struct ll_adv_set * adv ;
522524 uint8_t pri_idx ;
525+ uint8_t ter_idx ;
523526 uint8_t err ;
524527
525528 adv = ull_adv_is_created_get (handle );
@@ -532,14 +535,16 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
532535 return BT_HCI_ERR_CMD_DISALLOWED ;
533536 }
534537
535- /* TODO: Add Periodic Advertising ADI Support feature */
536- if (enable > 1U ) {
538+ if ((enable > (BT_HCI_LE_SET_PER_ADV_ENABLE_ENABLE |
539+ BT_HCI_LE_SET_PER_ADV_ENABLE_ADI )) ||
540+ (!IS_ENABLED (CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT ) &&
541+ (enable > BT_HCI_LE_SET_PER_ADV_ENABLE_ENABLE ))) {
537542 return BT_HCI_ERR_UNSUPP_FEATURE_PARAM_VAL ;
538543 }
539544
540545 sync = HDR_LLL2ULL (lll_sync );
541546
542- if (!enable ) {
547+ if (!( enable & BT_HCI_LE_SET_PER_ADV_ENABLE_ENABLE ) ) {
543548 if (!sync -> is_enabled ) {
544549 return BT_HCI_ERR_CMD_DISALLOWED ;
545550 }
@@ -567,6 +572,42 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
567572 sync_got_enabled = 1U ;
568573 }
569574
575+ /* Add/Remove ADI */
576+ if (IS_ENABLED (CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT )) {
577+ uint16_t hdr_add_fields ;
578+ uint16_t hdr_rem_fields ;
579+
580+ if (enable & BT_HCI_LE_SET_PER_ADV_ENABLE_ADI ) {
581+ hdr_add_fields = ULL_ADV_PDU_HDR_FIELD_ADI ;
582+ hdr_rem_fields = 0U ;
583+ } else {
584+ hdr_add_fields = 0U ;
585+ hdr_rem_fields = ULL_ADV_PDU_HDR_FIELD_ADI ;
586+ }
587+
588+ err = ull_adv_sync_pdu_alloc (adv , ULL_ADV_PDU_EXTRA_DATA_ALLOC_IF_EXIST ,
589+ & pdu_prev , & pdu , & extra_data_prev ,
590+ & extra_data , & ter_idx );
591+ if (err ) {
592+ return err ;
593+ }
594+
595+ #if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX )
596+ if (extra_data ) {
597+ ull_adv_sync_extra_data_set_clear (extra_data_prev ,
598+ extra_data , 0U , 0U ,
599+ NULL );
600+ }
601+ #endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
602+
603+ err = ull_adv_sync_pdu_set_clear (lll_sync , pdu_prev , pdu ,
604+ hdr_add_fields , hdr_rem_fields ,
605+ NULL );
606+ if (err ) {
607+ return err ;
608+ }
609+ }
610+
570611 if (adv -> is_enabled && !sync -> is_started ) {
571612 struct pdu_adv_sync_info * sync_info ;
572613 uint8_t value [1 + sizeof (sync_info )];
@@ -645,6 +686,10 @@ uint8_t ll_adv_sync_enable(uint8_t handle, uint8_t enable)
645686 }
646687 }
647688
689+ if (IS_ENABLED (CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT )) {
690+ lll_adv_sync_data_enqueue (lll_sync , ter_idx );
691+ }
692+
648693 if (sync_got_enabled ) {
649694 sync -> is_enabled = sync_got_enabled ;
650695 }
@@ -1110,11 +1155,17 @@ uint8_t ull_adv_sync_pdu_set_clear(struct lll_adv_sync *lll_sync,
11101155#endif /* CONFIG_BT_CTLR_DF_ADV_CTE_TX */
11111156
11121157 if (IS_ENABLED (CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT )) {
1158+ if ((hdr_add_fields & ULL_ADV_PDU_HDR_FIELD_ADI ) ||
1159+ (!(hdr_rem_fields & ULL_ADV_PDU_HDR_FIELD_ADI ) &&
1160+ ter_hdr_prev .adi )) {
1161+ ter_hdr .adi = 1U ;
1162+ }
1163+ if (ter_hdr .adi ) {
1164+ ter_dptr += sizeof (struct pdu_adv_adi );
1165+ }
11131166 if (ter_hdr_prev .adi ) {
11141167 ter_dptr_prev += sizeof (struct pdu_adv_adi );
11151168 }
1116- ter_hdr .adi = 1U ;
1117- ter_dptr += sizeof (struct pdu_adv_adi );
11181169 }
11191170
11201171 /* AuxPtr - will be added if AUX_CHAIN_IND is required */
@@ -1259,25 +1310,27 @@ uint8_t ull_adv_sync_pdu_set_clear(struct lll_adv_sync *lll_sync,
12591310 }
12601311
12611312 if (IS_ENABLED (CONFIG_BT_CTLR_ADV_PERIODIC_ADI_SUPPORT )) {
1262- struct pdu_adv_adi * adi ;
1263- struct ll_adv_set * adv ;
1264- uint16_t did ;
1265-
12661313 if (ter_hdr_prev .adi ) {
12671314 ter_dptr_prev -= sizeof (struct pdu_adv_adi );
12681315 }
12691316
1270- ter_dptr -= sizeof (struct pdu_adv_adi );
1271- adi = (void * )ter_dptr ;
1317+ if (ter_hdr .adi ) {
1318+ struct pdu_adv_adi * adi ;
1319+ struct ll_adv_set * adv ;
1320+ uint16_t did ;
12721321
1273- adv = HDR_LLL2ULL (lll_sync -> adv );
1322+ ter_dptr -= sizeof (struct pdu_adv_adi );
1323+ adi = (void * )ter_dptr ;
12741324
1275- adi -> sid = adv -> sid ;
1325+ adv = HDR_LLL2ULL ( lll_sync -> adv ) ;
12761326
1277- /* The DID for a specific SID shall be unique.
1278- */
1279- did = ull_adv_aux_did_next_unique_get (adv -> sid );
1280- adi -> did = sys_cpu_to_le16 (did );
1327+ adi -> sid = adv -> sid ;
1328+
1329+ /* The DID for a specific SID shall be unique.
1330+ */
1331+ did = ull_adv_aux_did_next_unique_get (adv -> sid );
1332+ adi -> did = sys_cpu_to_le16 (did );
1333+ }
12811334 }
12821335
12831336#if defined(CONFIG_BT_CTLR_DF_ADV_CTE_TX )
0 commit comments