/*
 * Copyright (c) 2018-2021 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#if defined(CONFIG_BT_CTLR_RX_PDU_META)
#include "lll_meta.h"
#endif /* CONFIG_BT_CTLR_RX_PDU_META */

#define TICKER_INSTANCE_ID_CTLR 0
#define TICKER_USER_ID_LLL      MAYFLY_CALL_ID_0
#define TICKER_USER_ID_ULL_HIGH MAYFLY_CALL_ID_1
#define TICKER_USER_ID_ULL_LOW  MAYFLY_CALL_ID_2
#define TICKER_USER_ID_THREAD   MAYFLY_CALL_ID_PROGRAM

#define EVENT_PIPELINE_MAX 7
#if defined(CONFIG_BT_CTLR_LOW_LAT_ULL)
#define EVENT_DONE_LINK_CNT 0
#else
#define EVENT_DONE_LINK_CNT 1
#endif /* CONFIG_BT_CTLR_LOW_LAT_ULL */

#define ADV_INT_UNIT_US      625U
#define SCAN_INT_UNIT_US     625U
#define CONN_INT_UNIT_US     1250U
#define ISO_INT_UNIT_US      CONN_INT_UNIT_US
#define PERIODIC_INT_UNIT_US 1250U

/* Timeout for Host to accept/reject cis create request */
/* See BTCore5.3, 4.E.6.7 - Default value 0x1f40 * 625us */
#define DEFAULT_CONNECTION_ACCEPT_TIMEOUT_US (5 * USEC_PER_SEC)

/* Intervals after which connection or sync establishment is considered lost */
#define CONN_ESTAB_COUNTDOWN 6U

#if defined(CONFIG_BT_CTLR_XTAL_ADVANCED)
#define XON_BITMASK BIT(31) /* XTAL has been retained from previous prepare */
#endif /* CONFIG_BT_CTLR_XTAL_ADVANCED */

#if defined(CONFIG_BT_BROADCASTER)
#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 */
#else /* !CONFIG_BT_BROADCASTER */
#define BT_CTLR_ADV_SET 0
#endif /* !CONFIG_BT_BROADCASTER */

#if defined(CONFIG_BT_OBSERVER)
#if defined(CONFIG_BT_CTLR_ADV_EXT)
#if defined(CONFIG_BT_CTLR_PHY_CODED)
#define BT_CTLR_SCAN_SET 2
#else /* !CONFIG_BT_CTLR_PHY_CODED */
#define BT_CTLR_SCAN_SET 1
#endif /* !CONFIG_BT_CTLR_PHY_CODED */
#else /* !CONFIG_BT_CTLR_ADV_EXT */
#define BT_CTLR_SCAN_SET 1
#endif /* !CONFIG_BT_CTLR_ADV_EXT */
#else /* !CONFIG_BT_OBSERVER */
#define BT_CTLR_SCAN_SET 0
#endif /* !CONFIG_BT_OBSERVER */

