xref: /onnv-gate/usr/src/uts/common/sys/uwb/uwb.h (revision 9430:637732b28916)
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 */
372