2018-12-17 10:46:13 +01:00
|
|
|
/*
|
2021-02-23 13:32:28 +05:30
|
|
|
* Copyright (c) 2018-2021 Nordic Semiconductor ASA
|
2018-12-17 10:46:13 +01:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
2020-05-21 14:51:16 +02:00
|
|
|
|
2019-09-27 09:14:23 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_RX_PDU_META)
|
|
|
|
#include "lll_meta.h"
|
|
|
|
#endif /* CONFIG_BT_CTLR_RX_PDU_META */
|
2018-12-17 10:46:13 +01:00
|
|
|
|
|
|
|
#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
|
|
|
|
|
2019-08-08 16:25:57 +05:30
|
|
|
#define EVENT_PIPELINE_MAX 7
|
2021-01-21 16:33:32 +01:00
|
|
|
#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 */
|
2018-12-17 10:46:13 +01:00
|
|
|
|
2021-01-16 13:38:07 +01:00
|
|
|
#define ADV_INT_UNIT_US 625U
|
|
|
|
#define SCAN_INT_UNIT_US 625U
|
|
|
|
#define CONN_INT_UNIT_US 1250U
|
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
#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 */
|
|
|
|
|
2021-02-23 13:32:28 +05:30
|
|
|
#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 */
|
|
|
|
|
2020-04-21 11:12:41 +05:30
|
|
|
#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 */
|
2021-02-24 21:40:04 +05:30
|
|
|
#else /* !CONFIG_BT_OBSERVER */
|
|
|
|
#define BT_CTLR_SCAN_SET 0
|
|
|
|
#endif /* !CONFIG_BT_OBSERVER */
|
2020-04-21 11:12:41 +05:30
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
enum {
|
|
|
|
TICKER_ID_LLL_PREEMPT = 0,
|
|
|
|
|
|
|
|
#if defined(CONFIG_BT_BROADCASTER)
|
|
|
|
TICKER_ID_ADV_STOP,
|
|
|
|
TICKER_ID_ADV_BASE,
|
2019-01-09 21:25:14 +05:30
|
|
|
#if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_HCI_MESH_EXT)
|
2021-02-23 13:32:28 +05:30
|
|
|
TICKER_ID_ADV_LAST = ((TICKER_ID_ADV_BASE) + (BT_CTLR_ADV_SET) - 1),
|
2020-05-04 17:59:12 +05:30
|
|
|
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
2020-02-12 08:55:57 +05:30
|
|
|
#if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
|
2020-03-13 16:24:01 +05:30
|
|
|
TICKER_ID_ADV_AUX_BASE,
|
|
|
|
TICKER_ID_ADV_AUX_LAST = ((TICKER_ID_ADV_AUX_BASE) +
|
2020-02-12 08:55:57 +05:30
|
|
|
(CONFIG_BT_CTLR_ADV_AUX_SET) - 1),
|
2020-03-13 16:24:01 +05:30
|
|
|
#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),
|
2020-10-30 11:26:26 +01:00
|
|
|
#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 */
|
2020-03-13 16:24:01 +05:30
|
|
|
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
|
2020-05-04 17:59:12 +05:30
|
|
|
#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 */
|
2020-03-13 16:24:01 +05:30
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
#if defined(CONFIG_BT_OBSERVER)
|
|
|
|
TICKER_ID_SCAN_STOP,
|
|
|
|
TICKER_ID_SCAN_BASE,
|
2020-04-21 11:12:41 +05:30
|
|
|
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,
|
2020-05-04 18:20:22 +05:30
|
|
|
TICKER_ID_SCAN_AUX_LAST = ((TICKER_ID_SCAN_AUX_BASE) +
|
2020-04-21 11:12:41 +05:30
|
|
|
(CONFIG_BT_CTLR_SCAN_AUX_SET) - 1),
|
2020-10-05 10:42:39 +05:30
|
|
|
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
|
2020-08-11 10:27:12 +05:30
|
|
|
TICKER_ID_SCAN_SYNC_BASE,
|
|
|
|
TICKER_ID_SCAN_SYNC_LAST = ((TICKER_ID_SCAN_SYNC_BASE) +
|
2021-02-05 10:08:16 +05:30
|
|
|
(CONFIG_BT_PER_ADV_SYNC_MAX) - 1),
|
2020-11-12 14:49:18 +01:00
|
|
|
#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) +
|
2020-12-25 10:38:34 +05:30
|
|
|
(CONFIG_BT_CTLR_SCAN_SYNC_ISO_SET) - 1),
|
2020-11-12 14:49:18 +01:00
|
|
|
#endif /* CONFIG_BT_CTLR_SYNC_ISO */
|
2020-08-11 10:27:12 +05:30
|
|
|
#endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
|
2020-04-21 11:12:41 +05:30
|
|
|
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
2018-12-17 10:46:13 +01:00
|
|
|
#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 */
|
|
|
|
|
2021-04-14 10:17:20 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_CONN_ISO)
|
2021-02-19 13:26:32 +01:00
|
|
|
TICKER_ID_CONN_ISO_BASE,
|
|
|
|
TICKER_ID_CONN_ISO_LAST = ((TICKER_ID_CONN_ISO_BASE) +
|
|
|
|
(CONFIG_BT_CTLR_CONN_ISO_GROUPS) - 1),
|
2021-03-29 13:22:25 +02:00
|
|
|
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),
|
2021-04-14 10:17:20 +02:00
|
|
|
#endif /* CONFIG_BT_CTLR_CONN_ISO */
|
2021-02-19 13:26:32 +01:00
|
|
|
|
2020-05-07 11:45:33 +02:00
|
|
|
#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 */
|
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
TICKER_ID_MAX,
|
|
|
|
};
|
|
|
|
|
2019-01-09 21:25:14 +05:30
|
|
|
#if defined(CONFIG_BT_BROADCASTER) && !defined(CONFIG_BT_CTLR_ADV_EXT) && \
|
|
|
|
!defined(CONFIG_BT_HCI_MESH_EXT)
|
2018-12-17 10:46:13 +01:00
|
|
|
#define TICKER_ID_ADV_LAST TICKER_ID_ADV_BASE
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#define TICKER_ID_ULL_BASE ((TICKER_ID_LLL_PREEMPT) + 1)
|
|
|
|
|
2021-05-25 14:52:44 +02:00
|
|
|
enum done_result {
|
|
|
|
DONE_COMPLETED,
|
|
|
|
DONE_ABORTED,
|
|
|
|
DONE_LATE
|
|
|
|
};
|
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
struct ull_hdr {
|
2020-09-09 15:57:34 +05:30
|
|
|
uint8_t volatile ref; /* Number of ongoing (between Prepare and Done)
|
|
|
|
* events
|
|
|
|
*/
|
2021-04-05 12:56:51 +05:30
|
|
|
|
|
|
|
/* 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
|
|
|
|
* servicable 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 */
|
2018-12-17 10:46:13 +01:00
|
|
|
void (*disabled_cb)(void *param);
|
|
|
|
void *disabled_param;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct lll_hdr {
|
|
|
|
void *parent;
|
2021-03-03 16:13:35 +01:00
|
|
|
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
|
|
|
|
uint8_t score;
|
|
|
|
uint8_t latency;
|
|
|
|
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
2021-04-05 12:56:51 +05:30
|
|
|
#define HDR_LLL2ULL(p) (((struct lll_hdr *)(p))->parent)
|
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
struct lll_prepare_param {
|
2020-05-27 11:26:57 -05:00
|
|
|
uint32_t ticks_at_expire;
|
|
|
|
uint32_t remainder;
|
|
|
|
uint16_t lazy;
|
2021-03-03 16:13:35 +01:00
|
|
|
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
|
|
|
|
int8_t prio;
|
|
|
|
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
|
2021-03-03 15:41:55 +01:00
|
|
|
uint8_t force;
|
|
|
|
void *param;
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
typedef int (*lll_prepare_cb_t)(struct lll_prepare_param *prepare_param);
|
2021-03-03 16:09:38 +01:00
|
|
|
typedef int (*lll_is_abort_cb_t)(void *next, void *curr,
|
|
|
|
lll_prepare_cb_t *resume_cb);
|
2018-12-17 10:46:13 +01:00
|
|
|
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;
|
2021-03-03 16:09:38 +01:00
|
|
|
uint8_t is_resume:1;
|
|
|
|
uint8_t is_aborted:1;
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
2020-11-10 13:51:28 +01:00
|
|
|
#define DEFINE_NODE_RX_USER_TYPE(i, _) NODE_RX_TYPE_##i,
|
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
enum node_rx_type {
|
2018-12-12 15:40:12 +01:00
|
|
|
/* Unused */
|
2018-12-17 10:46:13 +01:00
|
|
|
NODE_RX_TYPE_NONE = 0x00,
|
2020-11-12 09:20:44 +01:00
|
|
|
/* Signals release of node */
|
|
|
|
NODE_RX_TYPE_RELEASE,
|
2018-12-12 15:40:12 +01:00
|
|
|
/* Signals completion of RX event */
|
2020-11-10 13:51:28 +01:00
|
|
|
NODE_RX_TYPE_EVENT_DONE,
|
2018-12-12 15:40:12 +01:00
|
|
|
/* Signals arrival of RX Data Channel payload */
|
2020-11-10 13:51:28 +01:00
|
|
|
NODE_RX_TYPE_DC_PDU,
|
2021-01-20 11:10:15 +01:00
|
|
|
/* Signals arrival of isochronous payload */
|
|
|
|
NODE_RX_TYPE_ISO_PDU,
|
2018-12-12 15:40:12 +01:00
|
|
|
/* Advertisement report from scanning */
|
2020-11-10 13:51:28 +01:00
|
|
|
NODE_RX_TYPE_REPORT,
|
|
|
|
NODE_RX_TYPE_EXT_1M_REPORT,
|
|
|
|
NODE_RX_TYPE_EXT_2M_REPORT,
|
|
|
|
NODE_RX_TYPE_EXT_CODED_REPORT,
|
2020-11-05 18:13:25 +05:30
|
|
|
NODE_RX_TYPE_EXT_AUX_REPORT,
|
2021-08-03 05:59:29 +05:30
|
|
|
NODE_RX_TYPE_EXT_AUX_RELEASE,
|
2020-11-10 13:51:28 +01:00
|
|
|
NODE_RX_TYPE_EXT_SCAN_TERMINATE,
|
|
|
|
NODE_RX_TYPE_SYNC,
|
2020-11-05 18:13:25 +05:30
|
|
|
NODE_RX_TYPE_SYNC_REPORT,
|
2020-11-10 13:51:28 +01:00
|
|
|
NODE_RX_TYPE_SYNC_LOST,
|
2021-08-25 20:38:10 +05:30
|
|
|
NODE_RX_TYPE_SYNC_CHM_COMPLETE,
|
2020-11-09 16:31:01 +01:00
|
|
|
NODE_RX_TYPE_SYNC_ISO,
|
|
|
|
NODE_RX_TYPE_SYNC_ISO_LOST,
|
2020-11-10 13:51:28 +01:00
|
|
|
NODE_RX_TYPE_EXT_ADV_TERMINATE,
|
2020-10-21 21:14:07 +02:00
|
|
|
NODE_RX_TYPE_BIG_COMPLETE,
|
|
|
|
NODE_RX_TYPE_BIG_TERMINATE,
|
2020-11-10 13:51:28 +01:00
|
|
|
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_MESH_ADV_CPLT,
|
|
|
|
NODE_RX_TYPE_MESH_REPORT,
|
2021-02-26 13:44:06 +01:00
|
|
|
NODE_RX_TYPE_IQ_SAMPLE_REPORT,
|
2020-11-10 13:51:28 +01:00
|
|
|
|
|
|
|
#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,
|
|
|
|
UTIL_LISTIFY(CONFIG_BT_CTLR_USER_EVT_RANGE, DEFINE_NODE_RX_USER_TYPE, _)
|
|
|
|
NODE_RX_TYPE_USER_END,
|
|
|
|
#endif /* CONFIG_BT_CTLR_USER_EXT */
|
2019-05-09 15:41:39 +02:00
|
|
|
};
|
2019-05-01 12:27:13 +02:00
|
|
|
|
|
|
|
/* Footer of node_rx_hdr */
|
|
|
|
struct node_rx_ftr {
|
2020-07-15 13:34:55 +05:30
|
|
|
union {
|
|
|
|
void *param;
|
|
|
|
struct {
|
|
|
|
uint8_t status;
|
|
|
|
uint8_t num_events;
|
|
|
|
uint16_t conn_handle;
|
|
|
|
} param_adv_term;
|
|
|
|
};
|
2021-05-18 15:45:45 +05:30
|
|
|
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;
|
|
|
|
};
|
2020-05-27 11:26:57 -05:00
|
|
|
uint32_t ticks_anchor;
|
2020-04-21 11:21:07 +05:30
|
|
|
uint32_t radio_end_us;
|
2020-05-27 11:26:57 -05:00
|
|
|
uint8_t rssi;
|
2021-07-27 21:05:07 +05:30
|
|
|
#if defined(CONFIG_BT_CTLR_ADV_EXT) && defined(CONFIG_BT_OBSERVER)
|
2021-08-25 11:09:28 +02:00
|
|
|
uint8_t aux_lll_sched:1;
|
|
|
|
uint8_t aux_w4next:1;
|
2021-08-27 17:42:33 +02:00
|
|
|
uint8_t aux_failed:1;
|
2021-08-25 11:09:28 +02:00
|
|
|
|
2021-08-18 11:16:18 +05:30
|
|
|
uint8_t phy_flags:1;
|
2021-07-27 21:05:07 +05:30
|
|
|
uint8_t scan_req:1;
|
|
|
|
uint8_t scan_rsp:1;
|
|
|
|
#endif /* CONFIG_BT_CTLR_ADV_EXT && CONFIG_BT_OBSERVER */
|
2021-08-07 16:18:11 +05:30
|
|
|
#if defined(CONFIG_BT_CTLR_EXT_SCAN_FP)
|
|
|
|
uint8_t direct:1;
|
|
|
|
#endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */
|
2019-05-23 14:51:14 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_PRIVACY)
|
2020-05-27 11:26:57 -05:00
|
|
|
uint8_t lrpa_used:1;
|
|
|
|
uint8_t rl_idx;
|
2019-05-23 14:51:14 +02:00
|
|
|
#endif /* CONFIG_BT_CTLR_PRIVACY */
|
|
|
|
#if defined(CONFIG_BT_HCI_MESH_EXT)
|
2020-05-27 11:26:57 -05:00
|
|
|
uint8_t chan_idx;
|
2019-05-23 14:51:14 +02:00
|
|
|
#endif /* CONFIG_BT_HCI_MESH_EXT */
|
2019-05-01 12:27:13 +02:00
|
|
|
};
|
|
|
|
|
2021-01-20 11:10:15 +01:00
|
|
|
/* Meta-information for isochronous PDUs in node_rx_hdr */
|
|
|
|
struct node_rx_iso_meta {
|
|
|
|
uint64_t payload_number : 39; /* cisPayloadNumber */
|
|
|
|
uint32_t timestamp; /* Time of reception */
|
|
|
|
uint8_t status; /* Status of reception (OK/not OK) */
|
|
|
|
};
|
2019-05-01 12:27:13 +02:00
|
|
|
|
2021-08-23 23:26:10 +05:30
|
|
|
/* Define invalid/unassigned Controller state/role instance handle */
|
|
|
|
#define NODE_RX_HANDLE_INVALID 0xFFFF
|
|
|
|
|
2021-08-26 19:44:01 +05:30
|
|
|
/* Define invalid/unassigned Controller LLL context handle */
|
|
|
|
#define LLL_HANDLE_INVALID 0xFFFF
|
|
|
|
|
2018-12-12 15:40:12 +01:00
|
|
|
/* Header of node_rx_pdu */
|
2018-12-17 10:46:13 +01:00
|
|
|
struct node_rx_hdr {
|
|
|
|
union {
|
2020-07-15 13:37:42 +05:30
|
|
|
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 */
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
2020-07-15 13:37:42 +05:30
|
|
|
enum node_rx_type type;
|
|
|
|
uint8_t user_meta; /* User metadata */
|
|
|
|
uint16_t handle; /* State/Role instance handle */
|
2018-12-17 10:46:13 +01:00
|
|
|
|
2019-09-27 09:14:23 +02:00
|
|
|
union {
|
2021-01-20 11:10:15 +01:00
|
|
|
struct node_rx_ftr rx_ftr;
|
2021-04-14 10:17:20 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_SYNC_ISO) || defined(CONFIG_BT_CTLR_CONN_ISO)
|
2021-01-20 11:10:15 +01:00
|
|
|
struct node_rx_iso_meta rx_iso_meta;
|
|
|
|
#endif
|
2019-09-27 09:14:23 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_RX_PDU_META)
|
|
|
|
lll_rx_pdu_meta_t rx_pdu_meta;
|
|
|
|
#endif /* CONFIG_BT_CTLR_RX_PDU_META */
|
|
|
|
};
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
2020-11-10 18:12:58 +05:30
|
|
|
/* 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.
|
|
|
|
*/
|
2018-12-17 10:46:13 +01:00
|
|
|
struct node_rx_pdu {
|
|
|
|
struct node_rx_hdr hdr;
|
2020-11-10 18:12:58 +05:30
|
|
|
union {
|
|
|
|
uint8_t pdu[0] __aligned(4);
|
|
|
|
};
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
enum {
|
|
|
|
EVENT_DONE_EXTRA_TYPE_NONE,
|
2020-08-11 10:44:52 +05:30
|
|
|
|
|
|
|
#if defined(CONFIG_BT_CONN)
|
2018-12-17 10:46:13 +01:00
|
|
|
EVENT_DONE_EXTRA_TYPE_CONN,
|
2020-08-11 10:44:52 +05:30
|
|
|
#endif /* CONFIG_BT_CONN */
|
2020-04-21 11:12:41 +05:30
|
|
|
|
2021-05-25 14:52:44 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
|
2020-09-02 13:52:29 +05:30
|
|
|
#if defined(CONFIG_BT_BROADCASTER)
|
2020-06-18 14:13:41 +02:00
|
|
|
EVENT_DONE_EXTRA_TYPE_ADV,
|
2021-08-11 11:05:56 +05:30
|
|
|
EVENT_DONE_EXTRA_TYPE_ADV_AUX,
|
2020-09-02 13:52:29 +05:30
|
|
|
#endif /* CONFIG_BT_BROADCASTER */
|
2021-05-25 14:52:44 +02:00
|
|
|
#endif /* CONFIG_BT_CTLR_ADV_EXT || CONFIG_BT_CTLR_JIT_SCHEDULING */
|
2020-06-18 14:13:41 +02:00
|
|
|
|
2020-04-21 11:12:41 +05:30
|
|
|
#if defined(CONFIG_BT_OBSERVER)
|
|
|
|
#if defined(CONFIG_BT_CTLR_ADV_EXT)
|
2020-09-02 13:52:29 +05:30
|
|
|
EVENT_DONE_EXTRA_TYPE_SCAN,
|
2020-04-21 11:12:41 +05:30
|
|
|
EVENT_DONE_EXTRA_TYPE_SCAN_AUX,
|
2020-10-05 10:42:39 +05:30
|
|
|
#if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
|
2020-08-11 11:01:26 +05:30
|
|
|
EVENT_DONE_EXTRA_TYPE_SYNC,
|
2020-10-05 10:42:39 +05:30
|
|
|
#endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
|
2020-04-21 11:12:41 +05:30
|
|
|
#endif /* CONFIG_BT_CTLR_ADV_EXT */
|
|
|
|
#endif /* CONFIG_BT_OBSERVER */
|
|
|
|
|
2021-04-14 10:17:20 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_CONN_ISO)
|
2021-02-19 13:26:32 +01:00
|
|
|
EVENT_DONE_EXTRA_TYPE_CIS,
|
2021-04-14 10:17:20 +02:00
|
|
|
#endif /* CONFIG_BT_CTLR_CONN_ISO */
|
2021-02-19 13:26:32 +01:00
|
|
|
|
2019-05-09 15:41:39 +02:00
|
|
|
/* 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 */
|
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
2020-08-11 10:38:23 +05:30
|
|
|
struct event_done_extra_drift {
|
2020-05-27 11:26:57 -05:00
|
|
|
uint32_t start_to_address_actual_us;
|
|
|
|
uint32_t window_widening_event_us;
|
|
|
|
uint32_t preamble_to_addr_us;
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct event_done_extra {
|
2020-05-27 11:26:57 -05:00
|
|
|
uint8_t type;
|
2021-05-25 14:52:44 +02:00
|
|
|
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
|
|
|
|
uint8_t result;
|
|
|
|
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
|
2018-12-17 10:46:13 +01:00
|
|
|
union {
|
|
|
|
struct {
|
2020-05-27 11:26:57 -05:00
|
|
|
uint16_t trx_cnt;
|
|
|
|
uint8_t crc_valid;
|
2018-12-17 10:46:13 +01:00
|
|
|
#if defined(CONFIG_BT_CTLR_LE_ENC)
|
2020-05-27 11:26:57 -05:00
|
|
|
uint8_t mic_state;
|
2018-12-17 10:46:13 +01:00
|
|
|
#endif /* CONFIG_BT_CTLR_LE_ENC */
|
2020-10-05 10:42:39 +05:30
|
|
|
#if defined(CONFIG_BT_PERIPHERAL) || defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
|
2018-12-17 10:46:13 +01:00
|
|
|
union {
|
2020-08-11 10:38:23 +05:30
|
|
|
struct event_done_extra_drift drift;
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
2020-10-05 10:42:39 +05:30
|
|
|
#endif /* CONFIG_BT_PERIPHERAL || CONFIG_BT_CTLR_SYNC_PERIODIC */
|
2018-12-17 10:46:13 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
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;
|
2021-03-03 16:13:35 +01:00
|
|
|
|
|
|
|
#if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
|
|
|
|
hdr->score = 0U;
|
|
|
|
hdr->latency = 0U;
|
|
|
|
#endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
|
2018-12-17 10:46:13 +01:00
|
|
|
}
|
|
|
|
|
2021-05-25 14:52:44 +02:00
|
|
|
void lll_done_score(void *param, uint8_t result);
|
2021-03-03 16:13:35 +01:00
|
|
|
|
2018-12-17 10:46:13 +01:00
|
|
|
int lll_init(void);
|
2019-10-10 11:18:30 +02:00
|
|
|
int lll_reset(void);
|
2018-12-17 10:46:13 +01:00
|
|
|
void lll_resume(void *param);
|
|
|
|
void lll_disable(void *param);
|
2021-03-28 07:34:26 +05:30
|
|
|
void lll_done_sync(void);
|
2020-05-27 11:26:57 -05:00
|
|
|
uint32_t lll_radio_is_idle(void);
|
2020-04-21 11:21:07 +05:30
|
|
|
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);
|
2020-05-27 11:26:57 -05:00
|
|
|
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);
|
2018-12-17 10:46:13 +01:00
|
|
|
|
2020-05-21 14:51:16 +02:00
|
|
|
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);
|
|
|
|
|
2021-05-04 09:56:35 +05:30
|
|
|
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);
|
2018-12-17 10:46:13 +01:00
|
|
|
void *ull_prepare_dequeue_get(void);
|
2020-05-27 11:26:57 -05:00
|
|
|
void *ull_prepare_dequeue_iter(uint8_t *idx);
|
2021-03-28 07:34:26 +05:30
|
|
|
void ull_prepare_dequeue(uint8_t caller_id);
|
2020-05-27 11:26:57 -05:00
|
|
|
void *ull_pdu_rx_alloc_peek(uint8_t count);
|
|
|
|
void *ull_pdu_rx_alloc_peek_iter(uint8_t *idx);
|
2018-12-17 10:46:13 +01:00
|
|
|
void *ull_pdu_rx_alloc(void);
|
2021-01-20 11:10:15 +01:00
|
|
|
void *ull_iso_pdu_rx_alloc_peek(uint8_t count);
|
|
|
|
void *ull_iso_pdu_rx_alloc_peek_iter(uint8_t *idx);
|
|
|
|
void *ull_iso_pdu_rx_alloc(void);
|
2018-12-17 10:46:13 +01:00
|
|
|
void ull_rx_put(memq_link_t *link, void *rx);
|
2021-01-21 16:33:32 +01:00
|
|
|
void ull_rx_put_done(memq_link_t *link, void *done);
|
2018-12-17 10:46:13 +01:00
|
|
|
void ull_rx_sched(void);
|
2021-01-21 16:33:32 +01:00
|
|
|
void ull_rx_sched_done(void);
|
2021-08-18 16:28:04 +05:30
|
|
|
struct event_done_extra *ull_event_done_extra_get(void);
|
|
|
|
struct event_done_extra *ull_done_extra_type_set(uint8_t type);
|
2018-12-17 10:46:13 +01:00
|
|
|
void *ull_event_done(void *param);
|
2021-03-03 15:59:00 +01:00
|
|
|
|
|
|
|
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,
|
2021-03-03 16:09:38 +01:00
|
|
|
lll_prepare_cb_t prepare_cb,
|
2021-03-03 15:59:00 +01:00
|
|
|
struct lll_prepare_param *prepare_param,
|
|
|
|
uint8_t is_resume, uint8_t is_dequeue);
|