enum {
	TICKER_ID_LLL_PREEMPT = 0,

#if defined(CONFIG_BT_BROADCASTER)
	TICKER_ID_ADV_STOP,
	TICKER_ID_ADV_BASE,
#if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_HCI_MESH_EXT)
	TICKER_ID_ADV_LAST = ((TICKER_ID_ADV_BASE) + (BT_CTLR_ADV_SET) - 1),
#if defined(CONFIG_BT_CTLR_ADV_EXT)
#if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
	TICKER_ID_ADV_AUX_BASE,
	TICKER_ID_ADV_AUX_LAST = ((TICKER_ID_ADV_AUX_BASE) +
				  (CONFIG_BT_CTLR_ADV_AUX_SET) - 1),
#if defined(CONFIG_BT_CTLR_ADV_PERIODIC)
	TICKER_ID_ADV_SYNC_BASE,
	TICKER_ID_ADV_SYNC_LAST = ((TICKER_ID_ADV_SYNC_BASE) +
				   (CONFIG_BT_CTLR_ADV_SYNC_SET) - 1),
#if defined(CONFIG_BT_CTLR_ADV_ISO)
	TICKER_ID_ADV_ISO_BASE,
	TICKER_ID_ADV_ISO_LAST = ((TICKER_ID_ADV_ISO_BASE) +
				  (CONFIG_BT_CTLR_ADV_ISO_SET) - 1),
#endif /* CONFIG_BT_CTLR_ADV_ISO */
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
#endif /* CONFIG_BT_CTLR_ADV_AUX_SET > 0 */
#endif /* CONFIG_BT_CTLR_ADV_EXT */
#endif /* !CONFIG_BT_CTLR_ADV_EXT || !CONFIG_BT_HCI_MESH_EXT */
#endif /* CONFIG_BT_BROADCASTER */

#if defined(CONFIG_BT_OBSERVER)
	TICKER_ID_SCAN_STOP,
	TICKER_ID_SCAN_BASE,
	TICKER_ID_SCAN_LAST = ((TICKER_ID_SCAN_BASE) + (BT_CTLR_SCAN_SET) - 1),
#if defined(CONFIG_BT_CTLR_ADV_EXT)
	TICKER_ID_SCAN_AUX_BASE,
	TICKER_ID_SCAN_AUX_LAST = ((TICKER_ID_SCAN_AUX_BASE) +
				   (CONFIG_BT_CTLR_SCAN_AUX_SET) - 1),
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
	TICKER_ID_SCAN_SYNC_BASE,
	TICKER_ID_SCAN_SYNC_LAST = ((TICKER_ID_SCAN_SYNC_BASE) +
				    (CONFIG_BT_PER_ADV_SYNC_MAX) - 1),
#if defined(CONFIG_BT_CTLR_SYNC_ISO)
	TICKER_ID_SCAN_SYNC_ISO_BASE,
	TICKER_ID_SCAN_SYNC_ISO_LAST = ((TICKER_ID_SCAN_SYNC_ISO_BASE) +
					(CONFIG_BT_CTLR_SCAN_SYNC_ISO_SET) - 1),
#endif /* CONFIG_BT_CTLR_SYNC_ISO */
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
#endif /* CONFIG_BT_CTLR_ADV_EXT */
#endif /* CONFIG_BT_OBSERVER */

#if defined(CONFIG_BT_CONN)
	TICKER_ID_CONN_BASE,
	TICKER_ID_CONN_LAST = ((TICKER_ID_CONN_BASE) + (CONFIG_BT_MAX_CONN) -
			       1),
#endif /* CONFIG_BT_CONN */

#if defined(CONFIG_BT_CTLR_CONN_ISO)
	TICKER_ID_CONN_ISO_BASE,
	TICKER_ID_CONN_ISO_LAST = ((TICKER_ID_CONN_ISO_BASE) +
				   (CONFIG_BT_CTLR_CONN_ISO_GROUPS) - 1),
	TICKER_ID_CONN_ISO_RESUME_BASE,
	TICKER_ID_CONN_ISO_RESUME_LAST = ((TICKER_ID_CONN_ISO_RESUME_BASE) +
					  (CONFIG_BT_CTLR_CONN_ISO_GROUPS) - 1),
#endif /* CONFIG_BT_CTLR_CONN_ISO */

#if defined(CONFIG_BT_CTLR_USER_EXT) && \
	(CONFIG_BT_CTLR_USER_TICKER_ID_RANGE > 0)
	TICKER_ID_USER_BASE,
	TICKER_ID_USER_LAST = (TICKER_ID_USER_BASE +
			       CONFIG_BT_CTLR_USER_TICKER_ID_RANGE - 1),
#endif /* CONFIG_BT_CTLR_USER_EXT */

	TICKER_ID_MAX,
};

#if defined(CONFIG_BT_BROADCASTER) && !defined(CONFIG_BT_CTLR_ADV_EXT) && \
	!defined(CONFIG_BT_HCI_MESH_EXT)
#define TICKER_ID_ADV_LAST TICKER_ID_ADV_BASE
#endif

