1 /*
2  * Copyright (c) 2018-2021 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 #if defined(CONFIG_BT_CTLR_RX_PDU_META)
8 #include "lll_meta.h"
9 #endif /* CONFIG_BT_CTLR_RX_PDU_META */
10 
11 #define TICKER_INSTANCE_ID_CTLR 0
12 #define TICKER_USER_ID_LLL      MAYFLY_CALL_ID_0
13 #define TICKER_USER_ID_ULL_HIGH MAYFLY_CALL_ID_1
14 #define TICKER_USER_ID_ULL_LOW  MAYFLY_CALL_ID_2
15 #define TICKER_USER_ID_THREAD   MAYFLY_CALL_ID_PROGRAM
16 
17 #define EVENT_PIPELINE_MAX 7
18 
19 #define ADV_INT_UNIT_US          625U
20 #define SCAN_INT_UNIT_US         625U
21 #define CONN_INT_UNIT_US         1250U
22 #define ISO_INT_UNIT_US          CONN_INT_UNIT_US
23 #define PERIODIC_INT_UNIT_US     CONN_INT_UNIT_US
24 #define CONN_LOW_LAT_INT_UNIT_US 500U
25 
26 #define ISO_INTERVAL_TO_US(interval) ((interval) * ISO_INT_UNIT_US)
27 
28 /* Timeout for Host to accept/reject cis create request */
29 /* See BTCore5.3, 4.E.6.7 - Default value 0x1f40 * 625us */
30 #define DEFAULT_CONNECTION_ACCEPT_TIMEOUT_US (5 * USEC_PER_SEC)
31 
32 /* Intervals after which connection or sync establishment is considered lost */
33 #define CONN_ESTAB_COUNTDOWN 6U
34 
35 #if defined(CONFIG_BT_BROADCASTER)
36 #if defined(CONFIG_BT_CTLR_ADV_SET)
37 #define BT_CTLR_ADV_SET CONFIG_BT_CTLR_ADV_SET
38 #else /* CONFIG_BT_CTLR_ADV_SET */
39 #define BT_CTLR_ADV_SET 1
40 #endif /* CONFIG_BT_CTLR_ADV_SET */
41 #else /* !CONFIG_BT_BROADCASTER */
42 #define BT_CTLR_ADV_SET 0
43 #endif /* !CONFIG_BT_BROADCASTER */
44 
45 #if defined(CONFIG_BT_OBSERVER)
46 #if defined(CONFIG_BT_CTLR_ADV_EXT)
47 #if defined(CONFIG_BT_CTLR_PHY_CODED)
48 #define BT_CTLR_SCAN_SET 2
49 #else /* !CONFIG_BT_CTLR_PHY_CODED */
50 #define BT_CTLR_SCAN_SET 1
51 #endif /* !CONFIG_BT_CTLR_PHY_CODED */
52 #else /* !CONFIG_BT_CTLR_ADV_EXT */
53 #define BT_CTLR_SCAN_SET 1
54 #endif /* !CONFIG_BT_CTLR_ADV_EXT */
55 #else /* !CONFIG_BT_OBSERVER */
56 #define BT_CTLR_SCAN_SET 0
57 #endif /* !CONFIG_BT_OBSERVER */
58 
59 enum {
60 	TICKER_ID_LLL_PREEMPT = 0,
61 
62 #if defined(CONFIG_BT_BROADCASTER)
63 	TICKER_ID_ADV_STOP,
64 	TICKER_ID_ADV_BASE,
65 #if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_HCI_MESH_EXT)
66 	TICKER_ID_ADV_LAST = ((TICKER_ID_ADV_BASE) + (BT_CTLR_ADV_SET) - 1),
67 #if defined(CONFIG_BT_CTLR_ADV_EXT)
68 #if (CONFIG_BT_CTLR_ADV_AUX_SET > 0)
69 	TICKER_ID_ADV_AUX_BASE,
70 	TICKER_ID_ADV_AUX_LAST = ((TICKER_ID_ADV_AUX_BASE) +
71 				  (CONFIG_BT_CTLR_ADV_AUX_SET) - 1),
72 #if defined(CONFIG_BT_CTLR_ADV_PERIODIC)
73 	TICKER_ID_ADV_SYNC_BASE,
74 	TICKER_ID_ADV_SYNC_LAST = ((TICKER_ID_ADV_SYNC_BASE) +
75 				   (CONFIG_BT_CTLR_ADV_SYNC_SET) - 1),
76 #if defined(CONFIG_BT_CTLR_ADV_ISO)
77 	TICKER_ID_ADV_ISO_BASE,
78 	TICKER_ID_ADV_ISO_LAST = ((TICKER_ID_ADV_ISO_BASE) +
79 				  (CONFIG_BT_CTLR_ADV_ISO_SET) - 1),
80 #endif /* CONFIG_BT_CTLR_ADV_ISO */
81 #endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
82 #endif /* CONFIG_BT_CTLR_ADV_AUX_SET > 0 */
83 #endif /* CONFIG_BT_CTLR_ADV_EXT */
84 #endif /* !CONFIG_BT_CTLR_ADV_EXT || !CONFIG_BT_HCI_MESH_EXT */
85 #endif /* CONFIG_BT_BROADCASTER */
86 
87 #if defined(CONFIG_BT_OBSERVER)
88 	TICKER_ID_SCAN_STOP,
89 	TICKER_ID_SCAN_BASE,
90 	TICKER_ID_SCAN_LAST = ((TICKER_ID_SCAN_BASE) + (BT_CTLR_SCAN_SET) - 1),
91 #if defined(CONFIG_BT_CTLR_ADV_EXT)
92 #if defined(CONFIG_BT_CTLR_SCAN_AUX_USE_CHAINS)
93 	TICKER_ID_SCAN_AUX,
94 #else /* !CONFIG_BT_CTLR_SCAN_AUX_USE_CHAINS */
95 	TICKER_ID_SCAN_AUX_BASE,
96 	TICKER_ID_SCAN_AUX_LAST = ((TICKER_ID_SCAN_AUX_BASE) +
97 				   (CONFIG_BT_CTLR_SCAN_AUX_SET) - 1),
98 #endif /* !CONFIG_BT_CTLR_SCAN_AUX_USE_CHAINS */
99 #if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
100 	TICKER_ID_SCAN_SYNC_BASE,
101 	TICKER_ID_SCAN_SYNC_LAST = ((TICKER_ID_SCAN_SYNC_BASE) +
102 				    (CONFIG_BT_PER_ADV_SYNC_MAX) - 1),
103 #if defined(CONFIG_BT_CTLR_SYNC_ISO)
104 	TICKER_ID_SCAN_SYNC_ISO_BASE,
105 	TICKER_ID_SCAN_SYNC_ISO_LAST = ((TICKER_ID_SCAN_SYNC_ISO_BASE) +
106 					(CONFIG_BT_CTLR_SCAN_SYNC_ISO_SET) - 1),
107 	TICKER_ID_SCAN_SYNC_ISO_RESUME_BASE,
108 	TICKER_ID_SCAN_SYNC_ISO_RESUME_LAST = ((TICKER_ID_SCAN_SYNC_ISO_RESUME_BASE) +
109 					       (CONFIG_BT_CTLR_SCAN_SYNC_ISO_SET) - 1),
110 #endif /* CONFIG_BT_CTLR_SYNC_ISO */
111 #endif /* CONFIG_BT_CTLR_ADV_PERIODIC */
112 #endif /* CONFIG_BT_CTLR_ADV_EXT */
113 #endif /* CONFIG_BT_OBSERVER */
114 
115 #if defined(CONFIG_BT_CONN)
116 	TICKER_ID_CONN_BASE,
117 	TICKER_ID_CONN_LAST = ((TICKER_ID_CONN_BASE) + (CONFIG_BT_MAX_CONN) -
118 			       1),
119 #endif /* CONFIG_BT_CONN */
120 
121 #if defined(CONFIG_BT_CTLR_CONN_ISO)
122 	TICKER_ID_CONN_ISO_BASE,
123 	TICKER_ID_CONN_ISO_LAST = ((TICKER_ID_CONN_ISO_BASE) +
124 				   (CONFIG_BT_CTLR_CONN_ISO_GROUPS) - 1),
125 	TICKER_ID_CONN_ISO_RESUME_BASE,
126 	TICKER_ID_CONN_ISO_RESUME_LAST = ((TICKER_ID_CONN_ISO_RESUME_BASE) +
127 					  (CONFIG_BT_CTLR_CONN_ISO_GROUPS) - 1),
128 #endif /* CONFIG_BT_CTLR_CONN_ISO */
129 
130 #if defined(CONFIG_BT_CTLR_USER_EXT) && \
131 	(CONFIG_BT_CTLR_USER_TICKER_ID_RANGE > 0)
132 	TICKER_ID_USER_BASE,
133 	TICKER_ID_USER_LAST = (TICKER_ID_USER_BASE +
134 			       CONFIG_BT_CTLR_USER_TICKER_ID_RANGE - 1),
135 #endif /* CONFIG_BT_CTLR_USER_EXT */
136 
137 	TICKER_ID_MAX,
138 };
139 
140 #if defined(CONFIG_BT_BROADCASTER) && !defined(CONFIG_BT_CTLR_ADV_EXT) && \
141 	!defined(CONFIG_BT_HCI_MESH_EXT)
142 #define TICKER_ID_ADV_LAST TICKER_ID_ADV_BASE
143 #endif
144 
145 /* Define the Broadcast ISO Stream Handle base value */
146 #if defined(CONFIG_BT_CTLR_ADV_ISO)
147 #define BT_CTLR_ADV_ISO_STREAM_MAX CONFIG_BT_CTLR_ADV_ISO_STREAM_MAX
148 #if defined(CONFIG_BT_MAX_CONN)
149 #define BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE (CONFIG_BT_MAX_CONN)
150 #else /* !CONFIG_BT_MAX_CONN */
151 #define BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE 0
152 #endif /* !CONFIG_BT_MAX_CONN */
153 #define LL_BIS_ADV_HANDLE_FROM_IDX(stream_handle) \
154 	((stream_handle) + (BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE))
155 #else /* !CONFIG_BT_CTLR_ADV_ISO */
156 #define BT_CTLR_ADV_ISO_STREAM_MAX 0
157 #endif /* CONFIG_BT_CTLR_ADV_ISO */
158 
159 /* Define the ISO Synchronized Receiver Stream Handle base value */
160 #if defined(CONFIG_BT_CTLR_SYNC_ISO)
161 #define BT_CTLR_SYNC_ISO_STREAM_MAX CONFIG_BT_CTLR_SYNC_ISO_STREAM_MAX
162 #if defined(CONFIG_BT_CTLR_ADV_ISO)
163 #define BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE \
164 	(BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE + \
165 	 CONFIG_BT_CTLR_ADV_ISO_STREAM_COUNT)
166 #elif defined(CONFIG_BT_MAX_CONN)
167 #define BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE (CONFIG_BT_MAX_CONN)
168 #else /* !CONFIG_BT_MAX_CONN */
169 #define BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE 0
170 #endif /* !CONFIG_BT_MAX_CONN */
171 #define LL_BIS_SYNC_HANDLE_FROM_IDX(stream_handle) \
172 	((stream_handle) + (BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE))
173 #else /* !CONFIG_BT_CTLR_SYNC_ISO */
174 #define BT_CTLR_SYNC_ISO_STREAM_MAX 0
175 #endif /* !CONFIG_BT_CTLR_SYNC_ISO */
176 
177 /* Define the ISO Connections Stream Handle base value */
178 #if defined(CONFIG_BT_CTLR_CONN_ISO)
179 #if defined(CONFIG_BT_CTLR_SYNC_ISO)
180 #define BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE \
181 	(BT_CTLR_SYNC_ISO_STREAM_HANDLE_BASE + \
182 	 CONFIG_BT_CTLR_SYNC_ISO_STREAM_COUNT)
183 #elif defined(CONFIG_BT_CTLR_ADV_ISO)
184 #define BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE \
185 	(BT_CTLR_ADV_ISO_STREAM_HANDLE_BASE + \
186 	 CONFIG_BT_CTLR_ADV_ISO_STREAM_COUNT)
187 #else /* !CONFIG_BT_CTLR_ADV_ISO && !CONFIG_BT_CTLR_SYNC_ISO */
188 #define BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE (CONFIG_BT_MAX_CONN)
189 #endif /* !CONFIG_BT_CTLR_ADV_ISO && !CONFIG_BT_CTLR_SYNC_ISO */
190 #define LL_CIS_HANDLE_BASE (BT_CTLR_CONN_ISO_STREAM_HANDLE_BASE)
191 #define LL_CIS_IDX_FROM_HANDLE(handle) \
192 	((handle) - LL_CIS_HANDLE_BASE)
193 #endif /* CONFIG_BT_CTLR_CONN_ISO */
194 
195 #define TICKER_ID_ULL_BASE ((TICKER_ID_LLL_PREEMPT) + 1)
196 
197 enum done_result {
198 	DONE_COMPLETED,
199 	DONE_ABORTED,
200 	DONE_LATE
201 };
202 
203 /* Forward declaration data type to store CTE IQ samples report related data */
204 struct cte_conn_iq_report;
205 
206 struct ull_hdr {
207 	uint8_t volatile ref;  /* Number of ongoing (between Prepare and Done)
208 				* events
209 				*/
210 
211 	/* Event parameters */
212 	struct {
213 		uint32_t ticks_slot;
214 	};
215 
216 	/* ULL context disabled callback and its parameter */
217 	void (*disabled_cb)(void *param);
218 	void *disabled_param;
219 };
220 
221 struct lll_hdr {
222 	void *parent;
223 #if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
224 	uint8_t score;
225 	uint8_t latency;
226 	int8_t  prio;
227 #endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
228 };
229 
230 #define HDR_LLL2ULL(p) (((struct lll_hdr *)(p))->parent)
231 
232 struct lll_prepare_param {
233 	uint32_t ticks_at_expire;
234 	uint32_t remainder;
235 	uint16_t lazy;
236 #if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
237 	int8_t  prio;
238 #endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
239 	uint8_t force;
240 	void *param;
241 };
242 
243 typedef int (*lll_prepare_cb_t)(struct lll_prepare_param *prepare_param);
244 typedef int (*lll_is_abort_cb_t)(void *next, void *curr,
245 				 lll_prepare_cb_t *resume_cb);
246 typedef void (*lll_abort_cb_t)(struct lll_prepare_param *prepare_param,
247 			       void *param);
248 
249 struct lll_event {
250 	struct lll_prepare_param prepare_param;
251 	lll_prepare_cb_t         prepare_cb;
252 	lll_is_abort_cb_t        is_abort_cb;
253 	lll_abort_cb_t           abort_cb;
254 	uint8_t                  is_resume:1;
255 	uint8_t                  is_aborted:1;
256 };
257 
258 #define DEFINE_NODE_RX_USER_TYPE(i, _) NODE_RX_TYPE_##i
259 
260 enum node_rx_type {
261 	/* Unused */
262 	NODE_RX_TYPE_NONE = 0x00,
263 	/* Signals release of node */
264 	NODE_RX_TYPE_RELEASE,
265 	/* Signals completion of RX event */
266 	NODE_RX_TYPE_EVENT_DONE,
267 	/* Signals arrival of RX Data Channel payload */
268 	NODE_RX_TYPE_DC_PDU,
269 	/* Signals arrival of isochronous payload */
270 	NODE_RX_TYPE_ISO_PDU,
271 	/* Advertisement report from scanning */
272 	NODE_RX_TYPE_REPORT,
273 	NODE_RX_TYPE_EXT_1M_REPORT,
274 	NODE_RX_TYPE_EXT_2M_REPORT,
275 	NODE_RX_TYPE_EXT_CODED_REPORT,
276 	NODE_RX_TYPE_EXT_AUX_REPORT,
277 	NODE_RX_TYPE_EXT_AUX_RELEASE,
278 	NODE_RX_TYPE_EXT_SCAN_TERMINATE,
279 	NODE_RX_TYPE_SYNC,
280 	NODE_RX_TYPE_SYNC_REPORT,
281 	NODE_RX_TYPE_SYNC_LOST,
282 	NODE_RX_TYPE_SYNC_CHM_COMPLETE,
283 	NODE_RX_TYPE_SYNC_ISO,
284 	NODE_RX_TYPE_SYNC_ISO_LOST,
285 	NODE_RX_TYPE_EXT_ADV_TERMINATE,
286 	NODE_RX_TYPE_BIG_COMPLETE,
287 	NODE_RX_TYPE_BIG_CHM_COMPLETE,
288 	NODE_RX_TYPE_BIG_TERMINATE,
289 	NODE_RX_TYPE_SCAN_REQ,
290 	NODE_RX_TYPE_CONNECTION,
291 	NODE_RX_TYPE_TERMINATE,
292 	NODE_RX_TYPE_CONN_UPDATE,
293 	NODE_RX_TYPE_ENC_REFRESH,
294 	NODE_RX_TYPE_APTO,
295 	NODE_RX_TYPE_CHAN_SEL_ALGO,
296 	NODE_RX_TYPE_PHY_UPDATE,
297 	NODE_RX_TYPE_RSSI,
298 	NODE_RX_TYPE_PROFILE,
299 	NODE_RX_TYPE_ADV_INDICATION,
300 	NODE_RX_TYPE_SCAN_INDICATION,
301 	NODE_RX_TYPE_CIS_REQUEST,
302 	NODE_RX_TYPE_CIS_ESTABLISHED,
303 	NODE_RX_TYPE_REQ_PEER_SCA_COMPLETE,
304 	NODE_RX_TYPE_MESH_ADV_CPLT,
305 	NODE_RX_TYPE_MESH_REPORT,
306 	NODE_RX_TYPE_SYNC_IQ_SAMPLE_REPORT,
307 	NODE_RX_TYPE_CONN_IQ_SAMPLE_REPORT,
308 	NODE_RX_TYPE_DTM_IQ_SAMPLE_REPORT,
309 	NODE_RX_TYPE_IQ_SAMPLE_REPORT_ULL_RELEASE,
310 	NODE_RX_TYPE_IQ_SAMPLE_REPORT_LLL_RELEASE,
311 	NODE_RX_TYPE_SYNC_TRANSFER_RECEIVED,
312 	NODE_RX_TYPE_PATH_LOSS,
313 	/* Signals retention (ie non-release) of rx node */
314 	NODE_RX_TYPE_RETAIN,
315 
316 #if defined(CONFIG_BT_CTLR_USER_EXT)
317 	/* No entries shall be added after the NODE_RX_TYPE_USER_START/END */
318 	NODE_RX_TYPE_USER_START,
319 	LISTIFY(CONFIG_BT_CTLR_USER_EVT_RANGE, DEFINE_NODE_RX_USER_TYPE, (,), _),
320 	NODE_RX_TYPE_USER_END,
321 #endif /* CONFIG_BT_CTLR_USER_EXT */
322 };
323 
324 /* Footer of node_rx_hdr */
325 struct node_rx_ftr {
326 	union {
327 		void *param;
328 		struct {
329 			uint8_t  status;
330 			uint8_t  num_events;
331 			uint16_t conn_handle;
332 		} param_adv_term;
333 	};
334 	union {
335 		void *extra;   /* Used as next pointer for extended PDU
336 				* chaining, to reserve node_rx for CSA#2 event
337 				* generation etc.
338 				*/
339 		void *lll_aux; /* LLL scheduled auxiliary context associated to
340 				* the scan context when enqueuing the node rx.
341 				* This does not overlap the below aux_ptr or
342 				* aux_phy which are used before enqueue when
343 				* setting up LLL scheduling.
344 				*/
345 		void *aux_ptr; /* aux pointer stored when LLL scheduling the
346 				* auxiliary PDU reception by scan context.
347 				*/
348 		uint8_t aux_phy; /* aux phy stored when LLL scheduling the
349 				  * auxiliary PDU reception by scan context.
350 				  */
351 		struct cte_conn_iq_report *iq_report;
352 	};
353 	uint32_t ticks_anchor;
354 	uint32_t radio_end_us;
355 	uint8_t  rssi;
356 
357 #if defined(CONFIG_BT_CTLR_PRIVACY)
358 	uint8_t  rl_idx;
359 	uint8_t  lrpa_used:1;
360 #endif /* CONFIG_BT_CTLR_PRIVACY */
361 
362 #if defined(CONFIG_BT_CTLR_EXT_SCAN_FP)
363 	uint8_t  direct:1;
364 #endif /* CONFIG_BT_CTLR_EXT_SCAN_FP */
365 
366 #if defined(CONFIG_BT_CTLR_ADV_EXT) && defined(CONFIG_BT_OBSERVER)
367 	uint8_t  phy_flags:1;
368 	uint8_t  scan_req:1;
369 	uint8_t  scan_rsp:1;
370 
371 #if defined(CONFIG_BT_CTLR_PRIVACY)
372 	uint8_t  direct_resolved:1;
373 #endif /* CONFIG_BT_CTLR_PRIVACY */
374 
375 #if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
376 	uint8_t  sync_status:2;
377 	uint8_t  sync_rx_enabled:1;
378 #if defined(CONFIG_BT_CTLR_FILTER_ACCEPT_LIST)
379 	uint8_t  devmatch:1;
380 #endif /* CONFIG_BT_CTLR_FILTER_ACCEPT_LIST */
381 #endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
382 
383 	uint8_t  aux_sched:1;
384 	uint8_t  aux_lll_sched:1;
385 	uint8_t  aux_failed:1;
386 
387 	uint16_t aux_data_len;
388 #endif /* CONFIG_BT_CTLR_ADV_EXT && CONFIG_BT_OBSERVER */
389 
390 #if defined(CONFIG_BT_HCI_MESH_EXT)
391 	uint8_t  chan_idx;
392 #endif /* CONFIG_BT_HCI_MESH_EXT */
393 };
394 
395 /* Meta-information for isochronous PDUs in node_rx_hdr */
396 struct node_rx_iso_meta {
397 	uint64_t payload_number:39; /* cisPayloadNumber */
398 	uint64_t status:8;          /* Status of reception (OK/not OK) */
399 	uint32_t timestamp;         /* Time of reception */
400 	void     *next;             /* Pointer to next pre-transmission rx_node (BIS) */
401 };
402 
403 /* Define invalid/unassigned Controller state/role instance handle */
404 #define NODE_RX_HANDLE_INVALID 0xFFFF
405 
406 /* Define invalid/unassigned Controller LLL context handle */
407 #define LLL_HANDLE_INVALID     0xFFFF
408 
409 /* Define invalid/unassigned Controller Advertising LLL context handle */
410 #define LLL_ADV_HANDLE_INVALID 0xFF
411 
412 /* Header of node_rx_pdu */
413 struct node_rx_hdr {
414 	union {
415 		void        *next;    /* For slist, by hci module */
416 		memq_link_t *link;    /* Supply memq_link from ULL to LLL */
417 		uint8_t     ack_last; /* Tx ack queue index at this node rx */
418 	};
419 	enum node_rx_type type;
420 	uint8_t           user_meta; /* User metadata */
421 	uint16_t          handle;    /* State/Role instance handle */
422 };
423 
424 
425 /* Template node rx type with memory aligned offset to PDU buffer.
426  * NOTE: offset to memory aligned pdu buffer location is used to reference
427  *       node rx type specific information, like, terminate or sync lost reason
428  *       from a dedicated node rx structure storage location.
429  */
430 struct node_rx_pdu {
431 	struct node_rx_hdr hdr;
432 	union {
433 		struct node_rx_ftr rx_ftr;
434 #if defined(CONFIG_BT_CTLR_SYNC_ISO) || defined(CONFIG_BT_CTLR_CONN_ISO)
435 		struct node_rx_iso_meta rx_iso_meta;
436 #endif
437 #if defined(CONFIG_BT_CTLR_RX_PDU_META)
438 		lll_rx_pdu_meta_t  rx_pdu_meta;
439 #endif /* CONFIG_BT_CTLR_RX_PDU_META */
440 	};
441 	union {
442 		uint8_t    pdu[0] __aligned(4);
443 	};
444 };
445 
446 enum {
447 	EVENT_DONE_EXTRA_TYPE_NONE,
448 
449 #if defined(CONFIG_BT_CONN)
450 	EVENT_DONE_EXTRA_TYPE_CONN,
451 #endif /* CONFIG_BT_CONN */
452 
453 #if defined(CONFIG_BT_CTLR_ADV_EXT) || defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
454 #if defined(CONFIG_BT_BROADCASTER)
455 	EVENT_DONE_EXTRA_TYPE_ADV,
456 	EVENT_DONE_EXTRA_TYPE_ADV_AUX,
457 #if defined(CONFIG_BT_CTLR_ADV_ISO)
458 	EVENT_DONE_EXTRA_TYPE_ADV_ISO_COMPLETE,
459 	EVENT_DONE_EXTRA_TYPE_ADV_ISO_TERMINATE,
460 #endif /* CONFIG_BT_CTLR_ADV_ISO */
461 #endif /* CONFIG_BT_BROADCASTER */
462 #endif /* CONFIG_BT_CTLR_ADV_EXT || CONFIG_BT_CTLR_JIT_SCHEDULING */
463 
464 #if defined(CONFIG_BT_OBSERVER)
465 #if defined(CONFIG_BT_CTLR_ADV_EXT)
466 	EVENT_DONE_EXTRA_TYPE_SCAN,
467 	EVENT_DONE_EXTRA_TYPE_SCAN_AUX,
468 #if defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
469 	EVENT_DONE_EXTRA_TYPE_SYNC,
470 #if defined(CONFIG_BT_CTLR_SYNC_ISO)
471 	EVENT_DONE_EXTRA_TYPE_SYNC_ISO_ESTAB,
472 	EVENT_DONE_EXTRA_TYPE_SYNC_ISO,
473 	EVENT_DONE_EXTRA_TYPE_SYNC_ISO_TERMINATE,
474 #endif /* CONFIG_BT_CTLR_SYNC_ISO */
475 #endif /* CONFIG_BT_CTLR_SYNC_PERIODIC */
476 #endif /* CONFIG_BT_CTLR_ADV_EXT */
477 #endif /* CONFIG_BT_OBSERVER */
478 
479 #if defined(CONFIG_BT_CTLR_CONN_ISO)
480 	EVENT_DONE_EXTRA_TYPE_CIS,
481 #endif /* CONFIG_BT_CTLR_CONN_ISO */
482 
483 /* Following proprietary defines must be at end of enum range */
484 #if defined(CONFIG_BT_CTLR_USER_EXT)
485 	EVENT_DONE_EXTRA_TYPE_USER_START,
486 	EVENT_DONE_EXTRA_TYPE_USER_END = EVENT_DONE_EXTRA_TYPE_USER_START +
487 		CONFIG_BT_CTLR_USER_EVT_RANGE,
488 #endif /* CONFIG_BT_CTLR_USER_EXT */
489 
490 };
491 
492 struct event_done_extra_drift {
493 	uint32_t start_to_address_actual_us;
494 	uint32_t window_widening_event_us;
495 	uint32_t preamble_to_addr_us;
496 };
497 
498 struct event_done_extra {
499 	uint8_t type;
500 #if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
501 	uint8_t result;
502 #endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
503 	union {
504 		struct {
505 			union {
506 #if defined(CONFIG_BT_CTLR_CONN_ISO)
507 				uint32_t trx_performed_bitmask;
508 #endif /* CONFIG_BT_CTLR_CONN_ISO */
509 
510 				struct {
511 					uint16_t trx_cnt;
512 					uint8_t  crc_valid:1;
513 					uint8_t  is_aborted:1;
514 #if defined(CONFIG_BT_CTLR_SYNC_ISO)
515 					uint8_t  estab_failed:1;
516 #endif /* CONFIG_BT_CTLR_SYNC_ISO */
517 #if defined(CONFIG_BT_CTLR_SYNC_PERIODIC_CTE_TYPE_FILTERING) && \
518 	defined(CONFIG_BT_CTLR_CTEINLINE_SUPPORT)
519 					/* Used to inform ULL that periodic
520 					 * advertising sync scan should be
521 					 * terminated.
522 					 */
523 					uint8_t  sync_term:1;
524 #endif /* CONFIG_BT_CTLR_SYNC_PERIODIC_CTE_TYPE_FILTERING && \
525 	* CONFIG_BT_CTLR_CTEINLINE_SUPPORT
526 	*/
527 				};
528 
529 #if defined(CONFIG_BT_CTLR_SCAN_AUX_USE_CHAINS)
530 				void *lll;
531 #endif /* CONFIG_BT_CTLR_SCAN_AUX_USE_CHAINS */
532 			};
533 
534 #if defined(CONFIG_BT_CTLR_LE_ENC)
535 			uint8_t  mic_state;
536 #endif /* CONFIG_BT_CTLR_LE_ENC */
537 
538 #if defined(CONFIG_BT_PERIPHERAL) || defined(CONFIG_BT_CTLR_SYNC_PERIODIC)
539 			union {
540 				struct event_done_extra_drift drift;
541 			};
542 #endif /* CONFIG_BT_PERIPHERAL || CONFIG_BT_CTLR_SYNC_PERIODIC */
543 		};
544 	};
545 };
546 
547 struct node_rx_event_done {
548 	struct node_rx_hdr      hdr;
549 	void                    *param;
550 	struct event_done_extra extra;
551 };
552 
lll_hdr_init(void * lll,void * parent)553 static inline void lll_hdr_init(void *lll, void *parent)
554 {
555 	struct lll_hdr *hdr = lll;
556 
557 	hdr->parent = parent;
558 
559 #if defined(CONFIG_BT_CTLR_JIT_SCHEDULING)
560 	hdr->score = 0U;
561 	hdr->latency = 0U;
562 #endif /* CONFIG_BT_CTLR_JIT_SCHEDULING */
563 }
564 
565 /* If ISO vendor data path is not used, queue directly to ll_iso_rx */
566 #if defined(CONFIG_BT_CTLR_ISO_VENDOR_DATA_PATH)
567 #define iso_rx_put(link, rx) ull_iso_rx_put(link, rx)
568 #define iso_rx_sched() ull_iso_rx_sched()
569 #else
570 #define iso_rx_put(link, rx) ll_iso_rx_put(link, rx)
571 #define iso_rx_sched() ll_rx_sched()
572 #endif /* CONFIG_BT_CTLR_ISO_VENDOR_DATA_PATH */
573 
574 struct node_tx_iso;
575 
576 void lll_done_score(void *param, uint8_t result);
577 
578 int lll_init(void);
579 int lll_deinit(void);
580 int lll_reset(void);
581 void lll_resume(void *param);
582 void lll_disable(void *param);
583 void lll_done_ull_inc(void);
584 uint32_t lll_radio_is_idle(void);
585 uint32_t lll_radio_tx_ready_delay_get(uint8_t phy, uint8_t flags);
586 uint32_t lll_radio_rx_ready_delay_get(uint8_t phy, uint8_t flags);
587 int8_t lll_radio_tx_pwr_min_get(void);
588 int8_t lll_radio_tx_pwr_max_get(void);
589 int8_t lll_radio_tx_pwr_floor(int8_t tx_pwr_lvl);
590 
591 int lll_csrand_get(void *buf, size_t len);
592 int lll_csrand_isr_get(void *buf, size_t len);
593 int lll_rand_get(void *buf, size_t len);
594 int lll_rand_isr_get(void *buf, size_t len);
595 
596 struct lll_event *ull_prepare_enqueue(lll_is_abort_cb_t is_abort_cb,
597 				      lll_abort_cb_t abort_cb,
598 				      struct lll_prepare_param *prepare_param,
599 				      lll_prepare_cb_t prepare_cb,
600 				      uint8_t is_resume);
601 void *ull_prepare_dequeue_get(void);
602 void *ull_prepare_dequeue_iter(uint8_t *idx);
603 void ull_prepare_dequeue(uint8_t caller_id);
604 void *ull_pdu_rx_alloc_peek(uint8_t count);
605 void *ull_pdu_rx_alloc_peek_iter(uint8_t *idx);
606 void *ull_pdu_rx_alloc(void);
607 void *ull_iso_pdu_rx_alloc_peek(uint8_t count);
608 void *ull_iso_pdu_rx_alloc(void);
609 void ull_rx_put(memq_link_t *link, void *rx);
610 void ull_rx_sched(void);
611 void ull_rx_put_sched(memq_link_t *link, void *rx);
612 void ull_iso_rx_put(memq_link_t *link, void *rx);
613 void ull_iso_rx_sched(void);
614 void *ull_iso_tx_ack_dequeue(void);
615 void ull_iso_lll_ack_enqueue(uint16_t handle, struct node_tx_iso *tx);
616 void ull_iso_lll_event_prepare(uint16_t handle, uint64_t event_count);
617 struct event_done_extra *ull_event_done_extra_get(void);
618 struct event_done_extra *ull_done_extra_type_set(uint8_t type);
619 void *ull_event_done(void *param);
620 
621 int lll_prepare(lll_is_abort_cb_t is_abort_cb,
622 		lll_abort_cb_t abort_cb,
623 		lll_prepare_cb_t prepare_cb, int8_t event_prio,
624 		struct lll_prepare_param *prepare_param);
625 int lll_resume_enqueue(lll_prepare_cb_t resume_cb, int resume_prio);
626 int lll_prepare_resolve(lll_is_abort_cb_t is_abort_cb, lll_abort_cb_t abort_cb,
627 			lll_prepare_cb_t prepare_cb,
628 			struct lll_prepare_param *prepare_param,
629 			uint8_t is_resume, uint8_t is_dequeue);
630