# Zephyr Bluetooth Controller configuration options

# Copyright (c) 2016-2017 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0

if BT_LL_SW_SPLIT

config BT_LLL_VENDOR_NORDIC
	bool "Use Nordic LLL"
	depends on SOC_COMPATIBLE_NRF
	select BT_HAS_HCI_VS
	select ENTROPY_NRF5_RNG
	select ENTROPY_NRF5_BIAS_CORRECTION
	select BT_CTLR_LE_ENC_SUPPORT if !BT_CTLR_DATA_LENGTH_CLEAR && \
					 !BT_CTLR_PHY_2M_NRF
	select BT_CTLR_CONN_PARAM_REQ_SUPPORT
	select BT_CTLR_EXT_REJ_IND_SUPPORT
	select BT_CTLR_PER_INIT_FEAT_XCHG_SUPPORT
	select BT_CTLR_DATA_LEN_UPDATE_SUPPORT if HAS_HW_NRF_CCM_LFLEN_8BIT || \
						  BT_CTLR_DATA_LENGTH_CLEAR
	select BT_CTLR_PRIVACY_SUPPORT if !SOC_SERIES_NRF51X
	select BT_CTLR_EXT_SCAN_FP_SUPPORT

	select BT_CTLR_PHY_2M_SUPPORT if HAS_HW_NRF_RADIO_BLE_2M || \
					 BT_CTLR_PHY_2M_NRF
	select BT_CTLR_PHY_CODED_SUPPORT if HAS_HW_NRF_RADIO_BLE_CODED
	select BT_CTLR_PHY_UPDATE_SUPPORT if BT_CTLR_PHY_2M_SUPPORT || \
					     BT_CTLR_PHY_CODED_SUPPORT
	select BT_CTLR_ADV_EXT_SUPPORT
	select BT_CTLR_ADV_PERIODIC_SUPPORT
	select BT_CTLR_SYNC_PERIODIC_SUPPORT
	select BT_CTLR_ADV_ISO_SUPPORT
	select BT_CTLR_SYNC_ISO_SUPPORT
	select BT_CTLR_DF_SUPPORT if HAS_HW_NRF_RADIO_DFE
	select BT_CTLR_CTEINLINE_SUPPORT if HAS_HW_NRF_RADIO_DFE
	select BT_CTLR_CHAN_SEL_2_SUPPORT
	select BT_CTLR_MIN_USED_CHAN_SUPPORT
	select BT_CTLR_DTM_HCI_SUPPORT
	select BT_CTLR_CONN_RSSI_SUPPORT

	select BT_CTLR_XTAL_ADVANCED_SUPPORT
	select BT_CTLR_SCHED_ADVANCED_SUPPORT
	select BT_CTLR_TIFS_HW_SUPPORT
	select BT_CTLR_ULL_LLL_PRIO_SUPPORT

	default y
	help
	  Use Nordic Lower Link Layer implementation.

config BT_LLL_VENDOR_OPENISA
	bool "Use OpenISA LLL"
	depends on SOC_OPENISA_RV32M1_RISCV32
	select BT_CTLR_PHY_UPDATE_SUPPORT
	select BT_CTLR_EXT_REJ_IND_SUPPORT
	select BT_HAS_HCI_VS
	select BT_CTLR_LE_ENC_SUPPORT if !BT_CTLR_DATA_LENGTH_CLEAR
	select BT_CTLR_PRIVACY_SUPPORT
	default y
	help
	  Use OpenISA Lower Link Layer implementation.

config BT_CTLR_XTAL_ADVANCED_SUPPORT
	bool

config BT_CTLR_SCHED_ADVANCED_SUPPORT
	bool

config BT_CTLR_TIFS_HW_SUPPORT
	bool

config BT_CTLR_ULL_LLL_PRIO_SUPPORT
	bool

choice BT_LL_SW_LLCP_IMPL
	prompt "Bluetooth Low Energy Software Link Layer Control Procedure Implementation"
	default BT_LL_SW_LLCP if BT_CTLR_DF_CONN_CTE_RX || BT_CTLR_DF_CONN_CTE_TX
	default BT_LL_SW_LLCP_LEGACY
	help
	  Select the Bluetooth Low Energy Software Link Layer Control Procedure implementation.