/* Define the Broadcast ISO Stream Handle base value */
#if defined(CONFIG_BT_CTLR_ADV_ISO)
#define BT_CTLR_ADV_ISO_STREAM_MAX CONFIG_BT_CTLR_ADV_ISO_STREAM_MAX
#if defined(CONFIG_BT_MAX_CONN)
#define BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE (CONFIG_BT_MAX_CONN)
#else /* !CONFIG_BT_MAX_CONN */
#define BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE 0
#endif /* !CONFIG_BT_MAX_CONN */
#define LL_BIS_ADV_HANDLE_FROM_IDX(stream_handle) \
	((stream_handle) + (BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE))
#else /* !CONFIG_BT_CTLR_ADV_ISO */
#define BT_CTLR_ADV_ISO_STREAM_MAX 0
#endif /* CONFIG_BT_CTLR_ADV_ISO */

/* Define the ISO Synchronized Receiver Stream Handle base value */
#if defined(CONFIG_BT_CTLR_SYNC_ISO)
#define BT_CTLR_SYNC_ISO_STREAM_MAX CONFIG_BT_CTLR_SYNC_ISO_STREAM_MAX
#if defined(CONFIG_BT_CTLR_ADV_ISO)
#define BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE \
	(BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE + \
	 CONFIG_BT_CTLR_ADV_ISO_STREAM_COUNT)
#elif defined(CONFIG_BT_MAX_CONN)
#define BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE (CONFIG_BT_MAX_CONN)
#else /* !CONFIG_BT_MAX_CONN */
#define BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE 0
#endif /* !CONFIG_BT_MAX_CONN */
#define LL_BIS_SYNC_HANDLE_FROM_IDX(stream_handle) \
	((stream_handle) + (BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE))
#else /* !CONFIG_BT_CTLR_SYNC_ISO */
#define BT_CTLR_SYNC_ISO_STREAM_MAX 0
#endif /* !CONFIG_BT_CTLR_SYNC_ISO */

/* Define the ISO Connections Stream Handle base value */
#if defined(CONFIG_BT_CTLR_CONN_ISO)
#if defined(CONFIG_BT_CTLR_SYNC_ISO)
#define BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE \
	(BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE + \
	 CONFIG_BT_CTLR_SYNC_ISO_STREAM_COUNT)
#elif defined(CONFIG_BT_CTLR_ADV_ISO)
#define BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE \
	(BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE + \
	 CONFIG_BT_CTLR_ADV_ISO_STREAM_COUNT)
#else /* !CONFIG_BT_CTLR_ADV_ISO && !CONFIG_BT_CTLR_SYNC_ISO */
#define BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE (CONFIG_BT_MAX_CONN)
#endif /* !CONFIG_BT_CTLR_ADV_ISO && !CONFIG_BT_CTLR_SYNC_ISO */
#define LL_CIS_HANDLE_BASE (BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE)
#define LL_CIS_IDX_FROM_HANDLE(handle) \
	((handle) - LL_CIS_HANDLE_BASE)
#endif /* CONFIG_BT_CTLR_CONN_ISO */

#define TICKER_ID_ULL_BASE ((TICKER_ID_LLL_PREEMPT) + 1)

enum done_result {
	DONE_COMPLETED,
	DONE_ABORTED,
	DONE_LATE
};

/* Forward declaration data type to store CTE IQ samples report related data */
struct cte_conn_iq_report;

struct ull_hdr {
	uint8_t volatile ref;  /* Number of ongoing (between Prepare and Done)
				* events
				*/

	/* Event parameters */
	/* TODO: The intention is to use the greater of the
	 *       ticks_prepare_to_start or ticks_active_to_start as the prepare
	 *       offset. At the prepare tick generate a software interrupt
	 *       serviceable by application as the per role configurable advance
	 *       radio event notification, usable for data acquisitions.
	 *       ticks_preempt_to_start is the per role dynamic preempt offset,
	 *       which shall be based on role's preparation CPU usage
	 *       requirements.
	 */
	struct {
		uint32_t ticks_active_to_start;
		uint32_t ticks_prepare_to_start;
		uint32_t ticks_preempt_to_start;
		uint32_t ticks_slot;
	};

	/* ULL context disabled callback and its parameter */
	void (*disabled_cb)(void *param);
	void *disabled_param;
};

struct lll_hdr {
	void *parent;
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
	uint8_t score;
	uint8_t latency;
	int8_t  prio;
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
};

