Skip to content

Commit 6289fed

Browse files
Bluetooth: controller: Add helper to allocate new pdu_adv
This adds helper to always allocate advertising PDU either from memory pool or pdu_free queue and does not reuse existing PDU in adv_pdu. Signed-off-by: Andrzej Kaczmarek <[email protected]>
1 parent 2fbb759 commit 6289fed

File tree

2 files changed

+41
-45
lines changed

2 files changed

+41
-45
lines changed

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

Lines changed: 40 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@
5151

5252
static int init_reset(void);
5353

54-
static struct pdu_adv *adv_pdu_allocate(struct lll_adv_pdu *pdu, uint8_t last);
5554
#if defined(CONFIG_BT_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY)
5655
static inline void adv_extra_data_release(struct lll_adv_pdu *pdu, int idx);
5756
static void *adv_extra_data_allocate(struct lll_adv_pdu *pdu, uint8_t last);
@@ -257,6 +256,7 @@ int lll_adv_data_release(struct lll_adv_pdu *pdu)
257256
struct pdu_adv *lll_adv_pdu_alloc(struct lll_adv_pdu *pdu, uint8_t *idx)
258257
{
259258
uint8_t first, last;
259+
void *p;
260260

261261
first = pdu->first;
262262
last = pdu->last;
@@ -281,7 +281,45 @@ struct pdu_adv *lll_adv_pdu_alloc(struct lll_adv_pdu *pdu, uint8_t *idx)
281281

282282
*idx = last;
283283

284-
return adv_pdu_allocate(pdu, last);
284+
p = (void *)pdu->pdu[last];
285+
if (p) {
286+
return p;
287+
}
288+
289+
p = lll_adv_pdu_alloc_pdu_adv();
290+
291+
pdu->pdu[last] = (void *)p;
292+
293+
return p;
294+
}
295+
296+
struct pdu_adv *lll_adv_pdu_alloc_pdu_adv(void)
297+
{
298+
struct pdu_adv *p;
299+
int err;
300+
301+
p = MFIFO_DEQUEUE_PEEK(pdu_free);
302+
if (p) {
303+
err = k_sem_take(&sem_pdu_free, K_NO_WAIT);
304+
LL_ASSERT(!err);
305+
306+
MFIFO_DEQUEUE(pdu_free);
307+
308+
return p;
309+
}
310+
311+
p = mem_acquire(&mem_pdu.free);
312+
if (p) {
313+
return p;
314+
}
315+
316+
err = k_sem_take(&sem_pdu_free, K_FOREVER);
317+
LL_ASSERT(!err);
318+
319+
p = MFIFO_DEQUEUE(pdu_free);
320+
LL_ASSERT(p);
321+
322+
return p;
285323
}
286324

287325
struct pdu_adv *lll_adv_pdu_latest_get(struct lll_adv_pdu *pdu,
@@ -607,49 +645,6 @@ static int init_reset(void)
607645
return 0;
608646
}
609647

610-
static struct pdu_adv *adv_pdu_allocate(struct lll_adv_pdu *pdu, uint8_t last)
611-
{
612-
void *p;
613-
int err;
614-
615-
p = (void *)pdu->pdu[last];
616-
if (p) {
617-
return p;
618-
}
619-
620-
p = MFIFO_DEQUEUE_PEEK(pdu_free);
621-
if (p) {
622-
err = k_sem_take(&sem_pdu_free, K_NO_WAIT);
623-
LL_ASSERT(!err);
624-
625-
MFIFO_DEQUEUE(pdu_free);
626-
pdu->pdu[last] = (void *)p;
627-
628-
return p;
629-
}
630-
631-
p = mem_acquire(&mem_pdu.free);
632-
if (p) {
633-
pdu->pdu[last] = (void *)p;
634-
635-
return p;
636-
}
637-
638-
err = k_sem_take(&sem_pdu_free, K_FOREVER);
639-
LL_ASSERT(!err);
640-
641-
p = MFIFO_DEQUEUE(pdu_free);
642-
LL_ASSERT(p);
643-
/* If !p then check initial value of sem_pdu_free. It must be the same
644-
* as number of elements in pdu_free store. This may not happen in
645-
* runtime.
646-
*/
647-
648-
pdu->pdu[last] = (void *)p;
649-
650-
return p;
651-
}
652-
653648
#if defined(CONFIG_BT_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY)
654649
static void *adv_extra_data_allocate(struct lll_adv_pdu *pdu, uint8_t last)
655650
{

subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv_pdu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ static inline void lll_adv_pdu_enqueue(struct lll_adv_pdu *pdu, uint8_t idx)
1414
}
1515

1616
struct pdu_adv *lll_adv_pdu_alloc(struct lll_adv_pdu *pdu, uint8_t *idx);
17+
struct pdu_adv *lll_adv_pdu_alloc_pdu_adv(void);
1718

1819
static inline struct pdu_adv *lll_adv_data_alloc(struct lll_adv *lll,
1920
uint8_t *idx)

0 commit comments

Comments
 (0)