config BT_LL_SW_LLCP_LEGACY
	bool "Legacy implementation"
	depends on !BT_CTLR_DF_CONN_CTE_RX && !BT_CTLR_DF_CONN_CTE_TX
	help
	  Use the Bluetooth Low Energy Software Link Layer Legacy Control Procedure implementation.

config BT_LL_SW_LLCP
	bool "New implementation, replacing the legacy one [EXPERIMENTAL]"
	select EXPERIMENTAL
	help
	  Use the new Bluetooth Low Energy Software Link Layer Control Procedure implementation.
	  It is considered experimental because it is still under development and is not qualifiable yet.

endchoice


config BT_CTLR_RX_PRIO_STACK_SIZE
	# Controller's Co-Operative high priority Rx thread stack size.
	int "High priority Rx thread stack size"
	default 448

config BT_CTLR_SETTINGS
	bool "Settings System"
	depends on SETTINGS
	help
	  Enable use of settings system in controller.

config BT_CTLR_VERSION_SETTINGS
	bool "Version Settings"
	depends on BT_CTLR_SETTINGS
	help
	  Make the controller's Company Id and Subversion Number configurable
	  through settings system.

config BT_CTLR_COMPANY_ID
	hex "Controller Company Id"
	default BT_COMPANY_ID
	range 0x0000 0xFFFF
	help
	  Set the Bluetooth Company Identifier that will be used in
	  the VERSION_IND PDU. Uses BT_COMPANY_ID by default, although
	  silicon vendors and hardware manufacturers can set their own
	  Company Identifier for the controller. The full list of Bluetooth
	  Company Identifiers can be found here:
	  https://www.bluetooth.com/specifications/assigned-numbers/company-identifiers

config BT_CTLR_SUBVERSION_NUMBER
	hex "Subversion Number"
	default 0xFFFF
	range 0x0000 0xFFFF
	help
	  Set the Subversion Number that will be used in VERSION_IND PDU.

config BT_CTLR_ADVANCED_FEATURES
	bool "Show advanced features"
	help
	  Makes advanced features visible to controller developers.

menu "Advanced features"
	visible if BT_CTLR_ADVANCED_FEATURES

config BT_CTLR_SW_DEFERRED_PRIVACY
	bool "LE Controller-based Software Privacy"
	depends on BT_CTLR_PRIVACY
	help
	  Enable support for software based deferred privacy calculations.

config BT_CTLR_RPA_CACHE_SIZE
	int "LE Controller-based Software Privacy Resolving List size"
	depends on BT_CTLR_SW_DEFERRED_PRIVACY
	default 8
	range 1 64
	help
	  Set the size of the Known Unknown Resolving List for LE
	  Controller-based Software deferred Privacy.

config BT_CTLR_DATA_LENGTH_CLEAR
	bool "Data Length Support (Cleartext only)"
	depends on SOC_SERIES_NRF51X
	help
	  Enable support for Bluetooth v4.2 LE Data Length Update procedure, up to
	  251 byte cleartext payloads in the Controller. Encrypted connections
	  are not supported.


config BT_CTLR_PHY_2M_NRF
	bool "2Mbps Nordic Semiconductor PHY Support (Cleartext only)"
	depends on SOC_SERIES_NRF51X
	select BT_CTLR_PHY_2M
	help
	  Enable support for Nordic Semiconductor proprietary 2Mbps PHY in the
	  Controller. Encrypted connections are not supported.

config BT_CTLR_ADV_AUX_SET
	int "LE Extended Advertising Auxiliary Sets"
	depends on BT_BROADCASTER && BT_CTLR_ADV_EXT
	range 1 BT_CTLR_ADV_SET if BT_CTLR_ADV_PERIODIC
	range 0 BT_CTLR_ADV_SET
	default 1 if BT_CTLR_ADV_PERIODIC
	default BT_CTLR_ADV_SET
	help
	  Maximum supported advertising auxiliary channel sets.

config BT_CTLR_ADV_SYNC_SET
	int "LE Periodic Advertising Sets"
	depends on BT_CTLR_ADV_PERIODIC
	range 1 BT_CTLR_ADV_AUX_SET
	default 1
	help
	  Maximum supported periodic advertising sets.

