Skip to content

Commit ae8e7f4

Browse files
cvinayakcarlescufi
authored andcommitted
Bluetooth: Controller: Fix pdu_free_sem_give assertion under ZLI use
Fix assertion due to multiple mayfly_enqueue calls used under ZLI when pdu_free_sem_give is invoked from the LLL. Signed-off-by: Vinayak Kariappa Chettimada <[email protected]>
1 parent 3b2d312 commit ae8e7f4

File tree

1 file changed

+34
-7
lines changed
  • subsys/bluetooth/controller/ll_sw/nordic/lll

1 file changed

+34
-7
lines changed

subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454

5555
static int init_reset(void);
5656
static void pdu_free_sem_give(void);
57+
static void pdu_free_sem_take_all_no_wait(void);
58+
static int pdu_free_sem_take_all(void);
5759

5860
#if defined(CONFIG_BT_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY)
5961
static inline void adv_extra_data_release(struct lll_adv_pdu *pdu, int idx);
@@ -410,8 +412,7 @@ struct pdu_adv *lll_adv_pdu_alloc_pdu_adv(void)
410412

411413
p = MFIFO_DEQUEUE_PEEK(pdu_free);
412414
if (p) {
413-
err = k_sem_take(&sem_pdu_free, K_NO_WAIT);
414-
LL_ASSERT(!err);
415+
pdu_free_sem_take_all_no_wait();
415416

416417
MFIFO_DEQUEUE(pdu_free);
417418

@@ -429,7 +430,7 @@ struct pdu_adv *lll_adv_pdu_alloc_pdu_adv(void)
429430
return p;
430431
}
431432

432-
err = k_sem_take(&sem_pdu_free, K_FOREVER);
433+
err = pdu_free_sem_take_all();
433434
LL_ASSERT(!err);
434435

435436
p = MFIFO_DEQUEUE(pdu_free);
@@ -803,11 +804,10 @@ static void pdu_free_sem_give(void)
803804
{
804805
static memq_link_t link;
805806
static struct mayfly mfy = {0, 0, &link, NULL, mfy_pdu_free_sem_give};
806-
uint32_t retval;
807807

808-
retval = mayfly_enqueue(TICKER_USER_ID_LLL, TICKER_USER_ID_ULL_HIGH, 0,
809-
&mfy);
810-
LL_ASSERT(!retval);
808+
/* Ignore mayfly_enqueue failure on repeated enqueue call */
809+
(void)mayfly_enqueue(TICKER_USER_ID_LLL, TICKER_USER_ID_ULL_HIGH, 0,
810+
&mfy);
811811
}
812812

813813
#else /* !CONFIG_BT_CTLR_ZLI */
@@ -817,6 +817,33 @@ static void pdu_free_sem_give(void)
817817
}
818818
#endif /* !CONFIG_BT_CTLR_ZLI */
819819

820+
static void pdu_free_sem_take_all_no_wait(void)
821+
{
822+
int err;
823+
824+
/* Flush all given semaphore count due to multiple release from LLL
825+
* context.
826+
*/
827+
do {
828+
err = k_sem_take(&sem_pdu_free, K_NO_WAIT);
829+
} while (!err);
830+
}
831+
832+
static int pdu_free_sem_take_all(void)
833+
{
834+
int err;
835+
836+
/* Wait for first sem give */
837+
err = k_sem_take(&sem_pdu_free, K_FOREVER);
838+
if (err) {
839+
return err;
840+
}
841+
842+
/* Flush all subsequent sem give */
843+
pdu_free_sem_take_all_no_wait();
844+
845+
return 0;
846+
}
820847
#if defined(CONFIG_BT_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY)
821848
static void *adv_extra_data_allocate(struct lll_adv_pdu *pdu, uint8_t last)
822849
{

0 commit comments

Comments
 (0)