#define HDR_LLL2ULL(p) (((struct lll_hdr *)(p))->parent)

struct lll_prepare_param {
	uint32_t ticks_at_expire;
	uint32_t remainder;
	uint16_t lazy;
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
	int8_t  prio;
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
	uint8_t force;
	void *param;
};

typedef int (*lll_prepare_cb_t)(struct lll_prepare_param *prepare_param);
typedef int (*lll_is_abort_cb_t)(void *next, void *curr,
				 lll_prepare_cb_t *resume_cb);
typedef void (*lll_abort_cb_t)(struct lll_prepare_param *prepare_param,
			       void *param);

struct lll_event {
	struct lll_prepare_param prepare_param;
	lll_prepare_cb_t         prepare_cb;
	lll_is_abort_cb_t        is_abort_cb;
	lll_abort_cb_t           abort_cb;
	uint8_t                  is_resume:1;
	uint8_t                  is_aborted:1;
};

#define DEFINE_NODE_RX_USER_TYPE(i, _) NODE_RX_TYPE_##i

enum node_rx_type {
	/* Unused */
	NODE_RX_TYPE_NONE = 0x00,
	/* Signals release of node */
	NODE_RX_TYPE_RELEASE,
	/* Signals completion of RX event */
	NODE_RX_TYPE_EVENT_DONE,
	/* Signals arrival of RX Data Channel payload */
	NODE_RX_TYPE_DC_PDU,
	/* Signals arrival of isochronous payload */
	NODE_RX_TYPE_ISO_PDU,
	/* Advertisement report from scanning */
	NODE_RX_TYPE_REPORT,
	NODE_RX_TYPE_EXT_1M_REPORT,
	NODE_RX_TYPE_EXT_2M_REPORT,
	NODE_RX_TYPE_EXT_CODED_REPORT,
	NODE_RX_TYPE_EXT_AUX_REPORT,
	NODE_RX_TYPE_EXT_AUX_RELEASE,
	NODE_RX_TYPE_EXT_SCAN_TERMINATE,
	NODE_RX_TYPE_SYNC,
	NODE_RX_TYPE_SYNC_REPORT,
	NODE_RX_TYPE_SYNC_LOST,
	NODE_RX_TYPE_SYNC_CHM_COMPLETE,
	NODE_RX_TYPE_SYNC_ISO,
	NODE_RX_TYPE_SYNC_ISO_LOST,
	NODE_RX_TYPE_EXT_ADV_TERMINATE,
	NODE_RX_TYPE_BIG_COMPLETE,
	NODE_RX_TYPE_BIG_CHM_COMPLETE,
	NODE_RX_TYPE_BIG_TERMINATE,
	NODE_RX_TYPE_SCAN_REQ,
	NODE_RX_TYPE_CONNECTION,
	NODE_RX_TYPE_TERMINATE,
	NODE_RX_TYPE_CONN_UPDATE,
	NODE_RX_TYPE_ENC_REFRESH,
	NODE_RX_TYPE_APTO,
	NODE_RX_TYPE_CHAN_SEL_ALGO,
	NODE_RX_TYPE_PHY_UPDATE,
	NODE_RX_TYPE_RSSI,
	NODE_RX_TYPE_PROFILE,
	NODE_RX_TYPE_ADV_INDICATION,
	NODE_RX_TYPE_SCAN_INDICATION,
	NODE_RX_TYPE_CIS_REQUEST,
	NODE_RX_TYPE_CIS_ESTABLISHED,
	NODE_RX_TYPE_REQ_PEER_SCA_COMPLETE,
	NODE_RX_TYPE_MESH_ADV_CPLT,
	NODE_RX_TYPE_MESH_REPORT,
	NODE_RX_TYPE_SYNC_IQ_SAMPLE_REPORT,
	NODE_RX_TYPE_CONN_IQ_SAMPLE_REPORT,
	NODE_RX_TYPE_DTM_IQ_SAMPLE_REPORT,
	NODE_RX_TYPE_IQ_SAMPLE_REPORT_ULL_RELEASE,
	NODE_RX_TYPE_IQ_SAMPLE_REPORT_LLL_RELEASE,
	/* Signals retention (ie non-release) of rx node */
	NODE_RX_TYPE_RETAIN,

#if defined(CONFIG_BT_CTLR_USER_EXT)
	/* No entries shall be added after the NODE_RX_TYPE_USER_START/END */
	NODE_RX_TYPE_USER_START,
	LISTIFY(CONFIG_BT_CTLR_USER_EVT_RANGE, DEFINE_NODE_RX_USER_TYPE, (,), _),
	NODE_RX_TYPE_USER_END,
#endif /* CONFIG_BT_CTLR_USER_EXT */
};