config BT_CTLR_ADV_PDU_LINK
	bool "Linking of advertising PDU trains"
	help
	  Enables extra space in each advertising PDU to allow linking PDUs. This
	  is required to enable advertising data trains (i.e. transmission of
	  AUX_CHAIN_IND).

config BT_CTLR_ADV_PDU_BACK2BACK
	bool "Back-to-back transmission of extended advertising trains"
	depends on BT_CTLR_ADV_EXT && BT_BROADCASTER
	select BT_CTLR_ADV_PDU_LINK
	help
	  Enables transmission of AUX_CHAIN_IND in extended advertising train by
	  sending each AUX_CHAIN_IND one after another back-to-back.

config BT_CTLR_ADV_PDU_BACK2BACK_AFS
	int "AUX Frame Space for back-to-back transmission of extended advertising trains"
	depends on BT_CTLR_ADV_PDU_BACK2BACK
	range 300 1000
	help
	  Specific AUX Frame Space to be used for back-to-back transmission of
	  extended advertising trains. Time specified in microseconds.

config BT_CTLR_ADV_SYNC_PDU_BACK2BACK
	bool "Back-to-back transmission of periodic advertising trains"
	depends on BT_CTLR_ADV_PERIODIC
	select BT_CTLR_ADV_PDU_LINK
	help
	  Enables transmission of AUX_CHAIN_IND in periodic advertising train by
	  sending each AUX_CHAIN_IND one after another back-to-back.
	  Note, consecutive AUX_CHAIN_IND packets are not scheduled but sent at
	  a constant offset on a best effort basis. This means advertising train can
	  be preempted by other event at any time.

config BT_CTLR_ADV_SYNC_PDU_BACK2BACK_AFS
	int "AUX Frame Space for back-to-back transmission of periodic advertising trains"
	depends on BT_CTLR_ADV_SYNC_PDU_BACK2BACK
	default 300
	range 300 1000
	help
	  Specific AUX Frame Space to be used for back-to-back transmission of
	  periodic advertising trains. Time specified in microseconds.

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_CTLR_ADV_EXT_PDU_EXTRA_DATA_MEMORY
	bool
	depends on BT_CTLR_ADV_EXT
	help
	  Add additional memory to advertising PDU storage. The memory is a
	  general purpose storage for data that should be send from ULL to LLL.
	  The data stored in the memory are in synchronization with content
	  of PDU memory.

	  For example, the extra data memory is used for storage for parameters
	  to configure Radio peripheral to transmit CTE. The configuration data
	  must be synchronized with CTEInfo field in extended advertising header
	  that is part of PDU data.

config BT_CTRL_ADV_ADI_IN_SCAN_RSP
	bool "Include ADI in AUX_SCAN_RSP PDU"
	depends on BT_BROADCASTER && BT_CTLR_ADV_EXT
	help
	  Enable ADI field in AUX_SCAN_RSP PDU

config BT_CTLR_SCAN_AUX_SET
	int "LE Extended Scanning Auxiliary Sets"
	depends on BT_OBSERVER && BT_CTLR_ADV_EXT
	range 1 64
	default 1
	help
	  Maximum supported auxiliary channel scan sets.

config BT_CTLR_SCAN_SYNC_ISO_SET
	int "LE ISO Broadcast Isochronous Groups Sync Sets"
	depends on BT_CTLR_SYNC_ISO
	range 1 64
	default 1
	help
	  Maximum supported broadcast isochronous groups (BIGs) sync sets.

config BT_CTLR_ADV_ENABLE_STRICT
	bool "Enforce Strict Advertising Enable/Disable"
	depends on BT_BROADCASTER
	help
	  Enforce returning HCI Error Command Disallowed on enabling/disabling
	  already enabled/disabled advertising.

config BT_CTLR_SCAN_ENABLE_STRICT
	bool "Enforce Strict Scan Enable/Disable"
	depends on BT_OBSERVER
	help
	  Enforce returning HCI Error Command Disallowed on enabling/disabling
	  already enabled/disabled scanning.

