5454
5555static int init_reset (void );
5656static 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 )
5961static 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 )
821848static void * adv_extra_data_allocate (struct lll_adv_pdu * pdu , uint8_t last )
822849{
0 commit comments