/* Footer of node_rx_hdr */
struct node_rx_ftr {
	union {
		void *param;
		struct {
			uint8_t  status;
			uint8_t  num_events;
			uint16_t conn_handle;
		} param_adv_term;
	};
	union {
		void *extra;   /* Used as next pointer for extended PDU
				* chaining, to reserve node_rx for CSA#2 event
				* generation etc.
				*/
		void *aux_ptr;
		uint8_t aux_phy;
		struct cte_conn_iq_report *iq_report;
	};
	uint32_t ticks_anchor;
	uint32_t radio_end_us;
	uint8_t  rssi;

#if defined(CONFIG_BT_CTLR_PRIVACY)
	uint8_t  rl_idx;
	uint8_t  lrpa_used:1;
#endif /* CONFIG_BT_CTLR_PRIVACY */

#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP)
	uint8_t  direct:1;
#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */

#if defined(CONFIG_BT_CTLR_ADV_EXT) && defined(CONFIG_BT_OBSERVER)
	uint8_t  phy_flags:1;
	uint8_t  scan_req:1;
	uint8_t  scan_rsp:1;

#if defined(CONFIG_BT_CTLR_PRIVACY)
	uint8_t  direct_resolved:1;
#endif /* CONFIG_BT_CTLR_PRIVACY */

#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
	uint8_t  sync_status:2;
	uint8_t  sync_rx_enabled:1;
#if defined(CONFIG_BT_CTLR_FILTER_ACCEPT_LIST)
	uint8_t  devmatch:1;
#endif /* CONFIG_BT_CTLR_FILTER_ACCEPT_LIST */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */

	uint8_t  aux_sched:1;
	uint8_t  aux_lll_sched:1;
	uint8_t  aux_failed:1;

	uint16_t aux_data_len;
#endif /* CONFIG_BT_CTLR_ADV_EXT && CONFIG_BT_OBSERVER */

#if defined(CONFIG_BT_HCI_MESH_EXT)
	uint8_t  chan_idx;
#endif /* CONFIG_BT_HCI_MESH_EXT */
};

/* Meta-information for isochronous PDUs in node_rx_hdr */
struct node_rx_iso_meta {
	uint64_t payload_number:39; /* cisPayloadNumber */
	uint64_t status:8;          /* Status of reception (OK/not OK) */
	uint32_t timestamp;         /* Time of reception */
};

/* Define invalid/unassigned Controller state/role instance handle */
#define NODE_RX_HANDLE_INVALID 0xFFFF

/* Define invalid/unassigned Controller LLL context handle */
#define LLL_HANDLE_INVALID     0xFFFF

/* Define invalid/unassigned Controller Advertising LLL context handle */
#define LLL_ADV_HANDLE_INVALID 0xFF

/* Header of node_rx_pdu */
struct node_rx_hdr {
	union {
		void        *next;    /* For slist, by hci module */
		memq_link_t *link;    /* Supply memq_link from ULL to LLL */
		uint8_t     ack_last; /* Tx ack queue index at this node rx */
	};

	enum node_rx_type type;
	uint8_t           user_meta; /* User metadata */
	uint16_t          handle;    /* State/Role instance handle */

	union {
		struct node_rx_ftr rx_ftr;
#if defined(CONFIG_BT_CTLR_SYNC_ISO) || defined(CONFIG_BT_CTLR_CONN_ISO)
		struct node_rx_iso_meta rx_iso_meta;
#endif
#if defined(CONFIG_BT_CTLR_RX_PDU_META)
		lll_rx_pdu_meta_t  rx_pdu_meta;
#endif /* CONFIG_BT_CTLR_RX_PDU_META */
	};
};