config BT_CTLR_ZLI
	bool "Use Zero Latency IRQs"
	depends on ZERO_LATENCY_IRQS
	default y
	help
	  Enable support for use of Zero Latency IRQ feature. Note, applications
	  shall not use Zero Latency IRQ themselves when this option is selected,
	  else will impact controller stability.

config BT_CTLR_OPTIMIZE_FOR_SPEED
	prompt "Optimize for Speed" if !(SOC_SERIES_NRF51X && BT_CTLR_LE_ENC)
	bool
	default y if BT_CTLR_LE_ENC
	help
	  Optimize compilation of controller for execution speed.

config BT_CTLR_XTAL_ADVANCED
	bool "Advanced event preparation"
	depends on BT_CTLR_XTAL_ADVANCED_SUPPORT
	default y
	help
	  Enables advanced event preparation offset ahead of radio tx/rx, taking
	  into account predictive processing time requirements in preparation to
	  the event, like control procedure handling and CPU execution speeds.
	  Crystal oscillator is retained between closely spaced consecutive
	  radio events to reduce the overall number of crystal settling current
	  consumptions.

	  This feature maximizes radio utilization in an average role event
	  timeslice when they are closely spaced by using a reduced offset
	  between preparation and radio event.

	  By disabling this feature, the controller will use a constant offset
	  between the preparation and radio event. The controller will toggle
	  crystal oscillator between two closely spaced radio events leading to
	  higher average current due to increased number of crystal settling
	  current consumptions.

config BT_CTLR_XTAL_THRESHOLD
	int "Crystal shutdown threshold in uS"
	depends on BT_CTLR_XTAL_ADVANCED
	default 1500
	help
	  Configure the optimal delta in micro seconds between two consecutive
	  radio events, event done to next preparation, below which (active
	  clock) crystal will be retained. This value is board dependent.

config BT_CTLR_SCHED_ADVANCED
	bool "Advanced scheduling"
	depends on (BT_MAX_CONN != 0) && BT_CTLR_SCHED_ADVANCED_SUPPORT
	default y if !(BT_PERIPHERAL && !BT_CENTRAL)
	help
	  Enable non-overlapping placement of observer, initiator and central
	  roles in timespace. Uses window offset in connection updates and uses
	  connection parameter request in peripheral role to negotiate
	  non-overlapping placement with active central roles to avoid peripheral
	  roles drifting into active central roles in the local controller.

	  This feature maximizes the average data transmission amongst active
	  concurrent central and peripheral connections while other observer,
	  initiator, central or peripheral roles are active in the local controller.

	  Disabling this feature will lead to overlapping role in timespace
	  leading to skipped events amongst active roles.

config BT_CTLR_SCHED_ADVANCED_CENTRAL_CONN_SPACING
	int "Advanced scheduling central preferred connection spacing"
	depends on BT_CTLR_SCHED_ADVANCED
	default 0
	help
	  The central preferred connection spacing defines an additional spacing
	  in microseconds, added to the fixed ~1250 us spacing obtained by enabling
	  BT_CTLR_SCHED_ADVANCED. Specifying 0 (default) will obtain a spacing of
	  ~1250 us, whereas specifying 1250 will yield a spacing of ~2500 us.
	  The spacing is defined as the distance in time between the anchor points
	  of the established central role connections.
	  The precision is determined by the resolution of the platform dependent
	  ticker clock.
	  When specifying values above 6.25 ms, the spacing may be unobtainable if
	  the connection interval becomes smaller than the total spacing. In that
	  case, modulo is applied and a total spacing of 15 ms on a 10 ms connection
	  interval yields 5 ms spacing.
	  For multiple connections, it may become impossible to honor the preferred
	  spacing, in which case overlapping will occur.

config BT_CTLR_LLL_PRIO
	int "Lower Link Layer (Radio) IRQ priority" if (BT_CTLR_ULL_LLL_PRIO_SUPPORT && !BT_CTLR_ZLI)
	range 0 3 if SOC_SERIES_NRF51X
	range 0 6 if (SOC_SERIES_NRF52X || SOC_SERIES_NRF53X)
	default 0
	help
	  The interrupt priority for event preparation and radio IRQ.

