1 /*
2  * Copyright (c) 2020-2021 Nordic Semiconductor ASA
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 
7 struct lll_sync_iso_stream {
8 	uint8_t big_handle;
9 	uint8_t bis_index;
10 	struct ll_iso_rx_test_mode *test_mode;
11 	struct ll_iso_datapath *dp;
12 };
13 
14 struct lll_sync_iso_data_chan {
15 	uint16_t prn_s;
16 	uint16_t remap_idx;
17 };
18 
19 struct lll_sync_iso_data_chan_interleaved {
20 	uint16_t prn_s;
21 	uint16_t remap_idx;
22 	uint16_t id;
23 };
24 
25 struct lll_sync_iso {
26 	struct lll_hdr hdr;
27 
28 	uint8_t seed_access_addr[4];
29 	uint8_t base_crc_init[2];
30 
31 	uint16_t iso_interval;
32 
33 	uint16_t lazy_prepare;
34 	uint16_t latency_prepare;
35 	uint16_t latency_event;
36 
37 	union {
38 		struct lll_sync_iso_data_chan data_chan;
39 
40 #if defined(CONFIG_BT_CTLR_SYNC_ISO_INTERLEAVED)
41 		struct lll_sync_iso_data_chan_interleaved
42 			interleaved_data_chan[BT_CTLR_SYNC_ISO_STREAM_MAX];
43 #endif /* CONFIG_BT_CTLR_SYNC_ISO_INTERLEAVED */
44 	};
45 	uint8_t  next_chan_use;
46 
47 	uint64_t payload_count:39;
48 	uint64_t framing:1;
49 	uint64_t enc:1;
50 	uint64_t ctrl:1;
51 	uint64_t cssn_curr:3;
52 	uint64_t cssn_next:3;
53 
54 	uint8_t data_chan_map[PDU_CHANNEL_MAP_SIZE];
55 	uint8_t data_chan_count:6;
56 	uint8_t num_bis:5;
57 	uint8_t bn:3;
58 	uint8_t nse:5;
59 	uint8_t phy:3;
60 
61 	uint32_t sub_interval:20;
62 	uint32_t max_pdu:8;
63 	uint32_t pto:4;
64 
65 	uint32_t bis_spacing:20;
66 	uint32_t max_sdu:8;
67 	uint32_t irc:4;
68 
69 	uint32_t sdu_interval:20;
70 	uint32_t irc_curr:4;
71 	uint32_t ptc_curr:4;
72 	uint32_t ptc:4;
73 
74 	uint8_t bn_curr:3;
75 	uint8_t bis_curr:5;
76 
77 	uint8_t stream_curr:5;
78 	uint8_t establish_events:3;
79 
80 	/* Encryption */
81 	uint8_t giv[8];
82 	struct ccm ccm_rx;
83 
84 	uint8_t chm_chan_map[PDU_CHANNEL_MAP_SIZE];
85 	uint8_t chm_chan_count:6;
86 
87 	uint8_t term_reason;
88 
89 	uint16_t ctrl_instant;
90 
91 	uint8_t stream_count;
92 	uint16_t stream_handle[BT_CTLR_SYNC_ISO_STREAM_MAX];
93 
94 	struct node_rx_pdu *payload[BT_CTLR_SYNC_ISO_STREAM_MAX]
95 				   [PDU_BIG_PAYLOAD_COUNT_MAX];
96 	uint8_t payload_count_max;
97 	uint8_t payload_tail;
98 
99 	uint32_t window_widening_periodic_us;
100 	uint32_t window_widening_max_us;
101 	uint32_t window_widening_prepare_us;
102 	uint32_t window_widening_event_us;
103 	uint32_t window_size_event_us;
104 };
105 
106 int lll_sync_iso_init(void);
107 int lll_sync_iso_reset(void);
108 void lll_sync_iso_create_prepare(void *param);
109 void lll_sync_iso_prepare(void *param);
110 void lll_sync_iso_flush(uint8_t handle, struct lll_sync_iso *lll);
111 
112 extern uint8_t ull_sync_iso_lll_index_get(struct lll_sync_iso *lll);
113 extern struct lll_sync_iso_stream *ull_sync_iso_lll_stream_get(uint16_t handle);
114 extern void ll_iso_rx_put(memq_link_t *link, void *rx);
115 extern void ll_rx_sched(void);
116