/* Template node rx type with memory aligned offset to PDU buffer.
 * NOTE: offset to memory aligned pdu buffer location is used to reference
 *       node rx type specific information, like, terminate or sync lost reason
 *       from a dedicated node rx structure storage location.
 */
struct node_rx_pdu {
	struct node_rx_hdr hdr;
	union {
		uint8_t    pdu[0] __aligned(4);
	};
};

enum {
	EVENT_DONE_EXTRA_TYPE_NONE,

#if defined(CONFIG_BT_CONN)
	EVENT_DONE_EXTRA_TYPE_CONN,
#endif /* CONFIG_BT_CONN */

#if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
#if defined(CONFIG_BT_BROADCASTER)
	EVENT_DONE_EXTRA_TYPE_ADV,
	EVENT_DONE_EXTRA_TYPE_ADV_AUX,
#if defined(CONFIG_BT_CTLR_ADV_ISO)
	EVENT_DONE_EXTRA_TYPE_ADV_ISO_COMPLETE,
	EVENT_DONE_EXTRA_TYPE_ADV_ISO_TERMINATE,
#endif /* CONFIG_BT_CTLR_ADV_ISO */
#endif /* CONFIG_BT_BROADCASTER */
#endif /* CONFIG_BT_CTLR_ADV_EXT || CONFIG_BT_CTLR_JIT_SCHEDULING */

#if defined(CONFIG_BT_OBSERVER)
#if defined(CONFIG_BT_CTLR_ADV_EXT)
	EVENT_DONE_EXTRA_TYPE_SCAN,
	EVENT_DONE_EXTRA_TYPE_SCAN_AUX,
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
	EVENT_DONE_EXTRA_TYPE_SYNC,
#if defined(CONFIG_BT_CTLR_SYNC_ISO)
	EVENT_DONE_EXTRA_TYPE_SYNC_ISO_ESTAB,
	EVENT_DONE_EXTRA_TYPE_SYNC_ISO,
	EVENT_DONE_EXTRA_TYPE_SYNC_ISO_TERMINATE,
#endif /* CONFIG_BT_CTLR_SYNC_ISO */
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
#endif /* CONFIG_BT_CTLR_ADV_EXT */
#endif /* CONFIG_BT_OBSERVER */

#if defined(CONFIG_BT_CTLR_CONN_ISO)
	EVENT_DONE_EXTRA_TYPE_CIS,
#endif /* CONFIG_BT_CTLR_CONN_ISO */

/* Following proprietary defines must be at end of enum range */
#if defined(CONFIG_BT_CTLR_USER_EXT)
	EVENT_DONE_EXTRA_TYPE_USER_START,
	EVENT_DONE_EXTRA_TYPE_USER_END = EVENT_DONE_EXTRA_TYPE_USER_START +
		CONFIG_BT_CTLR_USER_EVT_RANGE,
#endif /* CONFIG_BT_CTLR_USER_EXT */

};

struct event_done_extra_drift {
	uint32_t start_to_address_actual_us;
	uint32_t window_widening_event_us;
	uint32_t preamble_to_addr_us;
};

struct event_done_extra {
	uint8_t type;
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
	uint8_t result;
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
	union {
		struct {
			union {
#if defined(CONFIG_BT_CTLR_CONN_ISO)
				uint32_t trx_performed_bitmask;
#endif /* CONFIG_BT_CTLR_CONN_ISO */

				struct {
					uint16_t trx_cnt;
					uint8_t  crc_valid:1;
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_CTE_TYPE_FILTERING) && \
	defined(CONFIG_BT_CTLR_CTEINLINE_SUPPORT)
					/* Used to inform ULL that periodic
					 * advertising sync scan should be
					 * terminated.
					 */
					uint8_t  sync_term:1;
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_CTE_TYPE_FILTERING && \
	* CONFIG_BT_CTLR_CTEINLINE_SUPPORT
	*/
				};
			};

#if defined(CONFIG_BT_CTLR_LE_ENC)
			uint8_t  mic_state;
#endif /* CONFIG_BT_CTLR_LE_ENC */

#if defined(CONFIG_BT_PERIPHERAL) || defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
			union {
				struct event_done_extra_drift drift;
			};
#endif /* CONFIG_BT_PERIPHERAL || CONFIG_BT_CTLR_SYNC_PERIODIC */
		};
	};
};