config BT_CTLR_ULL_HIGH_PRIO
	int "Upper Link Layer High IRQ priority" if BT_CTLR_ULL_LLL_PRIO_SUPPORT
	range BT_CTLR_LLL_PRIO 3 if SOC_SERIES_NRF51X
	range BT_CTLR_LLL_PRIO 6 if (SOC_SERIES_NRF52X || SOC_SERIES_NRF53X)
	default BT_CTLR_LLL_PRIO if (!BT_CTLR_ULL_LLL_PRIO_SUPPORT || BT_CTLR_ZLI || BT_CTLR_LOW_LAT)
	default 1
	help
	  The interrupt priority for Ticker's Worker IRQ and Upper Link Layer
	  higher priority functions.

config BT_CTLR_ULL_LOW_PRIO
	int "Upper Link Layer Low IRQ priority" if BT_CTLR_ULL_LLL_PRIO_SUPPORT
	range BT_CTLR_ULL_HIGH_PRIO 3 if SOC_SERIES_NRF51X
	range BT_CTLR_ULL_HIGH_PRIO 6 if (SOC_SERIES_NRF52X || SOC_SERIES_NRF53X)
	default BT_CTLR_ULL_HIGH_PRIO
	help
	  The interrupt priority for Ticker's Job IRQ and Upper Link Layer
	  lower priority functions.

config BT_CTLR_LOW_LAT
	bool "Low latency non-negotiating event preemption"
	select BT_CTLR_LOW_LAT_ULL_DONE
	default y if SOC_SERIES_NRF51X
	help
	  Use low latency non-negotiating event preemption. This reduces
	  Radio ISR latencies by the controller event scheduling framework.
	  Consequently, this reduces on-air radio utilization due to redundant
	  radio state switches.

config BT_CTLR_LOW_LAT_ULL
	prompt "Low latency ULL"
	bool
	depends on BT_CTLR_LOW_LAT
	default y
	help
	  Low latency ULL implementation that uses tailchaining instead of while
	  loop to demux rx messages from LLL.

config BT_CTLR_LOW_LAT_ULL_DONE
	prompt "Low latency ULL prepare dequeue"
	bool
	help
	  Done events be processed and dequeued in ULL context.

config BT_CTLR_CONN_META
	prompt "Connection meta data extension"
	bool
	help
	  Enables vendor specific per-connection meta data as part of the
	  LLL connection object.

config BT_CTLR_RX_PDU_META
	prompt "RX pdu meta data"
	bool

config BT_CTLR_RADIO_ENABLE_FAST
	bool "Use tTXEN/RXEN,FAST ramp-up"
	depends on SOC_COMPATIBLE_NRF52X || SOC_SERIES_NRF53X
	default y
	help
	  Enable use of fast radio ramp-up mode.

config BT_CTLR_TIFS_HW
	bool "H/w Accelerated tIFS Trx switching"
	depends on !BT_CTLR_RADIO_ENABLE_FAST && BT_CTLR_TIFS_HW_SUPPORT
	default y
	help
	  Enable use of hardware accelerated tIFS Trx switching.

config BT_CTLR_SW_SWITCH_SINGLE_TIMER
	bool "Single TIMER tIFS Trx SW switching"
	depends on (!BT_CTLR_TIFS_HW) && (SOC_COMPATIBLE_NRF52X || SOC_SERIES_NRF53X)
	help
	  Implement the tIFS Trx SW switch with the same TIMER
	  instance, as the one used for BLE event timing. Requires
	  SW switching be enabled. Using a single TIMER:
	  (+) frees up one TIMER instance
	  (+) removes jitter for HCTO implementation
	  (-) introduces drifting to the absolute time inside BLE
	  events, that increases linearly with the number of
	  packets exchanged in the event
	  (-) makes it impossible to use most of the pre-programmed
	  PPI channels for the controller, resulting in 4 channels
	  less left for other uses

config BT_CTLR_PARAM_CHECK
	bool "HCI Command Parameter checking"
	default y if BT_HCI_RAW
	help
	  Enable code checking HCI Command Parameters. This is not needed in
	  combined host plus controller builds, saving some code space.

if BT_CONN

