# 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"
	depends on !BT_CTLR || BT_CTLR_PERIPHERAL_ISO_SUPPORT
	depends on BT_PERIPHERAL
	select BT_ISO_UNICAST
	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"
	depends on !BT_CTLR || BT_CTLR_CENTRAL_ISO_SUPPORT
	depends on BT_CENTRAL
	select BT_ISO_UNICAST
	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"
	depends on !BT_CTLR || BT_CTLR_ADV_ISO_SUPPORT
	select BT_ISO_BROADCAST
	select BT_ISO_TX
	select BT_BROADCASTER
	select BT_PER_ADV
	help
	  This option enables support for the Bluetooth Isochronous Broadcaster.

config BT_ISO_SYNC_RECEIVER
	bool "Bluetooth Isochronous Synchronized Receiver Support"
	depends on !BT_CTLR || BT_CTLR_SYNC_ISO_SUPPORT
	depends on BT_OBSERVER
	select BT_ISO_BROADCAST
	select BT_ISO_RX
	select BT_PER_ADV_SYNC
	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 $(UINT8_MAX)
	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 $(UINT8_MAX)
	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"
	range 1 4095
	default 247
	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_sdu_ts_hdr`).
	  Set this value to 247 to fit 247 bytes of data within a single
	  HCI ISO Data packet with Data_Total_Length of 255, utilizing
	  timestamps.

config BT_ISO_RX_BUF_COUNT
	int "Number of Isochronous RX buffers"
	default 1
	range 1 $(UINT8_MAX)
	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_sdu_ts_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