struct node_rx_event_done {
	struct node_rx_hdr      hdr;
	void                    *param;
	struct event_done_extra extra;
};

static inline void lll_hdr_init(void *lll, void *parent)
{
	struct lll_hdr *hdr = lll;

	hdr->parent = parent;

#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
	hdr->score = 0U;
	hdr->latency = 0U;
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
}

/* If ISO vendor data path is not used, queue directly to ll_iso_rx */
#if defined(CONFIG_BT_CTLR_ISO_VENDOR_DATA_PATH)
#define iso_rx_put(link, rx) ull_iso_rx_put(link, rx)
#define iso_rx_sched() ull_iso_rx_sched()
#else
#define iso_rx_put(link, rx) ll_iso_rx_put(link, rx)
#define iso_rx_sched() ll_rx_sched()
#endif /* CONFIG_BT_CTLR_ISO_VENDOR_DATA_PATH */

struct node_tx_iso;

void lll_done_score(void *param, uint8_t result);

int lll_init(void);
int lll_deinit(void);
int lll_reset(void);
void lll_resume(void *param);
void lll_disable(void *param);
void lll_done_ull_inc(void);
uint32_t lll_radio_is_idle(void);
uint32_t lll_radio_tx_ready_delay_get(uint8_t phy, uint8_t flags);
uint32_t lll_radio_rx_ready_delay_get(uint8_t phy, uint8_t flags);
int8_t lll_radio_tx_pwr_min_get(void);
int8_t lll_radio_tx_pwr_max_get(void);
int8_t lll_radio_tx_pwr_floor(int8_t tx_pwr_lvl);

int lll_csrand_get(void *buf, size_t len);
int lll_csrand_isr_get(void *buf, size_t len);
int lll_rand_get(void *buf, size_t len);
int lll_rand_isr_get(void *buf, size_t len);

struct lll_event *ull_prepare_enqueue(lll_is_abort_cb_t is_abort_cb,
				      lll_abort_cb_t abort_cb,
				      struct lll_prepare_param *prepare_param,
				      lll_prepare_cb_t prepare_cb,
				      uint8_t is_resume);
void *ull_prepare_dequeue_get(void);
void *ull_prepare_dequeue_iter(uint8_t *idx);
void ull_prepare_dequeue(uint8_t caller_id);
void *ull_pdu_rx_alloc_peek(uint8_t count);
void *ull_pdu_rx_alloc_peek_iter(uint8_t *idx);
void *ull_pdu_rx_alloc(void);
void *ull_iso_pdu_rx_alloc_peek(uint8_t count);
void *ull_iso_pdu_rx_alloc(void);
void ull_rx_put(memq_link_t *link, void *rx);
void ull_rx_put_done(memq_link_t *link, void *done);
void ull_rx_sched(void);
void ull_rx_sched_done(void);
void ull_rx_put_sched(memq_link_t *link, void *rx);
void ull_iso_rx_put(memq_link_t *link, void *rx);
void ull_iso_rx_sched(void);
void *ull_iso_tx_ack_dequeue(void);
void ull_iso_lll_ack_enqueue(uint16_t handle, struct node_tx_iso *tx);
void ull_iso_lll_event_prepare(uint16_t handle, uint64_t event_count);
struct event_done_extra *ull_event_done_extra_get(void);
struct event_done_extra *ull_done_extra_type_set(uint8_t type);
void *ull_event_done(void *param);

int lll_prepare(lll_is_abort_cb_t is_abort_cb,
		lll_abort_cb_t abort_cb,
		lll_prepare_cb_t prepare_cb, int8_t event_prio,
		struct lll_prepare_param *prepare_param);
int lll_resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio);
int lll_prepare_resolve(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
			lll_prepare_cb_t prepare_cb,
			struct lll_prepare_param *prepare_param,
			uint8_t is_resume, uint8_t is_dequeue);