config BT_CTLR_FAST_ENC
	bool "Fast Encryption Setup"
	depends on BT_CTLR_LE_ENC
	default y if BT_HCI_RAW
	help
	  Enable connection encryption setup in 4 connection events.
	  Peripheral will respond to Encryption Request with Encryption Response
	  in the next connection event, and will transmit Start Encryption
	  Request PDU in the same connection event, hence completing encryption
	  setup in 4 connection events. Encrypted data would be transmitted as
	  fast as in 4th connection event from Encryption Request.

config BT_CTLR_LLCP_CONN
	int "Number of connections with worst-case overlapping procedures"
	default BT_MAX_CONN
	range 1 BT_MAX_CONN
	help
	  Set the number connections for which worst-case buffer requirements
	  for LLCP procedures must be met. Executing LLCP procedures on
	  more than this number of connections simultaneously may cause
	  instabilities.

if !BT_LL_SW_LLCP_LEGACY
config BT_CTLR_LLCP_TX_PER_CONN_TX_CTRL_BUF_NUM_MAX
	int
	default 4
	help
	  The theoretical maximum number of tx ctrl buffers needed for any connection, is 4.
	  two for active encryption procedure plus one for rejecting a remote request
	  and one for a local terminate

config BT_CTLR_LLCP_PER_CONN_TX_CTRL_BUF_NUM
	int "Number of tx control buffers to be reserved per connection"
	default BT_CTLR_LLCP_TX_PER_CONN_TX_CTRL_BUF_NUM_MAX
	range 0 BT_CTLR_LLCP_TX_PER_CONN_TX_CTRL_BUF_NUM_MAX
	help
	  Set the number control buffers that is to be pre allocated per connection
	  This defines the minimum number of buffers available for any connection
	  Setting this to non zero will ensure a connection will always have access
	  to buffer(s) for control procedure TX

config BT_CTLR_LLCP_COMMON_TX_CTRL_BUF_NUM
	int "Number of tx control buffers to be available across all connections"
	default 0
	range 0 255
	help
	  Set the number control buffers that is to be available for tx.
	  This defines the size of the pool of tx buffers available
	  for control procedure tx. This pool is shared across all
	  procedures/connections with allocation through a fifo queue.
	  Configure between 0 and (4 - BT_CTLR_LLCP_PER_CONN_TX_CTRL_BUF_NUM) * BT_CTLR_LLCP_CONN

config BT_CTLR_LLCP_LOCAL_PROC_CTX_BUF_NUM
	int "Number of local control procedure contexts to be available across all connections"
	default 2 if BT_CTLR_LLCP_CONN = 1
	default BT_CTLR_LLCP_CONN if BT_CTLR_LLCP_CONN > 1
	range 2 255
	help
	  Set the number control procedure contexts that is to be available.
	  This defines the size of the pool of control procedure contexts available
	  for handling local initiated control procedures.
	  This pool is shared across all connections, with allocation through a queue.

config BT_CTLR_LLCP_REMOTE_PROC_CTX_BUF_NUM
	int "Number of remote control procedure contexts to be available across all connections"
	default BT_CTLR_LLCP_CONN
	range 1 255
	help
	  Set the number control procedure contexts that is to be available.
	  This defines the size of the pool of control procedure contexts available
	  for handling remote initiated control procedures.
	  This pool is shared across all connections, with allocation through a queue.

endif #!BT_LL_SW_LLCP_LEGACY


config BT_CTLR_LLID_DATA_START_EMPTY
	bool "Handle zero length L2CAP start frame"
	default y if BT_HCI_RAW
	help
	  Handle zero length L2CAP start frame.

config BT_CTLR_RX_ENQUEUE_HOLD
	bool "Procedure Complete after on-air instant"
	default y if BT_HCI_RAW
	help
	  Hold enqueue of Procedure Complete events with instant until after the
	  on-air instant is reached.

config BT_CTLR_TX_RETRY_DISABLE
	bool "Disable Tx Retry"
	help
	  Avoid retransmission of a PDU if peer device Nack-ed a transmission
	  in the current connection event, close the connection event so as to
	  save current consumption on retries (in case peer has no buffers to
	  receive new PDUs).

	  Enabling this will lower power consumption, but increase transmission
	  latencies by one connection interval as the next attempt to send a PDU
	  would happen in the next connection event instead of repeated retries
	  in the current connection event.

