1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _SYS_UWB_UWB_H
27 #define _SYS_UWB_UWB_H
28
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 /*
35 * IOCTLs and related data structures for UWB Radio Controller drivers.
36 */
37
38 /* IOCTLs */
39 #define UWB_IOCTL_BASE 0x1000
40 #define UWB_COMMAND (UWB_IOCTL_BASE + 0x1)
41 #define UWB_GET_NOTIFICATION (UWB_IOCTL_BASE + 0x2)
42
43 #define UWB_CE_TYPE_GENERAL 0 /* General Command/Event type */
44
45 /*
46 * UWB Radio Controller Commands and Events:
47 *
48 * See WUSB spec 1.0 [Table 8-68]
49 * See WHCI 0.95 [Table 3-2],[Table 3-5]
50 */
51 /* Commands */
52 #define UWB_CE_CHANNEL_CHANGE 16
53 #define UWB_CE_DEV_ADDR_MGMT 17
54 #define UWB_CE_GET_IE 18
55 #define UWB_CE_RESET 19
56 #define UWB_CE_SCAN 20
57 #define UWB_CE_SET_BEACON_FILTER 21
58 #define UWB_CE_SET_DRP_IE 22
59 #define UWB_CE_SET_IE 23
60 #define UWB_CE_SET_NOTIFICATION_FILTER 24
61 #define UWB_CE_SET_TX_POWER 25
62 #define UWB_CE_SLEEP 26
63 #define UWB_CE_START_BEACON 27
64 #define UWB_CE_STOP_BEACON 28
65 #define UWB_CE_BP_MERGE 29
66 #define UWB_CE_SEND_COMMAND_FRAME 30
67 #define UWB_CE_SET_ASIE_NOTIFICATION 31
68
69 /* Notifications */
70 #define UWB_NOTIF_IE_RECEIVED 0
71 #define UWB_NOTIF_BEACON_RECEIVED 1
72 #define UWB_NOTIF_BEACON_SIZE_CHANGE 2
73 #define UWB_NOTIF_BPOIE_CHANGE 3
74 #define UWB_NOTIF_BP_SLOT_CHANGE 4
75 #define UWB_NOTIF_BP_SWITCH_IE_RECEIVED 5
76 #define UWB_NOTIF_DEV_ADDR_CONFLICT 6
77 #define UWB_NOTIF_DRP_AVAILABILITY_CHANGE 7
78 #define UWB_NOTIF_DRP 8
79 #define UWB_NOTIF_BP_SWITCH_STATUS 9
80 #define UWB_NOTIF_CMD_FRAME_RCV 10
81 #define UWB_NOTIF_CHANNEL_CHANGE_IE_RCV 11
82 #define UWB_NOTIF_RESERVED 12
83
84 /*
85 * Scan types.
86 * WUSB spec 1.0 [Table 8-78. Scan RCCB]
87 * WHCI 0.95 [Table 3-14. Scan RCCB Format]
88 */
89 #define UWB_RC_SCAN_ONLY 0
90 #define UWB_RC_SCAN_OUTSIDE_BP 1
91 #define UWB_RC_SCAN_WHILE_INACTIVE 2
92 #define UWB_RC_SCAN_DISABLED 3
93 #define UWB_RC_SCAN_ONLY_STARTTIME 4
94
95 /*
96 * See ECMA-368 [7.2.2 Device address]
97 * Individual MAC sublayers are addressed via an EUI-48 [I3]
98 * DevAddrs are 16-bit values
99 */
100 typedef struct uwb_mac_addr {
101 uint8_t addr[6];
102 } uwb_mac_addr_t;
103
104 typedef struct uwb_dev_addr {
105 uint8_t addr[2];
106 } uwb_dev_addr_t;
107
108 /*
109 * See ECMA-368 [16.8.6]
110 * One superframe has 256 Medium Access Slots.
111 * One superframe has 16 zones.
112 */
113 #define UWB_MAS_NUM 256
114 #define UWB_ZONE_NUM 16
115
116 /* Type of DRP reservation. ECMA-368 [table 106] */
117 #define UWB_DRP_TP_ALIEN 0
118 #define UWB_DRP_TP_HARD 1
119 #define UWB_DRP_TP_SOFT 2
120 #define UWB_DRP_TP_PRVT 3
121 #define UWB_DRP_TP_PCA 4
122 #define UWB_DRP_TP_RESVD 5
123
124 /* DRP Reasons. ECMA-368 [table 107] */
125 #define UWB_DRP_RS_ACCEP 0
126 #define UWB_DRP_RS_CNFLCT 1
127 #define UWB_DRP_RS_PNDNG 2
128 #define UWB_DRP_RS_DENI 3
129 #define UWB_DRP_RS_MODIF 4
130 #define UWB_DRP_RS_RSEVD 5
131
132 /* Allocation of MAS slots in a DRP request. ECMA-368 */
133 typedef struct uwb_drp_bm_alloc {
134 uint16_t zone;
135 uint16_t mas;
136 } uwb_drp_bm_alloc_t;
137
138 /* Information elements. ECMA-368 [Table 104] */
139 #define UWB_IE_TIM 0
140 #define UWB_IE_BPO 1
141 #define UWB_IE_PCA_AVAIL 2
142 #define UWB_IE_DRP_AVAIL 8
143 #define UWB_IE_DRP 9
144 #define UWB_IE_HIB_MODE 10
145 #define UWB_IE_BP_SWITCH 11
146 #define UWB_IE_MAC_CAP 12
147 #define UWB_IE_PHY_CAP 13
148 #define UWB_IE_PROBE 14
149 #define UWB_IE_APPSPEC_PROBE 15
150 #define UWB_IE_LINK_FB 16
151 #define UWB_IE_HIB_ANCHOR 17
152 #define UWB_IE_CHNL_CHG 18
153 #define UWB_IE_IDENT 19
154 #define UWB_IE_MASTER_KEY_ID 20
155 #define UWB_IE_RELQ_REQ 21
156 #define UWB_IE_MAB 22
157 #define UWB_IE_APP_SPEC 255
158
159 /* UWB Information Element header. ECMA-368 [16.8] */
160 typedef struct uwb_ie_head {
161 uint8_t id; /* Element ID */
162 uint8_t len; /* Length */
163 } uwb_ie_head_t;
164
165 /* Dynamic Reservation Protocol IE. ECMA-368 [16.8.6] */
166 typedef struct uwb_drp_ie {
167 uwb_ie_head_t head;
168 uint16_t drp_ctrl;
169 uwb_dev_addr_t dev_addr;
170 uwb_drp_bm_alloc_t allocs[1];
171 } uwb_drp_ie_t;
172
173 /* Dynamic Reservation Protocol IE. ECMA-368 [16.8.7] */
174 typedef struct uwb_drp_avail_ie {
175 uwb_ie_head_t head;
176 ulong_t bitmap[8];
177 } uwb_drp_avail_ie_t;
178
179
180 /* Data structures for UWB commands */
181
182 /* WUSB spec 1.0 [Table 8-65] Radio Control Command Block (RCCB) */
183 typedef struct uwb_rccb_head {
184 uint8_t bCommandType; /* Command Type */
185 uint16_t wCommand; /* Command code */
186 uint8_t bCommandContext; /* Context ID */
187 } uwb_rccb_head_t;
188
189 /* Generic RCCB Command */
190 typedef struct uwb_rccb_cmd {
191 uwb_rccb_head_t rccb;
192 uint8_t buf[1];
193 } uwb_rccb_cmd_t;
194
195 /* WUSB spec 1.0. Table 8-78. Scan RCCB */
196 typedef struct uwb_rccb_scan {
197 uwb_rccb_head_t rccb;
198 uint8_t bChannelNumber;
199 uint8_t bScanState;
200 uint16_t wStartTime;
201 } uwb_rccb_scan_t;
202
203 /* WUSB spec 1.0 Table 8-93. Start Beaconing RCCB */
204 typedef struct uwb_rccb_start_beacon {
205 uwb_rccb_head_t rccb;
206 uint16_t wBPSTOffset;
207 uint8_t bChannelNumber;
208 } uwb_rccb_start_beacon_t;
209
210 /* WUSB spec 1.0 Table 8-82. Set DRP IE RCCB */
211 typedef struct uwb_rccb_set_drp_ie {
212 uwb_rccb_head_t rccb;
213 uint16_t wIELength;
214 uint8_t IEData[1];
215 } uwb_rccb_set_drp_ie_t;
216
217 /* WUSB spec 1.0 Table 8-84. Set IE RCCB */
218 typedef struct uwb_rccb_set_ie {
219 uwb_rccb_head_t rccb;
220 uint16_t wIELength;
221 uint8_t IEData[1];
222 }uwb_rccb_set_ie_t;
223
224 /* WUSB spec 1.0 Table 8-72. Device Address Management RCCB */
225 typedef struct uwb_rccb_dev_addr_mgmt {
226 uwb_rccb_head_t rccb;
227 uint8_t bmOperationType;
228 uint8_t baAddr[6];
229 } uwb_rccb_dev_addr_mgmt_t;
230
231 /* Data structures for UWB Command results (Events) */
232
233 /* WUSB spec 1.0 Table 8-66. Radio Control Event Block (RCEB) */
234 typedef struct uwb_rceb_head {
235 uint8_t bEventType;
236 uint16_t wEvent;
237 uint8_t bEventContext;
238 } uwb_rceb_head_t;
239
240 /*
241 * Generic RCEB for commands that returns result code only.
242 * Including channel change, scan, reset, etc.
243 */
244 typedef struct uwb_rceb_result_code {
245 uwb_rceb_head_t rceb;
246 uint8_t bResultCode;
247 } uwb_rceb_result_code_t;
248
249 /*
250 * WUSB 1.0 Table 8-73. Device Address Management RCEB
251 * baAddr should be ignored if the Set bit in the associated
252 * RCCB is set to 1. The spec is fixed in Errata.
253 */
254 typedef struct uwb_rceb_dev_addr_mgmt {
255 uwb_rceb_head_t rceb;
256 uint8_t baAddr[6];
257 uint8_t bResultCode;
258 } uwb_rceb_dev_addr_mgmt_t;
259
260 /* WUSB 1.0 Table 8-75. Get IE RCEB */
261 typedef struct uwb_rceb_get_ie {
262 uwb_rceb_head_t rceb;
263 uint16_t wIELength;
264 uint8_t IEData[1];
265 } uwb_rceb_get_ie_t;
266
267 /* WUSB 1.0 Table 8-86. Set IE RCEB */
268 typedef struct uwb_rceb_set_ie {
269 uwb_rceb_head_t rceb;
270 uint16_t RemainingSpace;
271 uint8_t bResultCode;
272 } uwb_rceb_set_ie_t;
273
274 /* WUSB 1.0 Table 8-83. Set DRP IE RCEB */
275 typedef struct uwb_rceb_set_drp_ie {
276 uwb_rceb_head_t rceb;
277 uint16_t wRemainingSpace;
278 uint8_t bResultCode;
279 } uwb_rceb_set_drp_ie_t;
280
281
282 /* Data structures for UWB Notifications */
283
284 /* Notification from device */
285 typedef struct uwb_rceb_notif {
286 uwb_rceb_head_t rceb;
287 uint8_t buf[1];
288 } uwb_rceb_notif_t;
289
290 typedef struct uwb_notif_get {
291 /* wait for milliseconds untile get a notification */
292 uint_t timeout;
293 uwb_rceb_notif_t notif;
294 } uwb_notif_get_t;
295
296 /*
297 * UWB_NOTIF_BEACON_RECEIVED, Beacon received notification
298 * WHCI [3.1.4.2].
299 * NOTICE:In WUSB Spec, Table 8-98. No bBeaconType. Below follow
300 * WHCI spec
301 */
302 typedef struct uwb_rceb_beacon {
303 uwb_rceb_head_t rceb;
304 uint8_t bChannelNumber;
305 uint8_t bBeaconType;
306 uint16_t wBPSTOffset;
307 uint8_t bLQI;
308 uint8_t bRSSI;
309 uint16_t wBeaconInfoLength;
310 uint8_t BeaconInfo[1];
311 } uwb_rceb_beacon_t;
312
313 /* MAC Header field values for beacon frames. ECMA 368 [table 96] */
314 typedef struct uwb_bcfrm_mac_hdr {
315 uint16_t Frame_Control;
316 uwb_dev_addr_t DestAddr;
317 uwb_dev_addr_t SrcAddr;
318 uint16_t Sequence_Control;
319 uint16_t Access_Information;
320 } uwb_bcfrm_mac_hdr_t;
321
322 /* Beacon Frame [ECMA-368] page 151 */
323 typedef struct uwb_beacon_frame {
324 uwb_bcfrm_mac_hdr_t hdr;
325 uwb_mac_addr_t Device_Identifier;
326 uint8_t Beacon_Slot_Number;
327 uint8_t Device_Control;
328 uint8_t IEData[1];
329 } uwb_beacon_frame_t;
330
331 /* WUSB 1.0. Table 8-99. Beacon Size Change Notification RCEB */
332 typedef struct uwb_rceb_beacon_size_change {
333 uwb_rceb_head_t rceb;
334 uint16_t wNewBeaconSize;
335 } uwb_rceb_beacon_size_change_t;
336
337 /* WUSB 1.0. Table 8-100. BPOIE Change Notification RCEB */
338 typedef struct uwb_rceb_bpoie_change {
339 uwb_rceb_head_t rceb;
340 uint16_t wBPOIELength;
341 uint8_t BPOIE[1];
342 } uwb_rceb_bpoie_change_t;
343
344 /* WHCI 0.95 Table 3-42. BP Slot Change Notification RCEB Format */
345 typedef struct uwb_rceb_bp_slot_change {
346 uwb_rceb_head_t rceb;
347 uint8_t bNewSlotNumber;
348 } uwb_rceb_bp_slot_change_t;
349
350 /* WHCI 0.95 Table 3-45. DRP Availability Changed Notification RCEB Format */
351 typedef struct uwb_rceb_drp_availability {
352 uwb_rceb_head_t rceb;
353 uint8_t DRPAvailability[32]; /* 256 bit bitmap */
354 } uwb_rceb_drp_availability_t;
355
356 /* WHCI 0.95 [3.1.4.9] * Table 3-46. DRP Notification RCEB Format */
357 typedef struct uwb_rceb_drp {
358 uwb_rceb_head_t rceb;
359 uint16_t wSrcAddr;
360 uint8_t bReason;
361 uint8_t bBeaconSlotNumber;
362 uint16_t wIELength;
363 uint8_t IEData[1];
364 } uwb_rceb_drp_t;
365
366
367 #ifdef __cplusplus
368 }
369 #endif
370
371 #endif /* _SYS_UWB_UWB_H */