xref: /onnv-gate/usr/src/uts/common/sys/uwb/uwba/uwba.h (revision 9430:637732b28916)
1*9430SRaymond.Chen@Sun.COM /*
2*9430SRaymond.Chen@Sun.COM  * CDDL HEADER START
3*9430SRaymond.Chen@Sun.COM  *
4*9430SRaymond.Chen@Sun.COM  * The contents of this file are subject to the terms of the
5*9430SRaymond.Chen@Sun.COM  * Common Development and Distribution License (the "License").
6*9430SRaymond.Chen@Sun.COM  * You may not use this file except in compliance with the License.
7*9430SRaymond.Chen@Sun.COM  *
8*9430SRaymond.Chen@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9430SRaymond.Chen@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*9430SRaymond.Chen@Sun.COM  * See the License for the specific language governing permissions
11*9430SRaymond.Chen@Sun.COM  * and limitations under the License.
12*9430SRaymond.Chen@Sun.COM  *
13*9430SRaymond.Chen@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*9430SRaymond.Chen@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9430SRaymond.Chen@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*9430SRaymond.Chen@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*9430SRaymond.Chen@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9430SRaymond.Chen@Sun.COM  *
19*9430SRaymond.Chen@Sun.COM  * CDDL HEADER END
20*9430SRaymond.Chen@Sun.COM  */
21*9430SRaymond.Chen@Sun.COM /*
22*9430SRaymond.Chen@Sun.COM  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23*9430SRaymond.Chen@Sun.COM  * Use is subject to license terms.
24*9430SRaymond.Chen@Sun.COM  */
25*9430SRaymond.Chen@Sun.COM 
26*9430SRaymond.Chen@Sun.COM #ifndef _SYS_UWB_UWBA_H
27*9430SRaymond.Chen@Sun.COM #define	_SYS_UWB_UWBA_H
28*9430SRaymond.Chen@Sun.COM 
29*9430SRaymond.Chen@Sun.COM #ifdef	__cplusplus
30*9430SRaymond.Chen@Sun.COM extern "C" {
31*9430SRaymond.Chen@Sun.COM #endif
32*9430SRaymond.Chen@Sun.COM 
33*9430SRaymond.Chen@Sun.COM 
34*9430SRaymond.Chen@Sun.COM /*
35*9430SRaymond.Chen@Sun.COM  * UWBA private header file.
36*9430SRaymond.Chen@Sun.COM  */
37*9430SRaymond.Chen@Sun.COM 
38*9430SRaymond.Chen@Sun.COM #include <sys/note.h>
39*9430SRaymond.Chen@Sun.COM #include <sys/sunddi.h>
40*9430SRaymond.Chen@Sun.COM #include <sys/types.h>
41*9430SRaymond.Chen@Sun.COM #include <sys/list.h>
42*9430SRaymond.Chen@Sun.COM #include <sys/bitset.h>
43*9430SRaymond.Chen@Sun.COM #include <sys/bitmap.h>
44*9430SRaymond.Chen@Sun.COM 
45*9430SRaymond.Chen@Sun.COM #include <sys/uwb/uwb.h>
46*9430SRaymond.Chen@Sun.COM #include <sys/uwb/uwbai.h>
47*9430SRaymond.Chen@Sun.COM 
48*9430SRaymond.Chen@Sun.COM /* For logging. */
49*9430SRaymond.Chen@Sun.COM #define	UWBA_LOG_DEBUG		2
50*9430SRaymond.Chen@Sun.COM #define	UWBA_LOG_LOG		1
51*9430SRaymond.Chen@Sun.COM #define	UWBA_LOG_CONSOLE	0
52*9430SRaymond.Chen@Sun.COM 
53*9430SRaymond.Chen@Sun.COM #define	offsetof(s, m)	((size_t)(&(((s *)0)->m)))
54*9430SRaymond.Chen@Sun.COM #define	isdigit(ch) ((ch >= '0') && (ch <= '9'))
55*9430SRaymond.Chen@Sun.COM 
56*9430SRaymond.Chen@Sun.COM #define	UWB_RAW_RESULT_CODE_SIZE	5  /* size of RCEB + bResultCode */
57*9430SRaymond.Chen@Sun.COM #define	UWB_RAW_RCCB_HEAD_SIZE		4  /* size of RCCB */
58*9430SRaymond.Chen@Sun.COM 
59*9430SRaymond.Chen@Sun.COM #define	UWB_RAW_BEVENTTYPE_OFFSET	0  /* offset of bEventType */
60*9430SRaymond.Chen@Sun.COM #define	UWB_RAW_WEVENT_OFFSET		1  /* offset of wEvent */
61*9430SRaymond.Chen@Sun.COM #define	UWB_RAW_BEVENTCONTEXT_OFFSET	3  /* offset of bEventContext */
62*9430SRaymond.Chen@Sun.COM #define	UWB_RAW_BRESULTCODE_OFFSET	4  /* offset of bResultCode */
63*9430SRaymond.Chen@Sun.COM 
64*9430SRaymond.Chen@Sun.COM 
65*9430SRaymond.Chen@Sun.COM 
66*9430SRaymond.Chen@Sun.COM #define	UWB_CTXT_ID_TOP		0xfe	/* top context id */
67*9430SRaymond.Chen@Sun.COM #define	UWB_CTXT_ID_BOTTOM	0x1	/* bottom context id */
68*9430SRaymond.Chen@Sun.COM #define	UWB_CTXT_ID_NOTIF	0x0	/* notification context id */
69*9430SRaymond.Chen@Sun.COM #define	UWB_CTXT_ID_UNVALID	0xff	/* invalid context id */
70*9430SRaymond.Chen@Sun.COM 
71*9430SRaymond.Chen@Sun.COM 
72*9430SRaymond.Chen@Sun.COM #define	UWB_INVALID_EVT_CODE 0x7ffe	/* invalid evt/notif code */
73*9430SRaymond.Chen@Sun.COM #define	UWB_INVALID_EVT_SIZE 0x7fff	/* invalid evt length */
74*9430SRaymond.Chen@Sun.COM 
75*9430SRaymond.Chen@Sun.COM #define	UWB_MAX_NOTIF_NUMBER 10		/* Max notifications in a notif_list */
76*9430SRaymond.Chen@Sun.COM 
77*9430SRaymond.Chen@Sun.COM #define	UWB_MAX_CDEV_NUMBER 32		/* Max client radio device */
78*9430SRaymond.Chen@Sun.COM 
79*9430SRaymond.Chen@Sun.COM /*
80*9430SRaymond.Chen@Sun.COM  * Offset of data rates Bits in PHY Capability Bitmap.
81*9430SRaymond.Chen@Sun.COM  * [ECMA, 16.8.16, table 112]
82*9430SRaymond.Chen@Sun.COM  */
83*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_BASE 16
84*9430SRaymond.Chen@Sun.COM /* the offset of data rate 53.3Mbps in PHY capability bitmap */
85*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_53 UWB_RATE_OFFSET_BASE
86*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_80 (UWB_RATE_OFFSET_BASE + 1) /* 80Mbps */
87*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_106 (UWB_RATE_OFFSET_BASE + 2)
88*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_160 (UWB_RATE_OFFSET_BASE + 3)
89*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_200 (UWB_RATE_OFFSET_BASE + 4)
90*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_320 (UWB_RATE_OFFSET_BASE + 5)
91*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_400 (UWB_RATE_OFFSET_BASE + 6)
92*9430SRaymond.Chen@Sun.COM #define	UWB_RATE_OFFSET_480 (UWB_RATE_OFFSET_BASE + 7)
93*9430SRaymond.Chen@Sun.COM 
94*9430SRaymond.Chen@Sun.COM typedef int  (*uwb_rccb_handler_t)(uwb_dev_handle_t, uwb_rccb_cmd_t *);
95*9430SRaymond.Chen@Sun.COM #define	UWB_RCCB_NULL_HANDLER ((uwb_rccb_handler_t)0)
96*9430SRaymond.Chen@Sun.COM 
97*9430SRaymond.Chen@Sun.COM #define	UWB_STATE_IDLE		0
98*9430SRaymond.Chen@Sun.COM #define	UWB_STATE_BEACON	1
99*9430SRaymond.Chen@Sun.COM #define	UWB_STATE_SCAN		2
100*9430SRaymond.Chen@Sun.COM 
101*9430SRaymond.Chen@Sun.COM /* radio client device */
102*9430SRaymond.Chen@Sun.COM typedef struct uwba_client_dev {
103*9430SRaymond.Chen@Sun.COM 	uint8_t			bChannelNumber;
104*9430SRaymond.Chen@Sun.COM 	uint8_t			bBeaconType;
105*9430SRaymond.Chen@Sun.COM 	uint16_t		wBPSTOffset;
106*9430SRaymond.Chen@Sun.COM 	uwb_beacon_frame_t	beacon_frame;
107*9430SRaymond.Chen@Sun.COM 	list_node_t		dev_node;
108*9430SRaymond.Chen@Sun.COM } uwba_client_dev_t;
109*9430SRaymond.Chen@Sun.COM 
110*9430SRaymond.Chen@Sun.COM /* Command result from the radio controller */
111*9430SRaymond.Chen@Sun.COM typedef struct uwb_cmd_result {
112*9430SRaymond.Chen@Sun.COM 	uwb_rceb_head_t rceb;
113*9430SRaymond.Chen@Sun.COM 
114*9430SRaymond.Chen@Sun.COM 	/* Cmd result data from device when cmd is finished. */
115*9430SRaymond.Chen@Sun.COM 	uint8_t		buf[1];
116*9430SRaymond.Chen@Sun.COM } uwb_cmd_result_t;
117*9430SRaymond.Chen@Sun.COM 
118*9430SRaymond.Chen@Sun.COM 
119*9430SRaymond.Chen@Sun.COM typedef struct uwb_cmd_result_wrapper {
120*9430SRaymond.Chen@Sun.COM 	/* Length of a uwb cmd_result */
121*9430SRaymond.Chen@Sun.COM 	int			length;
122*9430SRaymond.Chen@Sun.COM 
123*9430SRaymond.Chen@Sun.COM 	uwb_cmd_result_t	*cmd_result;
124*9430SRaymond.Chen@Sun.COM } uwb_cmd_result_wrapper_t;
125*9430SRaymond.Chen@Sun.COM 
126*9430SRaymond.Chen@Sun.COM typedef struct uwb_notif_wrapper {
127*9430SRaymond.Chen@Sun.COM 	/* Length of uwb notifcation */
128*9430SRaymond.Chen@Sun.COM 	int		length;
129*9430SRaymond.Chen@Sun.COM 	uwb_rceb_notif_t	*notif;
130*9430SRaymond.Chen@Sun.COM 
131*9430SRaymond.Chen@Sun.COM 	list_node_t	notif_node;
132*9430SRaymond.Chen@Sun.COM } uwb_notif_wrapper_t;
133*9430SRaymond.Chen@Sun.COM 
134*9430SRaymond.Chen@Sun.COM 
135*9430SRaymond.Chen@Sun.COM 
136*9430SRaymond.Chen@Sun.COM typedef struct uwba_dev {
137*9430SRaymond.Chen@Sun.COM 	/* dip of the uwb radio controller device */
138*9430SRaymond.Chen@Sun.COM 	dev_info_t	*dip;
139*9430SRaymond.Chen@Sun.COM 
140*9430SRaymond.Chen@Sun.COM 	/* Dev and instance */
141*9430SRaymond.Chen@Sun.COM 	char		*devinst;
142*9430SRaymond.Chen@Sun.COM 
143*9430SRaymond.Chen@Sun.COM 	kmutex_t	dev_mutex;
144*9430SRaymond.Chen@Sun.COM 
145*9430SRaymond.Chen@Sun.COM 	/* send cmd to the device */
146*9430SRaymond.Chen@Sun.COM 	int	(*send_cmd)(uwb_dev_handle_t, mblk_t *, uint16_t);
147*9430SRaymond.Chen@Sun.COM 
148*9430SRaymond.Chen@Sun.COM 	/* current command block */
149*9430SRaymond.Chen@Sun.COM 	uwb_rccb_cmd_t	curr_rccb;
150*9430SRaymond.Chen@Sun.COM 
151*9430SRaymond.Chen@Sun.COM 	/* wait for cmd complete and the cmd result available */
152*9430SRaymond.Chen@Sun.COM 	kcondvar_t	cmd_result_cv;
153*9430SRaymond.Chen@Sun.COM 	kcondvar_t	cmd_handler_cv;
154*9430SRaymond.Chen@Sun.COM 
155*9430SRaymond.Chen@Sun.COM 	/* filled by uwb_fill_cmd_result in rc driver's cmd call back */
156*9430SRaymond.Chen@Sun.COM 	uwb_cmd_result_wrapper_t cmd_result_wrap;
157*9430SRaymond.Chen@Sun.COM 
158*9430SRaymond.Chen@Sun.COM 	/*
159*9430SRaymond.Chen@Sun.COM 	 * set to TRUE when start to do cmd ioctl;
160*9430SRaymond.Chen@Sun.COM 	 * set to FALSE when put_cmd and exit cmd ioctl
161*9430SRaymond.Chen@Sun.COM 	 */
162*9430SRaymond.Chen@Sun.COM 	boolean_t	cmd_busy;
163*9430SRaymond.Chen@Sun.COM 
164*9430SRaymond.Chen@Sun.COM 	/* Device state */
165*9430SRaymond.Chen@Sun.COM 	uint8_t		dev_state;
166*9430SRaymond.Chen@Sun.COM 
167*9430SRaymond.Chen@Sun.COM 	/* Beacon or scan channel */
168*9430SRaymond.Chen@Sun.COM 	uint8_t		channel;
169*9430SRaymond.Chen@Sun.COM 
170*9430SRaymond.Chen@Sun.COM 	/* Device address */
171*9430SRaymond.Chen@Sun.COM 	uint16_t	dev_addr;
172*9430SRaymond.Chen@Sun.COM 
173*9430SRaymond.Chen@Sun.COM 	/* notifications from radio controller device */
174*9430SRaymond.Chen@Sun.COM 	list_t		notif_list;
175*9430SRaymond.Chen@Sun.COM 
176*9430SRaymond.Chen@Sun.COM 	/* the current number of notifications in the notif_list */
177*9430SRaymond.Chen@Sun.COM 	int		notif_cnt;
178*9430SRaymond.Chen@Sun.COM 
179*9430SRaymond.Chen@Sun.COM 	/* client radio devices found through beacons by this radio host */
180*9430SRaymond.Chen@Sun.COM 	list_t		client_dev_list;
181*9430SRaymond.Chen@Sun.COM 
182*9430SRaymond.Chen@Sun.COM 	/* the current number of devices in dev_list */
183*9430SRaymond.Chen@Sun.COM 	int		client_dev_cnt;
184*9430SRaymond.Chen@Sun.COM 
185*9430SRaymond.Chen@Sun.COM 	/* context id is maintained by uwba */
186*9430SRaymond.Chen@Sun.COM 	uint8_t		ctxt_id;	/* current command context id */
187*9430SRaymond.Chen@Sun.COM 	bitset_t	ctxt_bits;	/* command context bit map */
188*9430SRaymond.Chen@Sun.COM 
189*9430SRaymond.Chen@Sun.COM 	/* PHY capability bitmap, saved from PHY capability IE */
190*9430SRaymond.Chen@Sun.COM 	ulong_t		phy_cap_bm;
191*9430SRaymond.Chen@Sun.COM 
192*9430SRaymond.Chen@Sun.COM 	/* list node of a uwb radio host device */
193*9430SRaymond.Chen@Sun.COM 	list_node_t	uwba_dev_node;
194*9430SRaymond.Chen@Sun.COM } uwba_dev_t;
195*9430SRaymond.Chen@Sun.COM 
196*9430SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(uwba_dev_t::dev_mutex, uwba_dev_t))
197*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(uwba_dev_t::{
198*9430SRaymond.Chen@Sun.COM 	dip
199*9430SRaymond.Chen@Sun.COM 	devinst
200*9430SRaymond.Chen@Sun.COM 	send_cmd
201*9430SRaymond.Chen@Sun.COM 	phy_cap_bm
202*9430SRaymond.Chen@Sun.COM 	notif_cnt
203*9430SRaymond.Chen@Sun.COM 	dev_state
204*9430SRaymond.Chen@Sun.COM 	dip
205*9430SRaymond.Chen@Sun.COM 	ctxt_id
206*9430SRaymond.Chen@Sun.COM 	ctxt_bits
207*9430SRaymond.Chen@Sun.COM 	notif_list
208*9430SRaymond.Chen@Sun.COM 	cmd_result_wrap
209*9430SRaymond.Chen@Sun.COM 	client_dev_cnt
210*9430SRaymond.Chen@Sun.COM 	channel
211*9430SRaymond.Chen@Sun.COM 	dev_addr
212*9430SRaymond.Chen@Sun.COM }))
213*9430SRaymond.Chen@Sun.COM 
214*9430SRaymond.Chen@Sun.COM 
215*9430SRaymond.Chen@Sun.COM typedef struct uwba_evt_size {
216*9430SRaymond.Chen@Sun.COM 	/* length of a evt/notif structure, impact by alignment */
217*9430SRaymond.Chen@Sun.COM 	uint8_t	struct_len;
218*9430SRaymond.Chen@Sun.COM 
219*9430SRaymond.Chen@Sun.COM 	/*
220*9430SRaymond.Chen@Sun.COM 	 * offset of the length member of an event/notif struct.
221*9430SRaymond.Chen@Sun.COM 	 * if zero, means there is no variable buf length member
222*9430SRaymond.Chen@Sun.COM 	 * in this struct
223*9430SRaymond.Chen@Sun.COM 	 */
224*9430SRaymond.Chen@Sun.COM 	uint16_t	buf_len_offset;
225*9430SRaymond.Chen@Sun.COM } uwba_evt_size_t;
226*9430SRaymond.Chen@Sun.COM typedef struct uwba_channel_range {
227*9430SRaymond.Chen@Sun.COM 	/* First channel in the specific bandgroup */
228*9430SRaymond.Chen@Sun.COM 	uint8_t base;
229*9430SRaymond.Chen@Sun.COM 
230*9430SRaymond.Chen@Sun.COM 	/* Length since this first channel in the bandgroup */
231*9430SRaymond.Chen@Sun.COM 	uint8_t offset;
232*9430SRaymond.Chen@Sun.COM }  uwba_channel_range_t;
233*9430SRaymond.Chen@Sun.COM 
234*9430SRaymond.Chen@Sun.COM #define	UWB_RESULT_CODE_SIZE	(sizeof (uwb_rceb_result_code_t))
235*9430SRaymond.Chen@Sun.COM 
236*9430SRaymond.Chen@Sun.COM /* str_t is the struct type of the notif/evt */
237*9430SRaymond.Chen@Sun.COM #define	UWB_EVT_RCEB_SZ		(sizeof (uwb_rceb_t))
238*9430SRaymond.Chen@Sun.COM 
239*9430SRaymond.Chen@Sun.COM /* the size after excluded the rceb head */
240*9430SRaymond.Chen@Sun.COM #define	UWB_EVT_END_SZ(stru_t)	(sizeof (stru_t) - sizeof (uwb_rceb_t))
241*9430SRaymond.Chen@Sun.COM 
242*9430SRaymond.Chen@Sun.COM #define	UWB_EVT_NO_BUF_LEN_OFFSET	0
243*9430SRaymond.Chen@Sun.COM 
244*9430SRaymond.Chen@Sun.COM /* Offset of wBeaconInfoLength in uwb_rceb_beacon_t */
245*9430SRaymond.Chen@Sun.COM #define	UWB_BEACONINFOLEN_OFFSET 10
246*9430SRaymond.Chen@Sun.COM 
247*9430SRaymond.Chen@Sun.COM /* Offset of BeaconInfo from bChannelNumber in uwb_rceb_beacon_t */
248*9430SRaymond.Chen@Sun.COM #define	UWB_BEACONINFO_OFFSET 8
249*9430SRaymond.Chen@Sun.COM 
250*9430SRaymond.Chen@Sun.COM /*
251*9430SRaymond.Chen@Sun.COM  * UWB radio controller device list
252*9430SRaymond.Chen@Sun.COM  */
253*9430SRaymond.Chen@Sun.COM void	uwba_dev_add_to_list(uwba_dev_t *);
254*9430SRaymond.Chen@Sun.COM void	uwba_dev_rm_from_list(uwba_dev_t *);
255*9430SRaymond.Chen@Sun.COM void	uwba_alloc_uwb_dev(dev_info_t *, uwba_dev_t **, uint_t);
256*9430SRaymond.Chen@Sun.COM void	uwba_free_uwb_dev(uwba_dev_t *);
257*9430SRaymond.Chen@Sun.COM uwb_dev_handle_t uwba_dev_search(dev_info_t *);
258*9430SRaymond.Chen@Sun.COM 
259*9430SRaymond.Chen@Sun.COM /*
260*9430SRaymond.Chen@Sun.COM  * Context ID operations
261*9430SRaymond.Chen@Sun.COM  */
262*9430SRaymond.Chen@Sun.COM void	uwba_init_ctxt_id(uwba_dev_t *);
263*9430SRaymond.Chen@Sun.COM void	uwba_fini_ctxt_id(uwba_dev_t *);
264*9430SRaymond.Chen@Sun.COM uint8_t	uwba_get_ctxt_id(uwba_dev_t *);
265*9430SRaymond.Chen@Sun.COM void	uwba_free_ctxt_id(uwba_dev_t *, uint8_t);
266*9430SRaymond.Chen@Sun.COM 
267*9430SRaymond.Chen@Sun.COM void		uwba_fill_rccb_head(uwba_dev_t *, uint16_t, mblk_t *);
268*9430SRaymond.Chen@Sun.COM uint16_t	uwba_get_evt_code(uint8_t *, int);
269*9430SRaymond.Chen@Sun.COM uint16_t	uwba_get_evt_size(uint8_t *, int, uint16_t);
270*9430SRaymond.Chen@Sun.COM 
271*9430SRaymond.Chen@Sun.COM void	uwba_put_cmd_result(uwba_dev_t *, void *, uint16_t);
272*9430SRaymond.Chen@Sun.COM int	uwba_add_notif_to_list(uwba_dev_t *, void *, uint16_t);
273*9430SRaymond.Chen@Sun.COM 
274*9430SRaymond.Chen@Sun.COM /*
275*9430SRaymond.Chen@Sun.COM  * Parse events/notifications from radio controller device
276*9430SRaymond.Chen@Sun.COM  */
277*9430SRaymond.Chen@Sun.COM int	uwba_parse_data(char *,	uchar_t *, size_t, void *, size_t);
278*9430SRaymond.Chen@Sun.COM int	uwba_parse_rceb(uint8_t *, size_t,	void *, size_t);
279*9430SRaymond.Chen@Sun.COM int	uwba_parse_dev_addr_mgmt(uint8_t *, int, uwb_rceb_dev_addr_mgmt_t *);
280*9430SRaymond.Chen@Sun.COM int	uwba_parse_get_ie(uwb_dev_handle_t, uint8_t *,
281*9430SRaymond.Chen@Sun.COM 	int, uwb_rceb_get_ie_t *);
282*9430SRaymond.Chen@Sun.COM int	uwba_parse_beacon_rcv(uwb_dev_handle_t, uint8_t *,
283*9430SRaymond.Chen@Sun.COM 	int, uwb_rceb_beacon_t *);
284*9430SRaymond.Chen@Sun.COM int	uwba_parse_bpoie_chg(uwb_dev_handle_t, uint8_t *,
285*9430SRaymond.Chen@Sun.COM 	int, uwb_rceb_bpoie_change_t *);
286*9430SRaymond.Chen@Sun.COM uint8_t uwba_allocate_channel(uwb_dev_handle_t);
287*9430SRaymond.Chen@Sun.COM uint8_t *uwba_find_ie(uwb_dev_handle_t, uint_t, uint8_t *, uint16_t);
288*9430SRaymond.Chen@Sun.COM 
289*9430SRaymond.Chen@Sun.COM void uwba_copy_rccb(uwb_rccb_cmd_t *, uwb_rccb_cmd_t *);
290*9430SRaymond.Chen@Sun.COM 
291*9430SRaymond.Chen@Sun.COM uwba_client_dev_t *uwba_find_cdev_by_channel(uwba_dev_t *, uint8_t);
292*9430SRaymond.Chen@Sun.COM 
293*9430SRaymond.Chen@Sun.COM /* Debug/message log */
294*9430SRaymond.Chen@Sun.COM void	uwba_log(uwba_dev_t *, uint_t, char *, ...);
295*9430SRaymond.Chen@Sun.COM const char *uwba_event_msg(uint16_t);
296*9430SRaymond.Chen@Sun.COM 
297*9430SRaymond.Chen@Sun.COM /* Turn a little endian byte array to a uint32_t */
298*9430SRaymond.Chen@Sun.COM #define	LE_TO_UINT32(src, off, des) \
299*9430SRaymond.Chen@Sun.COM { \
300*9430SRaymond.Chen@Sun.COM 	uint32_t tmp; \
301*9430SRaymond.Chen@Sun.COM 	des = src[off + 3]; \
302*9430SRaymond.Chen@Sun.COM 	des = des << 24; \
303*9430SRaymond.Chen@Sun.COM 	tmp = src[off + 2]; \
304*9430SRaymond.Chen@Sun.COM 	des |= tmp << 16; \
305*9430SRaymond.Chen@Sun.COM 	tmp = src[off + 1]; \
306*9430SRaymond.Chen@Sun.COM 	des |= tmp << 8; \
307*9430SRaymond.Chen@Sun.COM 	des |= src[off]; \
308*9430SRaymond.Chen@Sun.COM }
309*9430SRaymond.Chen@Sun.COM 
310*9430SRaymond.Chen@Sun.COM /* Turn a uint32_t to a little endian byte array */
311*9430SRaymond.Chen@Sun.COM #define	UINT32_TO_LE(src, off, des) \
312*9430SRaymond.Chen@Sun.COM { \
313*9430SRaymond.Chen@Sun.COM 	des[off + 0] = 0xff & src; \
314*9430SRaymond.Chen@Sun.COM 	des[off + 1] = 0xff & (src >> 8); \
315*9430SRaymond.Chen@Sun.COM 	des[off + 2] = 0xff & (src >> 16); \
316*9430SRaymond.Chen@Sun.COM 	des[off + 3] = 0xff & (src >> 24); \
317*9430SRaymond.Chen@Sun.COM }
318*9430SRaymond.Chen@Sun.COM 
319*9430SRaymond.Chen@Sun.COM /* Turn a little endian byte array to a uint16_t */
320*9430SRaymond.Chen@Sun.COM #define	LE_TO_UINT16(src, off, des) \
321*9430SRaymond.Chen@Sun.COM { \
322*9430SRaymond.Chen@Sun.COM 	des = src[off + 1]; \
323*9430SRaymond.Chen@Sun.COM 	des = des << 8; \
324*9430SRaymond.Chen@Sun.COM 	des |= src[off]; \
325*9430SRaymond.Chen@Sun.COM }
326*9430SRaymond.Chen@Sun.COM 
327*9430SRaymond.Chen@Sun.COM /* Turn a uint16_t to alittle endian byte array */
328*9430SRaymond.Chen@Sun.COM #define	UINT16_TO_LE(src, off, des) \
329*9430SRaymond.Chen@Sun.COM { \
330*9430SRaymond.Chen@Sun.COM 	des[off + 0] = 0xff & src; \
331*9430SRaymond.Chen@Sun.COM 	des[off + 1] = 0xff & (src >> 8); \
332*9430SRaymond.Chen@Sun.COM }
333*9430SRaymond.Chen@Sun.COM 
334*9430SRaymond.Chen@Sun.COM 
335*9430SRaymond.Chen@Sun.COM /* Max string length for the driver name and instance number. */
336*9430SRaymond.Chen@Sun.COM #define	UWB_MAXSTRINGLEN 255
337*9430SRaymond.Chen@Sun.COM 
338*9430SRaymond.Chen@Sun.COM 
339*9430SRaymond.Chen@Sun.COM #ifdef __cplusplus
340*9430SRaymond.Chen@Sun.COM }
341*9430SRaymond.Chen@Sun.COM #endif
342*9430SRaymond.Chen@Sun.COM 
343*9430SRaymond.Chen@Sun.COM #endif	/* _SYS_UWB_UWBA_H */
344