config BT_CTLR_THROUGHPUT
	bool "Measure incoming Tx throughput"
	help
	  Measure incoming Tx throughput and log the results.

config BT_CTLR_FORCE_MD_COUNT
	int "Forced MD bit count" if !BT_CTLR_FORCE_MD_AUTO
	depends on !BT_CTLR_LOW_LAT_ULL
	range 0 255
	default 1 if BT_CTLR_FORCE_MD_AUTO
	default 0
	help
	  No. of times to force MD bit to be set in Tx PDU after a successful
	  transmission of non-empty PDU.

	  This will prolong the connection event to from being closed in cases
	  where applications want to send data in same connection event but are
	  slow in providing new Tx data.

config BT_CTLR_FORCE_MD_AUTO
	bool "Forced MD bit automatic calculation"
	depends on !BT_CTLR_LOW_LAT_ULL
	select BT_CTLR_THROUGHPUT
	default y if BT_HCI_RAW
	help
	  Force MD bit in transmitted PDU based on runtime incoming transmit
	  data throughput.

config BT_CTLR_CONN_RANDOM_FORCE
	bool "Random forced scheduling for peripheral on missed anchor point"
	depends on BT_PERIPHERAL
	default y
	help
	  When enabled, controller will have legacy behavior and randomly force
	  priority at next ticker scheduling for peripheral role, if anchor point is
	  missed.
	  Two or more connections with similar interval on a device connected
	  to a peer device having two or more connections at its end with same
	  interval could lock to a round robin pattern where in neither of the central
	  nor peripheral event would be in sync at either end. Randomness allows
	  to break this locked round robin pattern permitting an anchor point sync.

config BT_CTLR_CONN_RSSI_EVENT
	bool "Connection RSSI event"
	depends on BT_CTLR_CONN_RSSI
	help
	  Generate events for connection RSSI measurement.

config BT_CTLR_ALLOW_SAME_PEER_CONN
	bool "Allow connection requests from same peer"
	depends on BT_MAX_CONN > 1
	help
	  Allow connection requests from the same peer. While the
	  Bluetooth specification does not allow multiple connections
	  with the same peer, allowing such connections is useful
	  while debugging multiple connections.

	  WARNING: This option enables behavior that violates the Bluetooth
	  specification.

endif # BT_CONN

config BT_CTLR_ADV_INDICATION
	bool "Advertisement indications"
	depends on BT_BROADCASTER
	help
	  Generate events indicating on air advertisement events.

config BT_CTLR_SCAN_REQ_NOTIFY
	bool "Scan Request Notifications"
	depends on BT_BROADCASTER
	help
	  Generate events notifying the on air scan requests received.

config BT_CTLR_SCAN_REQ_RSSI
	bool "Measure Scan Request RSSI"
	depends on BT_CTLR_SCAN_REQ_NOTIFY
	help
	  Measure RSSI of the on air scan requests received.

config BT_CTLR_SCAN_INDICATION
	bool "Scanner indications"
	depends on BT_OBSERVER
	help
	  Generate events indicating on air scanner events.

config BT_CTLR_SCAN_UNRESERVED
	bool "Unreserved scan window"
	depends on BT_OBSERVER && !BT_CTLR_LOW_LAT
	default y if BT_MESH
	help
	  Scanner will not use time space reservation for scan window when in
	  continuous scan mode.

config BT_MAYFLY_YIELD_AFTER_CALL
	bool "Yield from mayfly thread after first call"
	default y
	help
	  Only process one mayfly callback per invocation (legacy behavior).
	  If set to 'n', all pending mayflies for callee are executed before
	  yielding

config BT_TICKER_LOW_LAT
	bool "Ticker low latency mode"
	default y if SOC_SERIES_NRF51X
	help
	  This option enables legacy ticker scheduling which defers overlapping
	  ticker node timeouts and thereby prevents ticker interrupts during
	  radio RX/TX. Enabling this option disables the ticker priority- and
	  'must expire' features.

