# Bluetooth Controller configuration options

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

comment "BLE Controller support"

# The following symbols are enabled depending if the controller actually
# supports the respective features.

config BT_CTLR_LE_ENC_SUPPORT
	bool

config BT_CTLR_CONN_PARAM_REQ_SUPPORT
	bool

config BT_CTLR_EXT_REJ_IND_SUPPORT
	bool

config BT_CTLR_SLAVE_FEAT_REQ_SUPPORT
	bool

config BT_CTLR_DATA_LEN_UPDATE_SUPPORT
	bool

config BT_CTLR_PRIVACY_SUPPORT
	bool

config BT_CTLR_EXT_SCAN_FP_SUPPORT
	bool

config BT_CTLR_PHY_UPDATE_SUPPORT
	bool

config BT_CTLR_ADV_EXT_SUPPORT
	bool

config BT_CTLR_CHAN_SEL_2_SUPPORT
	bool

config BT_CTLR_XTAL_ADVANCED_SUPPORT
	bool

config BT_CTLR_SCHED_ADVANCED_SUPPORT
	bool

config BT_CTLR_TIFS_HW_SUPPORT
	bool

config BT_CTLR
	bool "Bluetooth Controller"
	help
	  Enables support for SoC native controller implementations.

if BT_CTLR

choice BT_LL_CHOICE
	prompt "Bluetooth Link Layer Selection"
	help
	  Select the Bluetooth Link Layer to compile.

config BT_LL_SW_SPLIT
	bool "Software-based BLE Link Layer"
	select BT_RECV_IS_RX_THREAD
	select ENTROPY_GENERATOR
	help
	  Use Zephyr software BLE Link Layer ULL LLL split implementation.

config BT_LL_SW_LEGACY
	# NOTE: This OLD architecture implementation will be deprecated, with
	#       no further new feature development.
	bool "Software-based BLE Link Layer (deprecated)"
	select BT_RECV_IS_RX_THREAD
	select BT_HAS_HCI_VS
	select ENTROPY_GENERATOR
	select ENTROPY_NRF5_RNG if SOC_COMPATIBLE_NRF
	select ENTROPY_NRF5_BIAS_CORRECTION if SOC_COMPATIBLE_NRF
	depends on SOC_COMPATIBLE_NRF

	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_SLAVE_FEAT_REQ_SUPPORT
	select BT_CTLR_DATA_LEN_UPDATE_SUPPORT if !SOC_SERIES_NRF51X || \
						  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_UPDATE_SUPPORT if !SOC_SERIES_NRF51X || \
					      BT_CTLR_PHY_2M_NRF
	select BT_CTLR_ADV_EXT_SUPPORT
	select BT_CTLR_CHAN_SEL_2_SUPPORT

	select BT_CTLR_XTAL_ADVANCED_SUPPORT
	select BT_CTLR_SCHED_ADVANCED_SUPPORT
	select BT_CTLR_TIFS_HW_SUPPORT

	help
	  Use Zephyr software BLE Link Layer implementation.

endchoice

config BT_LLL_VENDOR_NORDIC
	bool "Use Nordic LLL"
	depends on BT_LL_SW_SPLIT && 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_SLAVE_FEAT_REQ_SUPPORT
	select BT_CTLR_DATA_LEN_UPDATE_SUPPORT if !SOC_SERIES_NRF51X || \
						  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_UPDATE_SUPPORT if !SOC_SERIES_NRF51X || \
					      BT_CTLR_PHY_2M_NRF
	select BT_CTLR_ADV_EXT_SUPPORT
	select BT_CTLR_CHAN_SEL_2_SUPPORT

	select BT_CTLR_XTAL_ADVANCED_SUPPORT
	select BT_CTLR_SCHED_ADVANCED_SUPPORT
	select BT_CTLR_TIFS_HW_SUPPORT

	default y
	help
	  Use Nordic Lower Link Layer implementation.

config BT_LLL_VENDOR_OPENISA
	bool "Use OpenISA LLL"
	depends on BT_LL_SW_SPLIT && SOC_OPENISA_RV32M1_RISCV32
	select BT_HAS_HCI_VS
	default y
	help
	  Use OpenISA Lower Link Layer implementation.

