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 latency_prepare;
34 	uint16_t latency_event;
35 	union {
36 		struct lll_sync_iso_data_chan data_chan;
37 
38 #if defined(CONFIG_BT_CTLR_SYNC_ISO_INTERLEAVED)
39 		struct lll_sync_iso_data_chan_interleaved
40 			interleaved_data_chan[BT_CTLR_SYNC_ISO_STREAM_MAX];
41 #endif /* CONFIG_BT_CTLR_SYNC_ISO_INTERLEAVED */
42 	};
43 	uint8_t  next_chan_use;
44 
45 	uint64_t payload_count:39;
46 	uint64_t framing:1;
47 	uint64_t enc:1;
48 	uint64_t ctrl:1;
49 	uint64_t cssn_curr:3;
50 	uint64_t cssn_next:3;
51 
52 	uint8_t data_chan_map[PDU_CHANNEL_MAP_SIZE];
53 	uint8_t data_chan_count:6;
54 	uint8_t num_bis:5;
55 	uint8_t bn:3;
56 	uint8_t nse:5;
57 	uint8_t phy:3;
58 
59 	uint32_t sub_interval:20;
60 	uint32_t max_pdu:8;
61 	uint32_t pto:4;
62 
63 	uint32_t bis_spacing:20;
64 	uint32_t max_sdu:8;
65 	uint32_t irc:4;
66 
67 	uint32_t sdu_interval:20;
68 	uint32_t irc_curr:4;
69 	uint32_t ptc_curr:4;
70 	uint32_t ptc:4;
71 
72 	uint8_t bn_curr:3;
73 	uint8_t bis_curr:5;
74 
75 	uint8_t stream_curr:5;
76 	uint8_t establish_events:3;
77 
78 	/* Encryption */
79 	uint8_t giv[8];
80 	struct ccm ccm_rx;
81 
82 	uint8_t chm_chan_map[PDU_CHANNEL_MAP_SIZE];
83 	uint8_t chm_chan_count:6;
84 
85 	uint8_t term_reason;
86 
87 	uint16_t ctrl_instant;
88 
89 	uint8_t stream_count;
90 	uint16_t stream_handle[BT_CTLR_SYNC_ISO_STREAM_MAX];
91 
92 	struct node_rx_pdu *payload[BT_CTLR_SYNC_ISO_STREAM_MAX]
93 				   [PDU_BIG_PAYLOAD_COUNT_MAX];
94 	uint8_t payload_count_max;
95 	uint8_t payload_tail;
96 
97 	uint32_t window_widening_periodic_us;
98 	uint32_t window_widening_max_us;
99 	uint32_t window_widening_prepare_us;
100 	uint32_t window_widening_event_us;
101 	uint32_t window_size_event_us;
102 };
103 
104 int lll_sync_iso_init(void);
105 int lll_sync_iso_reset(void);
106 void lll_sync_iso_create_prepare(void *param);
107 void lll_sync_iso_prepare(void *param);
108 void lll_sync_iso_flush(uint8_t handle, struct lll_sync_iso *lll);
109 
110 extern uint8_t ull_sync_iso_lll_index_get(struct lll_sync_iso *lll);
111 extern struct lll_sync_iso_stream *ull_sync_iso_lll_stream_get(uint16_t handle);
112 extern void ll_iso_rx_put(memq_link_t *link, void *rx);
113 extern void ll_rx_sched(void);
114