Skip to content

Commit a1e8af0

Browse files
cvinayakcarlescufi
authored andcommitted
Bluetooth: Controller: Fix missing Broadcast ISO HCI reset
Fix missing Broadcast ISO implementation for HCI reset. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent ddce23b commit a1e8af0

File tree

3 files changed

+88
-15
lines changed

3 files changed

+88
-15
lines changed

subsys/bluetooth/controller/ll_sw/ull.c

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,12 @@ void ll_reset(void)
764764
*/
765765

766766
#if defined(CONFIG_BT_BROADCASTER)
767+
#if defined(CONFIG_BT_CTLR_ADV_ISO)
768+
/* Reset adv iso sets */
769+
err = ull_adv_iso_reset();
770+
LL_ASSERT(!err);
771+
#endif /* CONFIG_BT_CTLR_ADV_ISO */
772+
767773
/* Reset adv state */
768774
err = ull_adv_reset();
769775
LL_ASSERT(!err);
@@ -772,7 +778,7 @@ void ll_reset(void)
772778
#if defined(CONFIG_BT_OBSERVER)
773779
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
774780
#if defined(CONFIG_BT_CTLR_SYNC_ISO)
775-
/* Reset periodic sync sets */
781+
/* Reset sync iso sets */
776782
err = ull_sync_iso_reset();
777783
LL_ASSERT(!err);
778784
#endif /* CONFIG_BT_CTLR_SYNC_ISO */
@@ -787,16 +793,6 @@ void ll_reset(void)
787793
LL_ASSERT(!err);
788794
#endif /* CONFIG_BT_OBSERVER */
789795

790-
#if defined(CONFIG_BT_CTLR_CONN_ISO)
791-
err = ull_conn_iso_reset();
792-
LL_ASSERT(!err);
793-
#endif /* CONFIG_BT_CTLR_CONN_ISO */
794-
795-
#if defined(CONFIG_BT_CTLR_ISO)
796-
err = ull_iso_reset();
797-
LL_ASSERT(!err);
798-
#endif /* CONFIG_BT_CTLR_ISO */
799-
800796
#if defined(CONFIG_BT_CTLR_PERIPHERAL_ISO)
801797
err = ull_peripheral_iso_reset();
802798
LL_ASSERT(!err);
@@ -807,11 +803,15 @@ void ll_reset(void)
807803
LL_ASSERT(!err);
808804
#endif /* CONFIG_BT_CTLR_CENTRAL_ISO */
809805

810-
#if defined(CONFIG_BT_CTLR_ADV_ISO)
811-
/* Reset periodic sync sets */
812-
err = ull_adv_iso_reset();
806+
#if defined(CONFIG_BT_CTLR_CONN_ISO)
807+
err = ull_conn_iso_reset();
813808
LL_ASSERT(!err);
814-
#endif /* CONFIG_BT_CTLR_ADV_ISO */
809+
#endif /* CONFIG_BT_CTLR_CONN_ISO */
810+
811+
#if defined(CONFIG_BT_CTLR_ISO)
812+
err = ull_iso_reset();
813+
LL_ASSERT(!err);
814+
#endif /* CONFIG_BT_CTLR_ISO */
815815

816816
#if defined(CONFIG_BT_CONN)
817817
/* Reset conn role */

subsys/bluetooth/controller/ll_sw/ull_adv_aux.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1344,11 +1344,18 @@ uint8_t ll_adv_aux_set_remove(uint8_t handle)
13441344
if (lll->sync) {
13451345
struct ll_adv_sync_set *sync;
13461346

1347+
#if defined(CONFIG_BT_CTLR_ADV_ISO)
1348+
if (lll->sync->iso) {
1349+
return BT_HCI_ERR_CMD_DISALLOWED;
1350+
}
1351+
#endif /* CONFIG_BT_CTLR_ADV_ISO */
1352+
13471353
sync = HDR_LLL2ULL(lll->sync);
13481354

13491355
if (sync->is_enabled) {
13501356
return BT_HCI_ERR_CMD_DISALLOWED;
13511357
}
1358+
13521359
lll->sync = NULL;
13531360

13541361
ull_adv_sync_release(sync);

subsys/bluetooth/controller/ll_sw/ull_adv_iso.c

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,8 +769,74 @@ int ull_adv_iso_init(void)
769769

770770
int ull_adv_iso_reset(void)
771771
{
772+
uint8_t handle;
772773
int err;
773774

775+
handle = CONFIG_BT_CTLR_ADV_ISO_SET;
776+
while (handle--) {
777+
struct lll_adv_sync *adv_sync_lll;
778+
struct lll_adv_iso *adv_iso_lll;
779+
struct ll_adv_iso_set *adv_iso;
780+
volatile uint32_t ret_cb;
781+
struct lll_adv *adv_lll;
782+
uint32_t ret;
783+
void *mark;
784+
785+
adv_iso = &ll_adv_iso[handle];
786+
adv_iso_lll = &adv_iso->lll;
787+
adv_lll = adv_iso_lll->adv;
788+
if (!adv_lll) {
789+
continue;
790+
}
791+
792+
mark = ull_disable_mark(adv_iso);
793+
LL_ASSERT(mark == adv_iso);
794+
795+
/* Stop event scheduling */
796+
ret_cb = TICKER_STATUS_BUSY;
797+
ret = ticker_stop(TICKER_INSTANCE_ID_CTLR, TICKER_USER_ID_THREAD,
798+
TICKER_ID_ADV_ISO_BASE + adv_iso_lll->handle,
799+
ull_ticker_status_give, (void *)&ret_cb);
800+
ret = ull_ticker_status_take(ret, &ret_cb);
801+
if (ret) {
802+
mark = ull_disable_unmark(adv_iso);
803+
LL_ASSERT(mark == adv_iso);
804+
805+
/* Assert as there shall be a ticker instance active */
806+
LL_ASSERT(false);
807+
808+
return BT_HCI_ERR_CMD_DISALLOWED;
809+
}
810+
811+
/* Abort any events in LLL pipeline */
812+
err = ull_disable(adv_iso_lll);
813+
LL_ASSERT(!err || (err == -EALREADY));
814+
815+
mark = ull_disable_unmark(adv_iso);
816+
LL_ASSERT(mark == adv_iso);
817+
818+
/* Reset associated streams */
819+
while (adv_iso_lll->num_bis--) {
820+
struct lll_adv_iso_stream *stream;
821+
uint16_t stream_handle;
822+
823+
stream_handle = adv_iso_lll->stream_handle[adv_iso_lll->num_bis];
824+
stream = ull_adv_iso_stream_get(stream_handle);
825+
if (stream) {
826+
stream->link_tx_free = NULL;
827+
}
828+
}
829+
830+
/* Remove Periodic Advertising association */
831+
adv_sync_lll = adv_lll->sync;
832+
if (adv_sync_lll) {
833+
adv_sync_lll->iso = NULL;
834+
}
835+
836+
/* Remove Extended Advertising association */
837+
adv_iso_lll->adv = NULL;
838+
}
839+
774840
err = init_reset();
775841
if (err) {
776842
return err;

0 commit comments

Comments
 (0)