comment "BLE Controller configuration"

config BT_CTLR_CRYPTO
	bool "Enable crypto functions in Controller"
	default y
	help
	  Use random number generation and AES encryption support functions
	  provided by the controller.

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

config BT_CTLR_RX_PRIO
	# Hidden option for Controller's Co-Operative high priority Rx thread
	# priority.
	int
	default 6

config BT_CTLR_HCI_VS_BUILD_INFO
	string "Zephyr HCI VS Build Info string"
	default ""
	depends on BT_HCI_VS_EXT
	help
	  User-defined string that will be returned by the Zephyr VS Read Build
	  Information command after the Zephyr version and build time. When
	  setting this to a value different from an empty string, a space
	  character is required at the beginning to separate it from the
	  already included information.

config BT_CTLR_DUP_FILTER_LEN
	int "Number of addresses in the scan duplicate filter"
	depends on BT_OBSERVER
	default 16
	help
	  Set the number of unique BLE addresses that can be filtered as
	  duplicates while scanning.

config BT_CTLR_MESH_SCAN_FILTERS
	int "Number of Mesh scan filters"
	depends on BT_HCI_MESH_EXT
	default 1
	range 1 15
	help
	  Set the number of unique Mesh Scan Filters available as part of
	  the Intel Mesh Vendor Specific Extensions.

config BT_CTLR_MESH_SF_PATTERNS
	int "Number of Mesh scan filter patterns"
	depends on BT_HCI_MESH_EXT
	default 15
	range 1 15
	help
	  Set the number of unique Mesh Scan Filter patterns available per
	  Scan Filter as part of the Intel Mesh Vendor Specific Extensions.

config BT_CTLR_RX_BUFFERS
	int "Number of Rx buffers"
	default 6 if BT_HCI_RAW
	default 1
	range 1 18
	help
	  Set the number of Rx PDUs to be buffered in the controller. In a 7.5ms
	  connection interval and 2M PHY, maximum 18 packets with L2CAP payload
	  size of 1 byte can be received.

config BT_CTLR_TX_BUFFERS
	int "Number of Tx buffers"
	default 7 if BT_HCI_RAW
	default 3
	range 1 19
	help
	  Set the number of Tx PDUs to be queued for transmission in the
	  controller. In a 7.5ms connection interval and 2M PHY, maximum 19
	  packets can be enqueued, with 18 packets with L2CAP payload size of 1
	  byte can be acknowledged.

config BT_CTLR_TX_BUFFER_SIZE
	int "Tx buffer size"
	range 27 16384
	default 27
	help
	  Size of the Tx buffers and the value returned in HCI LE Read Buffer
	  Size command response. If this size if greater than effective PDU size
	  then controller will perform fragmentation before transmitting on the
	  the packet on air.
	  Maximum is set to 16384 due to implementation limitations (use of
	  u16_t for size/length variables).

choice
	prompt "Tx Power"
	default BT_CTLR_TX_PWR_0
	help
	  Select the supported BLE Radio transmit power level in dBm.

config BT_CTLR_TX_PWR_PLUS_8
	bool "+8 dBm"
	depends on SOC_NRF52840

config BT_CTLR_TX_PWR_PLUS_7
	bool "+7 dBm"
	depends on SOC_NRF52840

config BT_CTLR_TX_PWR_PLUS_6
	bool "+6 dBm"
	depends on SOC_NRF52840

config BT_CTLR_TX_PWR_PLUS_5
	bool "+5 dBm"
	depends on SOC_NRF52840

config BT_CTLR_TX_PWR_PLUS_4
	bool "+4 dBm"
	depends on SOC_SERIES_NRF51X || SOC_COMPATIBLE_NRF52X

config BT_CTLR_TX_PWR_PLUS_3
	bool "+3 dBm"
	depends on SOC_COMPATIBLE_NRF52X

config BT_CTLR_TX_PWR_PLUS_2
	bool "+2 dBm"
	depends on SOC_NRF52840

