diff --git a/subsys/bluetooth/controller/Kconfig.ll_sw_split b/subsys/bluetooth/controller/Kconfig.ll_sw_split index a7215076eff..cd634022d1c 100644 --- a/subsys/bluetooth/controller/Kconfig.ll_sw_split +++ b/subsys/bluetooth/controller/Kconfig.ll_sw_split @@ -157,6 +157,16 @@ config BT_CTLR_ADV_SYNC_SET help Maximum supported periodic advertising sets. +config BT_CTLR_ADV_DATA_BUF_MAX + int "Advertising Data Maximum Buffers" + depends on BT_BROADCASTER + range 1 64 if BT_CTLR_ADV_EXT + range 1 1 if !BT_CTLR_ADV_EXT + default 1 + help + Maximum number of buffered Advertising Data payload across enabled + advertising sets. + config BT_CTRL_ADV_ADI_IN_SCAN_RSP bool "Include ADI in AUX_SCAN_RSP PDU" depends on BT_BROADCASTER && BT_CTLR_ADV_EXT diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c index 3069ef68c28..0790603a1b6 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.c @@ -73,16 +73,34 @@ static inline bool isr_rx_ci_adva_check(struct pdu_adv *adv, struct pdu_adv *ci); #if defined(CONFIG_BT_CTLR_ADV_EXT) -#define PAYLOAD_SIZE_MAX MAX(MIN(CONFIG_BT_CTLR_ADV_DATA_LEN_MAX, \ - PDU_AC_EXT_PAYLOAD_SIZE_MAX), \ - PDU_AC_PAYLOAD_SIZE_MAX) +#define PAYLOAD_FRAG_COUNT ((CONFIG_BT_CTLR_ADV_DATA_LEN_MAX + \ + PDU_AC_PAYLOAD_SIZE_MAX - 1) / \ + PDU_AC_PAYLOAD_SIZE_MAX) +#define BT_CTLR_ADV_AUX_SET CONFIG_BT_CTLR_ADV_AUX_SET +#if defined(CONFIG_BT_CTLR_ADV_PERIODIC) +#define BT_CTLR_ADV_SYNC_SET CONFIG_BT_CTLR_ADV_SYNC_SET +#else /* !CONFIG_BT_CTLR_ADV_PERIODIC */ +#define BT_CTLR_ADV_SYNC_SET 0 +#endif /* !CONFIG_BT_CTLR_ADV_PERIODIC */ #else -#define PAYLOAD_SIZE_MAX PDU_AC_PAYLOAD_SIZE_MAX +#define PAYLOAD_FRAG_COUNT 1 +#define BT_CTLR_ADV_AUX_SET 0 +#define BT_CTLR_ADV_SYNC_SET 0 #endif -#define PDU_MEM_SIZE MROUND(PDU_AC_LL_HEADER_SIZE + PAYLOAD_SIZE_MAX) -#define PDU_POOL_SIZE (PDU_MEM_SIZE * 7) +#define PDU_MEM_SIZE MROUND(PDU_AC_LL_HEADER_SIZE + \ + PDU_AC_PAYLOAD_SIZE_MAX) +#define PDU_MEM_COUNT_MIN (BT_CTLR_ADV_SET + \ + (BT_CTLR_ADV_SET * PAYLOAD_FRAG_COUNT) + \ + (BT_CTLR_ADV_AUX_SET * PAYLOAD_FRAG_COUNT) + \ + (BT_CTLR_ADV_SYNC_SET * PAYLOAD_FRAG_COUNT)) +#define PDU_MEM_FIFO_COUNT ((BT_CTLR_ADV_SET * PAYLOAD_FRAG_COUNT * 2) + \ + (CONFIG_BT_CTLR_ADV_DATA_BUF_MAX * \ + PAYLOAD_FRAG_COUNT)) +#define PDU_MEM_COUNT (PDU_MEM_COUNT_MIN + PDU_MEM_FIFO_COUNT) +#define PDU_POOL_SIZE (PDU_MEM_SIZE * PDU_MEM_COUNT) +/* Free AD data PDU buffer pool */ static struct { void *free; uint8_t pool[PDU_POOL_SIZE]; diff --git a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h index 395dee4b024..beb49258770 100644 --- a/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h +++ b/subsys/bluetooth/controller/ll_sw/nordic/lll/lll_adv.h @@ -4,6 +4,12 @@ * SPDX-License-Identifier: Apache-2.0 */ +#if defined(CONFIG_BT_CTLR_ADV_SET) +#define BT_CTLR_ADV_SET CONFIG_BT_CTLR_ADV_SET +#else /* CONFIG_BT_CTLR_ADV_SET */ +#define BT_CTLR_ADV_SET 1 +#endif /* CONFIG_BT_CTLR_ADV_SET */ + struct lll_adv_pdu { uint8_t volatile first; uint8_t last; diff --git a/subsys/bluetooth/controller/ll_sw/pdu.h b/subsys/bluetooth/controller/ll_sw/pdu.h index 1197cbcbe31..4fe437256d0 100644 --- a/subsys/bluetooth/controller/ll_sw/pdu.h +++ b/subsys/bluetooth/controller/ll_sw/pdu.h @@ -34,7 +34,7 @@ #define BYTES2US(bytes, phy) (((bytes)<<3)/BIT((phy&0x3)>>1)) /* Advertisement channel maximum legacy payload size */ -#define PDU_AC_PAYLOAD_SIZE_MAX 37 +#define PDU_AC_LEG_PAYLOAD_SIZE_MAX 37 /* Advertisement channel maximum extended payload size */ #define PDU_AC_EXT_PAYLOAD_SIZE_MAX 251 /* Advertisement channel minimum extended payload size */ @@ -48,6 +48,14 @@ sizeof(struct pdu_adv_sync_info) + \ TX_PWR_SIZE + \ ACAD_SIZE) +/* Advertisement channel maximum payload size */ +#if defined(CONFIG_BT_CTLR_ADV_EXT) +#define PDU_AC_PAYLOAD_SIZE_MAX MAX(MIN(CONFIG_BT_CTLR_ADV_DATA_LEN_MAX, \ + PDU_AC_EXT_PAYLOAD_SIZE_MAX), \ + PDU_AC_LEG_PAYLOAD_SIZE_MAX) +#else +#define PDU_AC_PAYLOAD_SIZE_MAX PDU_AC_LEG_PAYLOAD_SIZE_MAX +#endif /* Link Layer header size of Adv PDU. Assumes pdu_adv is packed */ #define PDU_AC_LL_HEADER_SIZE (offsetof(struct pdu_adv, payload)) diff --git a/subsys/bluetooth/controller/ll_sw/ull_adv_internal.h b/subsys/bluetooth/controller/ll_sw/ull_adv_internal.h index 0d3591b7e9b..c2d631ef7de 100644 --- a/subsys/bluetooth/controller/ll_sw/ull_adv_internal.h +++ b/subsys/bluetooth/controller/ll_sw/ull_adv_internal.h @@ -9,12 +9,6 @@ /* Bitmask value returned by ull_adv_is_enabled() */ #define ULL_ADV_ENABLED_BITMASK_ENABLED BIT(0) -#if defined(CONFIG_BT_CTLR_ADV_SET) -#define BT_CTLR_ADV_SET CONFIG_BT_CTLR_ADV_SET -#else /* CONFIG_BT_CTLR_ADV_SET */ -#define BT_CTLR_ADV_SET 1 -#endif /* CONFIG_BT_CTLR_ADV_SET */ - /* Helper functions to initialise and reset ull_adv module */ int ull_adv_init(void); int ull_adv_reset(void);