config BT_TICKER_LAZY_GET
	bool "Ticker Next Slot Get with Lazy"
	default y if BT_CTLR_ADV_PERIODIC
	help
	  This option enables ticker interface to iterate through active
	  ticker nodes, returning tick to expire and lazy count from a reference
	  tick.

config BT_TICKER_NEXT_SLOT_GET_MATCH
	bool "Ticker Next Slot Get with match callback"
	default y if BT_TICKER_SLOT_AGNOSTIC
	help
	  This option enables ticker interface to iterate through active
	  ticker nodes with a callback for every found ticker node. When
	  returning true in the callback, iteration will stop and the normal
	  operation callback invoked.

config BT_TICKER_EXT
	bool "Ticker extensions"
	depends on !BT_TICKER_LOW_LAT && !BT_TICKER_SLOT_AGNOSTIC
	default y
	help
	  This option enables ticker extensions such as re-scheduling of
	  ticker nodes with slot_window set to non-zero. Ticker extensions
	  are invoked by using available '_ext' versions of ticker interface
	  functions.

config BT_TICKER_SLOT_AGNOSTIC
	bool "Slot agnostic ticker mode"
	help
	  This option enables slot agnostic ticker mode, which ignores slot
	  reservations and collision handling, and operates as a simple
	  multi-instance programmable timer.

config BT_CTLR_JIT_SCHEDULING
	bool "Just-in-Time Scheduling"
	select BT_TICKER_SLOT_AGNOSTIC
	help
	  This option enables the experimental 'Next Generation' scheduling
	  feature, which eliminates priorities and collision resolving in the
	  ticker, and instead relies on just-in-time ("lazy") resolution in
	  the link layer.

config BT_CTLR_USER_EXT
	prompt "Proprietary extensions in Controller"
	bool
	help
	  Catch-all for enabling proprietary event types in Controller behavior.

config BT_CTLR_USER_EVT_RANGE
	int "Range of event constants reserved for proprietary event types"
	depends on BT_CTLR_USER_EXT
	default 5
	range 0 10
	help
	  Number of event types reserved for proprietary use. The range
	  is typically used when BT_CTLR_USER_EXT is in use.

config BT_CTLR_USER_TICKER_ID_RANGE
	int "Range of ticker id constants reserved for proprietary ticker nodes"
	depends on BT_CTLR_USER_EXT
	default 0
	range 0 10
	help
	  Number of ticker ids reserved for proprietary use. The range
	  is typically used when BT_CTLR_USER_EXT is in use.

config BT_RX_USER_PDU_LEN
	int "Maximum supported proprietary PDU buffer length"
	depends on BT_CTLR_USER_EXT
	default 2
	range 2 255
	help
	  Maximum data size for each proprietary PDU. This size includes link layer
	  header and payload. It does not account for HCI event headers as these
	  PDUs are assumed to not go across HCI.

config BT_CTLR_USER_CPR_INTERVAL_MIN
	bool "Proprietary Connection Parameter Request minimum interval"
	depends on BT_CTLR_USER_EXT
	help
	  When enabled, controller will accept Connection Parameter Request
	  intervals down to a proprietary minimum value.

endmenu

comment "BLE Controller debug configuration"

config BT_CTLR_PROFILE_ISR
	bool "Profile radio ISR"
	help
	  Turn on measurement of radio ISR latency, CPU usage and generation of
	  controller event with these profiling data. The controller event
	  contains current, minimum and maximum ISR entry latencies; and
	  current, minimum and maximum ISR CPU use in micro-seconds.

config BT_CTLR_DEBUG_PINS
	bool "Bluetooth Controller Debug Pins"
	depends on BOARD_NRF51DK_NRF51422 || BOARD_NRF52DK_NRF52832 || BOARD_NRF52DK_NRF52810 || BOARD_NRF52840DK_NRF52840 || BOARD_NRF52833DK_NRF52833 || BOARD_NRF5340DK_NRF5340_CPUNET || BOARD_RV32M1_VEGA
	help
	  Turn on debug GPIO toggling for the BLE Controller. This is useful
	  when debugging with a logic analyzer or profiling certain sections of
	  the code.

endif # BT_LL_SW_SPLIT