config BT_CTLR_TX_PWR_0
	bool "0 dBm"

config BT_CTLR_TX_PWR_MINUS_4
	bool "-4 dBm"

config BT_CTLR_TX_PWR_MINUS_8
	bool "-8 dBm"

config BT_CTLR_TX_PWR_MINUS_12
	bool "-12 dBm"

config BT_CTLR_TX_PWR_MINUS_16
	bool "-16 dBm"

config BT_CTLR_TX_PWR_MINUS_20
	bool "-20 dBm"

config BT_CTLR_TX_PWR_MINUS_30
	bool "-30 dBm"
	depends on SOC_SERIES_NRF51X

config BT_CTLR_TX_PWR_MINUS_40
	bool "-40 dBm"
	depends on SOC_COMPATIBLE_NRF52X

endchoice

config BT_CTLR_SETTINGS
	bool "Settings System"
	depends on BT_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.

comment "BLE Controller features"

if BT_CONN

config BT_CTLR_LLCP_CONN
	int "Number of connections with worst-case overlapping procedures"
	default 1
	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.

config BT_CTLR_LE_ENC
	bool "LE Encryption"
	depends on BT_CTLR_LE_ENC_SUPPORT
	default y
	help
	  Enable support for Bluetooth v4.0 LE Encryption feature in the
	  Controller.

config BT_CTLR_CONN_PARAM_REQ
	bool "Connection Parameter Request"
	depends on BT_CTLR_CONN_PARAM_REQ_SUPPORT
	select BT_CTLR_EXT_REJ_IND
	default y
	help
	  Enable support for Bluetooth v4.1 Connection Parameter Request feature
	  in the Controller.

config BT_CTLR_EXT_REJ_IND
	bool "Extended Reject Indication"
	depends on BT_CTLR_EXT_REJ_IND_SUPPORT
	default y
	help
	  Enable support for Bluetooth v4.1 Extended Reject Indication feature
	  in the Controller.

config BT_CTLR_SLAVE_FEAT_REQ
	bool "Slave-initiated Features Exchange"
	depends on BT_CTLR_SLAVE_FEAT_REQ_SUPPORT
	default y
	help
	  Enable support for Bluetooth v4.1 Slave-initiated Features Exchange
	  feature in the Controller.

config BT_CTLR_LE_PING
	bool "LE Ping"
	depends on BT_CTLR_LE_ENC
	default y
	help
	  Enable support for Bluetooth v4.1 LE Ping feature in the Controller.

config BT_CTLR_PRIVACY
	bool "LE Controller-based Privacy"
	depends on BT_CTLR_PRIVACY_SUPPORT
	default y
	select BT_CTLR_FILTER
	select BT_RPA
	help
	  Enable support for Bluetooth v4.2 LE Controller-based Privacy feature
	  in the Controller.

config BT_CTLR_RL_SIZE
	int "LE Controller-based Privacy Resolving List size"
	depends on BT_CTLR_PRIVACY
	default 8
	range 1 8 if SOC_COMPATIBLE_NRF
	help
	  Set the size of the Resolving List for LE Controller-based Privacy.
	  On nRF5x-based controllers, the hardware imposes a limit of 8 devices.

config BT_CTLR_EXT_SCAN_FP
	bool "LE Extended Scanner Filter Policies"
	depends on BT_OBSERVER && BT_CTLR_EXT_SCAN_FP_SUPPORT
	default y
	help
	  Enable support for Bluetooth v4.2 LE Extended Scanner Filter Policies
	  in the Controller.

config BT_CTLR_DATA_LENGTH
	# Hidden option to enable support for Bluetooth v4.2 LE Data Length
	# Update procedure in the Controller.
	bool
	depends on BT_DATA_LEN_UPDATE && BT_CTLR_DATA_LEN_UPDATE_SUPPORT
	default y

config BT_CTLR_DATA_LENGTH_MAX
	int "Maximum data length supported"
	depends on BT_CTLR_DATA_LENGTH
	default 27
	range 27 251
	help
	  Set the maximum data length of PDU supported in the Controller.

