# Bluetooth Isochronous Channel configuration options

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

config BT_ISO
	bool

config BT_ISO_TX
	bool

config BT_ISO_RX
	bool

# TODO: Split between client (central) and server (peripheral)
config BT_ISO_UNICAST
	bool
	depends on BT_CONN
	select BT_ISO
	select BT_ISO_TX
	select BT_ISO_RX
	help
	  This option enables support for Bluetooth Unicast
	  Isochronous channels.

config BT_ISO_PERIPHERAL
	bool "Bluetooth Isochronous Channel Unicast Peripheral Support [EXPERIMENTAL]"
	depends on !BT_CTLR || BT_CTLR_PERIPHERAL_ISO_SUPPORT
	select BT_PERIPHERAL
	select BT_ISO_UNICAST
	select EXPERIMENTAL
	help
	  This option enables support for Bluetooth Unicast
	  Isochronous channels for the peripheral role.

config BT_ISO_CENTRAL
	bool "Bluetooth Isochronous Channel Unicast Central Support [EXPERIMENTAL]"
	depends on !BT_CTLR || BT_CTLR_CENTRAL_ISO_SUPPORT
	select BT_CENTRAL
	select BT_ISO_UNICAST
	select EXPERIMENTAL
	help
	  This option enables support for Bluetooth Broadcast
	  Isochronous channels for the central role.

config BT_ISO_BROADCAST
	bool
	select BT_ISO
	select BT_EXT_ADV

config BT_ISO_BROADCASTER
	bool "Bluetooth Isochronous Broadcaster Support [EXPERIMENTAL]"
	depends on !BT_CTLR || BT_CTLR_ADV_ISO_SUPPORT
	select BT_ISO_BROADCAST
	select BT_ISO_TX
	select BT_BROADCASTER
	select BT_PER_ADV
	select EXPERIMENTAL
	help
	  This option enables support for the Bluetooth Isochronous Broadcaster.

config BT_ISO_SYNC_RECEIVER
	bool "Bluetooth Isochronous Synchronized Receiver Support [EXPERIMENTAL]"
	depends on !BT_CTLR || BT_CTLR_SYNC_ISO_SUPPORT
	select BT_ISO_BROADCAST
	select BT_ISO_RX
	select BT_OBSERVER
	select BT_PER_ADV_SYNC
	select EXPERIMENTAL
	help
	  This option enables support for the Bluetooth Isochronous
	  Synchronized Receiver.

if BT_ISO

config BT_ISO_MAX_CHAN
	int "Maximum number of simultaneous ISO channels"
	depends on BT_ISO
	default BT_MAX_CONN if BT_CONN
	default 1
	range 1 64
	help
	  Maximum number of simultaneous Bluetooth isochronous channels
	  supported.

config BT_ISO_TX_BUF_COUNT
	int "Number of Isochronous TX buffers"
	default 1
	range 1 255
	help
	  Number of buffers available for outgoing Isochronous channel SDUs.

config BT_ISO_TX_FRAG_COUNT
	int "Number of ISO TX fragment buffers"
	default 2
	range 0 255
	help
	  Number of buffers available for fragments of TX buffers. Warning:
	  setting this to 0 means that the application must ensure that
	  queued TX buffers never need to be fragmented, i.e. that the
	  controller's buffer size is large enough. If this is not ensured,
	  and there are no dedicated fragment buffers, a deadlock may occur.
	  In most cases the default value of 2 is a safe bet.

config BT_ISO_TX_MTU
	int "Maximum supported MTU for Isochronous TX buffers"
	default 251
	range 1 4095
	help
	  Maximum MTU for Isochronous channels TX buffers.
	  This is the actual data payload. It doesn't include the optional
	  HCI ISO Data packet fields (e.g. `struct bt_hci_iso_ts_data_hdr`).
	  Set this value to 247 to fit 247 bytes of data within a single
	  HCI ISO Data packet with a size of 255, without utilizing timestamps.

config BT_ISO_RX_BUF_COUNT
	int "Number of Isochronous RX buffers"
	default 1
	range 1 255
	help
	  Number of buffers available for incoming Isochronous channel SDUs.

config BT_ISO_RX_MTU
	int "Maximum supported MTU for Isochronous RX buffers"
	default 251
	range 23 4095
	help
	  Maximum MTU for Isochronous channels RX buffers.
	  This is the actual data payload. It doesn't include the optional
	  HCI ISO Data packet fields (e.g. `struct bt_hci_iso_ts_data_hdr`)

config BT_ISO_TEST_PARAMS
	bool "ISO test parameters support"
	help
	  Enabling advanced ISO parameters will allow the use of the ISO test
	  parameters for creating a CIG or a BIG. These test parameters were
	  intended for testing, but can be used to allow the host to set more
	  settings that are otherwise usually controlled by the controller.

if BT_ISO_UNICAST

config BT_ISO_MAX_CIG
	int "Maximum number of Connected Isochronous Groups (CIGs) to support"
	default 1
	help
	  Maximum number of CIGs that are supported by the host. A CIG can be
	  used for either transmitting or receiving.

endif # BT_ISO_UNICAST

if BT_ISO_BROADCAST

config BT_ISO_MAX_BIG
	int "Maximum number of Broadcast Isochronous Groups (BIGs) to support"
	default 1
	help
	  Maximum number of BIGs that are supported by the host. A BIG can be
	  used for either transmitting or receiving, but not at the same time.

endif # BT_ISO_BROADCAST
endif # BT_ISO