config BT_CTLR_PHY
	# Hidden option to enable support for Bluetooth 5.0 PHY Update
	# Procedure in the Controller.
	bool
	depends on BT_PHY_UPDATE && BT_CTLR_PHY_UPDATE_SUPPORT
	select BT_CTLR_EXT_REJ_IND
	default y

config BT_CTLR_MIN_USED_CHAN
	bool "Minimum Number of Used Channels"
	default y
	help
	  Enable support for Bluetooth 5.0 Minimum Number of Used Channels
	  Procedure in the Controller.

endif # BT_CONN

config BT_CTLR_CHAN_SEL_2
	bool "Channel Selection Algorithm #2"
	depends on (BT_CONN || BT_CTLR_ADV_EXT) && BT_CTLR_CHAN_SEL_2_SUPPORT
	default y
	help
	  Enable support for Bluetooth 5.0 LE Channel Selection Algorithm #2 in
	  the Controller.

config BT_CTLR_ADV_EXT
	bool "LE Advertising Extensions"
	depends on BT_CTLR_ADV_EXT_SUPPORT
	select BT_CTLR_SCAN_REQ_NOTIFY
	select BT_CTLR_CHAN_SEL_2
	help
	  Enable support for Bluetooth 5.0 LE Advertising Extensions in the
	  Controller.

config BT_ADV_SET
	int "LE Advertising Extensions Sets"
	depends on BT_CTLR_ADV_EXT
	default 1
	help
	  Maximum supported advertising sets.

config BT_CTLR_DTM
	bool
	help
	  Enable support for Direct Test Mode in the Controller.

config BT_CTLR_DTM_HCI
	bool "Direct Test Mode over HCI"
	select BT_CTLR_DTM
	help
	  Enable support for Direct Test Mode over the HCI transport.

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_FILTER
	bool "Device Whitelist Support"
	default y
	help
	  Enable support for controller device whitelist feature

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_PHY_2M
	bool "2Mbps PHY Support"
	depends on BT_CTLR_PHY && (!SOC_SERIES_NRF51X || BT_CTLR_PHY_2M_NRF)
	default y
	help
	  Enable support for Bluetooth 5.0 2Mbps PHY in the Controller.

config BT_CTLR_PHY_CODED
	bool "Coded PHY Support"
	depends on (BT_CTLR_PHY || BT_CTLR_ADV_EXT) && HAS_HW_NRF_RADIO_BLE_CODED
	default y
	help
	  Enable support for Bluetooth 5.0 Coded PHY in the Controller.

config BT_CTLR_ZLI
	bool "Use Zero Latency IRQs"
	depends on ZERO_LATENCY_IRQS && BT_LL_SW_SPLIT
	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.

if BT_LL_SW_LEGACY

config BT_CTLR_WORKER_PRIO
	int "Radio and Ticker's Worker IRQ priority"
	range 0 3 if SOC_SERIES_NRF51X
	range 0 6 if SOC_COMPATIBLE_NRF52X
	default 0
	help
	  The interrupt priority for event preparation and radio IRQ. This value
	  shall be less than or equal to the Ticker's Job priority value.

config BT_CTLR_JOB_PRIO
	int "Ticker's JOB IRQ priority"
	range BT_CTLR_WORKER_PRIO 3 if SOC_SERIES_NRF51X
	range BT_CTLR_WORKER_PRIO 6 if SOC_COMPATIBLE_NRF52X
	default 0
	help
	  The interrupt priority for Ticker's Job (SWI4) IRQ. This value shall
	  be greater than or equal to the Ticker's Worker IRQ priority value.

endif # BT_LL_SW_LEGACY

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 master
	  roles in timespace. Uses window offset in connection updates and uses
	  connection parameter request in slave role to negotiate
	  non-overlapping placement with active master roles to avoid slave
	  roles drifting into active master roles in the local controller.

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

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

if BT_LL_SW_SPLIT
config BT_CTLR_LLL_PRIO
	int "Lower Link Layer (Radio) IRQ priority"
	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"
	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
	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"
	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"
	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_CONN_META
	prompt "Enable 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 "Enable RX pdu meta data"
	bool

endif # BT_LL_SW_SPLIT

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

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 3 connection intervals.
	  Peripheral will respond to Encryption Request with Encryption Response
	  in the same connection interval, and also, will respond with Start
	  Encryption Response PDU in the 3rd connection interval, hence
	  completing encryption setup in 3 connection intervals. Encrypted data
	  would be transmitted as fast as in 3rd connection interval from the
	  connection establishment.
	  Maximum CPU time in Radio ISR will increase if this feature is
	  selected.

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_CONN_RSSI
	bool "Connection RSSI"
	default y if BT_HCI_RAW
	help
	  Enable connection RSSI measurement.

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_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_COMPATIBILITY_MODE
	bool "Ticker compatibility mode"
	default y if SOC_SERIES_NRF51X || BT_LL_SW_LEGACY
	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_CTLR_USER_EXT
	prompt "Enable proprietary extensions in Controller"
	depends on BT_LL_SW_SPLIT
	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_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.

endmenu

comment "BLE Controller hardware configuration"

menuconfig BT_CTLR_GPIO_PA
	bool "Power Amplifier GPIO interface"
	depends on !SOC_SERIES_NRF51X
	help
	  Enable GPIO interface to a Power Amplifier. This allows hardware
	  designs using PA to let the Controller toggle their state based on
	  radio activity.

if BT_CTLR_GPIO_PA

config BT_CTLR_GPIO_PA_PIN
	int "Power Amplifier GPIO pin number"
	range 0 47 if SOC_NRF52840
	range 0 31
	help
	  GPIO Pin number connected to a Power Amplifier.

config BT_CTLR_GPIO_PA_POL_INV
	bool "Inverted polarity for the PA pin"
	help
	  Enable inverted polarity (active low) for the PA pin.

config BT_CTLR_GPIO_PA_OFFSET
	int "Time from PA ON to Tx ready"
	default 5
	range 0 10
	help
	  Time before Tx ready to turn on PA.

endif # BT_CTLR_GPIO_PA

menuconfig BT_CTLR_GPIO_LNA
	bool "Low Noise Amplifier GPIO interface"
	depends on !SOC_SERIES_NRF51X
	help
	  Enable GPIO interface to a Low Noise Amplifier. This allows hardware
	  designs using LNAs to let the Controller toggle their state based on
	  radio activity.

if BT_CTLR_GPIO_LNA

config BT_CTLR_GPIO_LNA_PIN
	int "Low Noise Amplifier GPIO pin number"
	range 0 47 if SOC_NRF52840
	range 0 31
	help
	  GPIO Pin number connected to a Low Noise Amplifier.

config BT_CTLR_GPIO_LNA_POL_INV
	bool "Inverted polarity for the LNA pin"
	help
	  Enable inverted polarity (active low) for the LNA pin.

config BT_CTLR_GPIO_LNA_OFFSET
	int "Time from LNA ON to Rx ready"
	default 5
	range 0 10
	help
	  Time before Rx ready to turn on LNA.

endif # BT_CTLR_GPIO_LNA

config BT_CTLR_PA_LNA_GPIOTE_CHAN
	# Hidden "nRF5 GPIO PA/LNA GPIOTE Channel"
	int
	depends on SOC_FAMILY_NRF && (BT_CTLR_GPIO_PA || BT_CTLR_GPIO_LNA)
	default 3 if PWM_NRF5_SW
	default 0
	help
	  Select the nRF5 GPIOTE channel to use for PA/LNA GPIO feature.

comment "BLE Controller debug configuration"

config BT_CTLR_ASSERT_HANDLER
	bool "Application Defined Assertion Handler"
	help
	  This option enables an application-defined sink for the
	  controller assertion mechanism. This must be defined in
	  application code as void \"bt_ctlr_assert_handle(char \*, int)\"
	  and will be invoked whenever the controller code encounters
	  an unrecoverable error.

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_NRF51_PCA10028 || BOARD_NRF52_PCA10040 || BOARD_NRF52810_PCA10040 || BOARD_NRF52840_PCA10056 || 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_CTLR
