summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/usb/usba/wa.h
blob: 83b61b1f9debe64339efeca88ca04e3269d73252 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_USB_WA_H
#define	_SYS_USB_WA_H

#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/usb/usba.h>
#include <sys/usb/usba/usba_types.h>
#include <sys/id32.h>

/* Wire adapter class extension for descriptors */
typedef struct usb_wa_descr {
	uint8_t		bLength;
	uint8_t		bDescriptorType;
	uint16_t	bcdWAVersion;
	uint8_t		bNumPorts;
	uint8_t		bmAttributes;
	uint16_t	wNumRPipes;
	uint16_t	wRPipeMaxBlock;
	uint8_t		bRPipeBlockSize;
	uint8_t		bPwrOn2PwrGood;
	uint8_t		bNumMMCIEs;
	uint8_t		DeviceRemovable;
} usb_wa_descr_t;

typedef struct usb_wa_rpipe_descr {
	uint8_t		bLength;
	uint8_t		bDescriptorType;
	uint16_t	wRPipeIndex;
	uint16_t	wRequests;
	uint16_t	wBlocks;
	uint16_t	wMaxPacketSize;
	union {
		struct {
			uint8_t	bHSHubAddress;
			uint8_t	bHSHubPort;
		} dwa_value;

		struct {
			uint8_t	bMaxBurst;
			uint8_t	bDeviceInfoIndex;
		} hwa_value;
	} wa_value;

	uint8_t		bSpeed;
	uint8_t		bDeviceAddress;
	uint8_t		bEndpointAddress;
	uint8_t		bDataSequence;
	uint32_t	dwCurrentWindow;
	uint8_t		bMaxDataSequence;
	uint8_t		bInterval;
	uint8_t		bOverTheAirInterval;
	uint8_t		bmAttribute;
	uint8_t		bmCharacteristics;
	uint8_t		bmRetryOptions;
	uint16_t	wNumTransactionErrors;
} usb_wa_rpipe_descr_t;

/* Rpipe bmCharacteristics mask and bits */
#define	USB_RPIPE_CHA_MASK		0x0f
#define	USB_RPIPE_CHA_CTRL		0x01
#define	USB_RRIPE_CHA_ISOC		0x02
#define	USB_RRIPE_CHA_BULK		0x04
#define	USB_RPIPE_CHA_INTR		0x08

/*
 * ************************************************************
 * Wire adapter class request related structures and data types
 * ************************************************************
 */

/* Wire adapter class specific requests */
#define	WA_REQ_ABORT_RPIPE		0x0e
#define	WA_REQ_RESET_RPIPE		0x0f

/* HWA specific requests as host controller, T8-50 */
#define	HWA_REQ_ADD_MMC_IE		0x14
#define	HWA_REQ_REMOVE_MMC_IE		0x15
#define	HWA_REQ_SET_NUM_DNTS		0x16
#define	HWA_REQ_SET_CLUSTER_ID		0x17
#define	HWA_REQ_SET_DEVICE_INFO		0x18
#define	HWA_REQ_GET_TIME		0x19
#define	HWA_REQ_SET_STREAM_IDX		0x1a
#define	HWA_REQ_SET_WUSB_MAS		0x1b
#define	HWA_REQ_CH_STOP			0x1c

/* DWA specific requests */
#define	DWA_REQ_SET_EP_ATTRIB		0x1e

/* wLength for wire adapter class requests */
#define	WA_GET_RPIPE_STATUS_LEN		1
#define	WA_GET_WA_STATUS_LEN		4

/* wLength for HWA specific requests */
#define	WUSB_SET_DEV_INFO_LEN		36
#define	WUSB_SET_WUSB_MAS_LEN		32

/* wLength for DWA specific requests */
#define	DWA_GET_STATUS_LEN		4
#define	DWA_ISOC_EP_ATTRIB_LEN		6

/* Wire adapter class feature selector */
#define	WA_DEV_ENABLE			1
#define	WA_DEV_RESET			2
#define	WA_RPIPE_PAUSE			1
#define	WA_RPIPE_STALL			2

/* Rpipe status bits */
#define	WA_RPIPE_IDLE			0x01
#define	WA_PRIPE_PAUSED			0x02
#define	WA_RPIPE_CONFIGURED		0x04
#define	WA_RPIPE_STALLED		0x08

/* Wire adapter status bits */
#define	WA_HC_ENABLED			0x00000001
#define	WA_HC_RESET_IN_PROGRESS		0x00000002

/* HWA specific definitions */
#define	WUSB_CLASS_IF_REQ_IN_TYPE	(USB_DEV_REQ_DEV_TO_HOST \
					|USB_DEV_REQ_TYPE_CLASS \
					|USB_DEV_REQ_RCPT_IF)

#define	WUSB_CLASS_IF_REQ_OUT_TYPE	(USB_DEV_REQ_HOST_TO_DEV \
					|USB_DEV_REQ_TYPE_CLASS \
					|USB_DEV_REQ_RCPT_IF)

#define	WA_CLASS_RPIPE_REQ_IN_TYPE	(USB_DEV_REQ_DEV_TO_HOST \
					|USB_DEV_REQ_TYPE_CLASS \
					|USB_DEV_REQ_RCPT_RPIPE)

#define	WA_CLASS_RPIPE_REQ_OUT_TYPE	(USB_DEV_REQ_HOST_TO_DEV \
					|USB_DEV_REQ_TYPE_CLASS \
					|USB_DEV_REQ_RCPT_RPIPE)

#define	HWA_TIME_ADJ			0
#define	HWA_TIME_BPST			1
#define	HWA_TIME_WUSB			2

typedef struct hwa_dev_info {
	uint8_t		bmDeviceAvailablilityInfo[32];
	uint8_t		bDeviceAddress;
	uint8_t		wPHYRates[2];
	uint8_t		bmDeviceAttribute;
} hwa_dev_info_t;

/* DWA specific definitions */
typedef struct dwa_isoc_ep_attrib {
	uint16_t	wMaxStreamDelay;
	uint16_t	wOverTheAirPacketSize;
	uint16_t	wReserved;
} dwa_isoc_ep_attrib_t;


/*
 * *****************************************************************
 * Wire adapter class notification related structures and data types
 * *****************************************************************
 */

/* Wire adapter class specific notification */
#define	WA_NOTIF_TYPE_TRANSFER		0x93

typedef struct wa_notif_header {
	uint8_t		bLength;
	uint8_t		bNotifyType;
} wa_notif_header_t;

typedef struct wa_notif_transfer {
	uint8_t		bLength;
	uint8_t		bNotifyType;
	uint8_t		bEndpoint;
	uint8_t		bReserved;
} wa_notif_transfer_t;

/* HWA specific notifications */
#define	HWA_NOTIF_TYPE_BPST_ADJ		0x94
#define	HWA_NOTIF_TYPE_DN_RECEIVED	0x95

typedef struct hwa_notif_bpst_adj {
	uint8_t		bLength;
	uint8_t		bNotifyType;
	uint8_t		bAdjustment;
} hwa_notif_bpst_adj_t;

typedef struct hwa_notif_dn_recvd {
	uint8_t		bLength;
	uint8_t		bNotifyType;
	uint8_t		bSourceDeviceAddr;
	uint8_t		bmAttributes;
	uint8_t		notifdata[1];	/* variable length raw data */
} hwa_notif_dn_recvd_t;

/* DWA specific notifications */
#define	DWA_NOTIF_TYPE_RWAKE		0x91
#define	DWA_NOTIF_TYPE_PORTSTATUS	0x92

typedef struct dwa_notif_rwake {
	uint8_t		bLength;
	uint8_t		bNotifyType;
} dwa_notif_rwake;

typedef struct dwa_notif_portstatus {
	uint8_t		bLength;
	uint8_t		bNotifyType;
	uint8_t		bPortIndex;
} dwa_notif_portstatus;


/*
 * *********************************************************************
 * Wire adapter class transfer request related structures and data types
 * *********************************************************************
 */

/* Wire adapter class transfer requests */
#define	WA_XFER_REQ_TYPE_CTRL		0x80
#define	WA_XFER_REQ_TYPE_BULK_INTR	0x81
#define	WA_XFER_REQ_TYPE_ABORT		0x84
/* HWA specific transfer request */
#define	HWA_XFER_REQ_TYPE_ISOC		0x82

/* Wire adapter class transfer request length */
#define	WA_CTRL_REQ_LEN			0x18
#define	WA_BULK_INTR_REQ_LEN		0x10
#define	WA_ABORT_REQ_LEN		0x08
/* HWA specific transfer request length */
#define	HWA_ISOC_REQ_LEN		0x14

typedef struct wa_ctrl_req {
	uint8_t		bLength;
	uint8_t		bRequestType;
	uint16_t	wRPipe;
	uint32_t	dwTransferID;
	uint32_t	dwTransferLength;
	uint8_t		bTransferSegment;
	uint8_t		bmAttribute;
	uint16_t	wReserved;
	uint8_t		baSetupData[8];
} wa_ctrl_req_t;

/* ctrl request bmAttribute */
#define	WA_CTRL_DIR_MASK		0x01
#define	WA_CTRL_DIR_IN			0x01
#define	WA_CTRL_DIR_OUT			0x00

/* ctrl request bmAttribute valid only for HWA */
#define	WA_CTRL_SECRT_MASK		0x02
#define	WA_CTRL_SECRT_REGULAR		0x00
#define	WA_CTRL_SECRT_NONE		0x02

typedef struct wa_bulk_intr_req {
	uint8_t		bLength;
	uint8_t		bRequestType;
	uint16_t	wRPipe;
	uint32_t	dwTransferID;
	uint32_t	dwTransferLength;
	uint8_t		bTransferSegment;
	uint8_t		bReserved;
	uint16_t	wReserved;
} wa_bulk_intr_req_t;

typedef struct wa_abort_req {
	uint8_t		bLength;
	uint8_t		bRequestType;
	uint16_t	wRPipe;
	uint32_t	dwTransferID;
} wa_abort_req_t;


/* HWA specific transfer request definitions */
typedef struct hwa_isoc_req {
	uint8_t		bLength;
	uint8_t		bRequestType;
	uint16_t	wRPipe;
	uint32_t	dwTransferID;
	uint32_t	dwTransferLength;
	uint8_t		bTransferSegment;
	uint8_t		bReserved;
	uint16_t	wPresentationTime;
	uint32_t	dwNumOfPackets;
} wa_isoc_req_t;

typedef struct hwa_isoc_pkt {
	uint16_t	wLength;
	uint8_t		bPacketType;
	uint8_t		bReserved;
	uint16_t	PacketLength[1];	/* variable length array */
} hwa_isoc_pkt_t;

#define	HWA_ISOC_PKT_INFO_TYPE		0xa0

/* Wire adapter class transfer result */
typedef struct wa_xfer_result {
	uint8_t		bLength;
	uint8_t		bResultType;
	uint32_t	dwTransferID;
	uint32_t	dwTransferLength;
	uint8_t		bTransferSegment;
	uint8_t		bTransferStatus;
	uint32_t	dwNumOfPackets;
} wa_xfer_result_t;

#define	WA_RESULT_TYPE_TRANSFER		0x83
#define	WA_XFER_RESULT_LEN		0x10

enum wa_xfer_status {
	WA_STS_SUCCESS = 0,
	WA_STS_HALTED = 1,
	WA_STS_DATA_BUFFER_ERROR = 2,
	WA_STS_BABBLE = 3,
	WA_STS_NOT_FOUND = 5,
	WA_STS_INSUFFICIENT_RESOURCE = 6,
	WA_STS_TRANSACTION_ERROR = 7,
	WA_STS_ABORTED = 8,
	WA_STS_RPIPE_NOT_READY = 9,
	WA_STS_INVALID_REQ_FORMAT = 10,
	WA_STS_UNEXPECTED_SEGMENT_NUM = 11,
	WA_STS_RPIPE_TYPE_MISMATCH = 12,
	WA_STS_PACKET_DISCARDED = 13,
} wa_xfer_status_t;

#define	WA_RPIPE_STATE_FREE		0	/* not assigned */
#define	WA_RPIPE_STATE_IDLE		1	/* configured but not active */
#define	WA_RPIPE_STATE_ACTIVE		2	/* configured and active */
#define	WA_RPIPE_STATE_PAUSE		3	/* configured and paused */
#define	WA_RPIPE_STATE_ERROR		4	/* error */

#define	WA_RPIPE_DEFAULT_TIMEOUT	5
#define	WA_MAX_SEG_COUNT		128	/* 7bit */
#define	WA_DIR_IN			1
#define	WA_DIR_OUT			0

#define	WA_GET_ID(x)		id32_alloc((void *)(x), KM_NOSLEEP)
#define	WA_LOOKUP_ID(x)		id32_lookup((x))
#define	WA_FREE_ID(x)		id32_free((x))

typedef struct wusb_wa_seg {
	void			*seg_wr;	/* wrapper */
	uint8_t			seg_num;
	uint32_t		seg_id;		/* will delete */
	uint32_t		seg_len;
	uint32_t		seg_actual_len;
	uint8_t			seg_status;	/* WA result status */
	uint8_t			seg_state;	/* segment state */
	uint8_t			seg_done;

	usb_bulk_req_t		*seg_trans_reqp; /* for transfer reqp */
	uint8_t			seg_trans_req_state; /* state:submitted */
	kcondvar_t		seg_trans_cv;

	usb_bulk_req_t		*seg_data_reqp;  /* for out data */
	uint8_t			seg_data_req_state; /* state */
	kcondvar_t		seg_data_cv;
} wusb_wa_seg_t;

_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_seg_t::seg_wr
		wusb_wa_seg_t::seg_num
		wusb_wa_seg_t::seg_id
		wusb_wa_seg_t::seg_len
		wusb_wa_seg_t::seg_trans_reqp
		wusb_wa_seg_t::seg_data_reqp))

struct wusb_wa_trans_wrapper;

typedef struct wusb_wa_rpipe_hdl {
	uint_t			rp_state; /* free, idle, active, pause, err */
	kmutex_t		rp_mutex;
	kcondvar_t		rp_cv;
	uint_t			rp_refcnt;	/* for multiplexing */
	timeout_id_t		rp_timer_id;
	usb_wa_rpipe_descr_t	rp_descr;
	uint8_t			rp_block_chg;	/* wBlocks changed? */
	uint16_t		rp_avail_reqs;	/* available req slots */
	void			*rp_curr_wr;	/* current wr */
	struct wusb_wa_trans_wrapper *rp_timeout_list;	/* timeout list */
} wusb_wa_rpipe_hdl_t;

_NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_rpipe_hdl_t))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_rpipe_hdl_t::rp_descr))

typedef struct wusb_wa_data {
	dev_info_t		*wa_dip;
	void			*wa_private_data;

	kmutex_t		wa_mutex;

	uint8_t			wa_ifno;
	usb_if_descr_t		wa_if_descr;
	usb_wa_descr_t		wa_descr;
	uint16_t		wa_avail_blocks; /* available blocks */

	usb_ep_descr_t		wa_intr_ept;
	usb_ep_descr_t		wa_bulkin_ept;
	usb_ep_descr_t		wa_bulkout_ept;

	uint_t			wa_state;
	usb_pipe_policy_t	wa_pipe_policy;

	usb_pipe_handle_t	wa_default_pipe;

	/* INTR IN ep */
	usb_pipe_handle_t	wa_intr_ph;
	usb_pipe_policy_t	wa_intr_pipe_policy;
	uint_t			wa_intr_pipe_state;

	/* BULK IN ep */
	usb_pipe_handle_t	wa_bulkin_ph;
	usb_pipe_policy_t	wa_bulkin_pipe_policy;
	uint_t			wa_bulkin_pipe_state;

	/* BULK OUT ep */
	usb_pipe_handle_t	wa_bulkout_ph;
	usb_pipe_policy_t	wa_bulkout_pipe_policy;
	uint_t			wa_bulkout_pipe_state;

	uint16_t		wa_num_rpipes;
	wusb_wa_rpipe_hdl_t	*wa_rpipe_hdl;

	int  (*pipe_periodic_req)(struct wusb_wa_data *,
		usba_pipe_handle_data_t *);
	void (*intr_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
	void (*intr_exc_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
	void (*rpipe_xfer_cb)(dev_info_t *dip, usba_pipe_handle_data_t *ph,
	    struct wusb_wa_trans_wrapper *, usb_cr_t cr);
} wusb_wa_data_t;

_NOTE(MUTEX_PROTECTS_DATA(wusb_wa_data_t::wa_mutex, wusb_wa_data_t))

_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_dip))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_default_pipe))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_bulkout_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_bulkin_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_intr_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_ifno
		wusb_wa_data_t::wa_descr
		wusb_wa_data_t::wa_private_data))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::rpipe_xfer_cb))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::pipe_periodic_req))

typedef enum {
	WR_NO_ERROR = 0,
	WR_SEG_REQ_ERR = 1,	/* send seg request error */
	WR_SEG_DAT_ERR = 2,	/* send seg data error */
	WR_XFER_ERR = 3,	/* general xfer error */
	WR_ABORTED = 4,		/* aborted */
	WR_TIMEOUT = 5,		/* timeout */
	WR_INTERRUPTED = 6,	/* user interrupted */
	WR_FINISHED = 7,	/* finished successfully */
} wusb_wa_wr_state_t;

typedef struct wusb_wa_trans_wrapper {
	usba_pipe_handle_data_t	*wr_ph;
	wusb_wa_rpipe_hdl_t	*wr_rp;
	wusb_wa_data_t		*wr_wa_data;
	kcondvar_t		wr_cv;	/* cv, use Rpipe's mutex to protect */
	usb_flags_t		wr_flags;
	uint8_t			wr_type;	/* transfer type */
	uint8_t			wr_nsegs;	/* number of segs */
	uint32_t		wr_max_seglen;	/* max data len per seg */
	uint8_t			wr_dir;		/* transfer direction */
	uint32_t		wr_id;		/* unique id */
	usb_opaque_t		wr_reqp;	/* original reqp */
	int			wr_timeout;
	wusb_wa_seg_t		*wr_seg_array;
	uint8_t			wr_curr_seg;	/* next seg to process */
	wusb_wa_wr_state_t	wr_state;	/* 1 - error, not continue */
	uint8_t			wr_has_aborted; /* boolean */
	uint8_t			wr_seg_done;	/* number of segs done */
	void			(*wr_cb)(wusb_wa_data_t *wa_data,
				struct wusb_wa_trans_wrapper *wr,
				usb_cr_t cr,
				uint_t reset_flag);	/* callback func */

	struct wusb_wa_trans_wrapper *wr_timeout_next; /* timeout list */
} wusb_wa_trans_wrapper_t;

_NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex,
    wusb_wa_trans_wrapper_t))
_NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_seg_t))

_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_rp))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_ph))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_cb))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_reqp
		wusb_wa_trans_wrapper_t::wr_dir
		wusb_wa_trans_wrapper_t::wr_nsegs
		wusb_wa_trans_wrapper_t::wr_seg_array
		wusb_wa_trans_wrapper_t::wr_id))
_NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_wa_data))

typedef struct wusb_secrt_data {
	usb_security_descr_t	secrt_descr;
	uint_t			secrt_n_encry;
	usb_encryption_descr_t	*secrt_encry_descr;
} wusb_secrt_data_t;

typedef struct wusb_wa_cb {
	int  (*pipe_periodic_req)(wusb_wa_data_t *,
		usba_pipe_handle_data_t *);
	void (*intr_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
	void (*intr_exc_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
	void (*rpipe_xfer_cb)(dev_info_t *dip, usba_pipe_handle_data_t *ph,
	    wusb_wa_trans_wrapper_t *, usb_cr_t cr);
} wusb_wa_cb_t;

#define	WA_PIPE_CLOSED		0x00
#define	WA_PIPE_ACTIVE		0x01
#define	WA_PIPE_STOPPED		0X02
#define	WA_PIPE_CLOSING		0x03
#define	WA_PIPE_RESET		0x04

#define	WA_PIPES_OPENED		0x00000001

int	wusb_parse_wa_descr(usb_wa_descr_t *, usb_alt_if_data_t *);
void	wusb_wa_rpipes_init(wusb_wa_data_t *);
void	wusb_wa_rpipes_fini(wusb_wa_data_t *);
int	wusb_wa_data_init(dev_info_t *, wusb_wa_data_t *, wusb_wa_cb_t *,
	usb_client_dev_data_t *, uint_t, usb_log_handle_t);
void	wusb_wa_data_fini(wusb_wa_data_t *);
int	wusb_wa_get_rpipe_descr(dev_info_t *, usb_pipe_handle_t, uint16_t,
	usb_wa_rpipe_descr_t *, uint_t, usb_log_handle_t);
int	wusb_wa_get_rpipe_descrs(wusb_wa_data_t *, usb_pipe_handle_t,
	uint_t, usb_log_handle_t);
int	wusb_get_wa_status(wusb_wa_data_t *, usb_pipe_handle_t, uint32_t *);
int	wusb_wa_reset(wusb_wa_data_t *, usb_pipe_handle_t);
int	wusb_wa_enable(wusb_wa_data_t *, usb_pipe_handle_t);
int	wusb_wa_disable(wusb_wa_data_t *, usb_pipe_handle_t);
int	wusb_wa_open_pipes(wusb_wa_data_t *);
void	wusb_wa_close_pipes(wusb_wa_data_t *);
int	wusb_wa_start_nep(wusb_wa_data_t *, usb_flags_t);
void	wusb_wa_stop_nep(wusb_wa_data_t *);

int	wusb_wa_get_rpipe(wusb_wa_data_t *, usb_pipe_handle_t, uint8_t,
	wusb_wa_rpipe_hdl_t **, uint_t, usb_log_handle_t);
int	wusb_wa_release_rpipe(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *);
int	wusb_wa_get_ep_comp_descr(usba_pipe_handle_data_t *,
	usb_ep_comp_descr_t *);
int	wusb_wa_set_rpipe_descr(dev_info_t *, usb_pipe_handle_t,
	usb_wa_rpipe_descr_t *);
int	wusb_wa_set_rpipe_target(dev_info_t *, wusb_wa_data_t *,
	usb_pipe_handle_t, usba_pipe_handle_data_t *, wusb_wa_rpipe_hdl_t *);
int	wusb_wa_rpipe_abort(dev_info_t *, usb_pipe_handle_t,
	wusb_wa_rpipe_hdl_t *);
int	wusb_wa_rpipe_reset(dev_info_t *, usba_pipe_handle_data_t *,
	wusb_wa_rpipe_hdl_t *, int);
int	wusb_wa_get_rpipe_status(dev_info_t *, usb_pipe_handle_t, uint16_t,
	uint8_t	*);
wusb_wa_trans_wrapper_t *
wusb_wa_create_ctrl_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t	*, usb_ctrl_req_t *, usb_flags_t);
wusb_wa_trans_wrapper_t *
wusb_wa_create_bulk_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t);
wusb_wa_trans_wrapper_t *
wusb_wa_create_intr_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t);
wusb_wa_trans_wrapper_t *
wusb_wa_alloc_ctrl_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t);
wusb_wa_trans_wrapper_t *
wusb_wa_alloc_bulk_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t);
wusb_wa_trans_wrapper_t *
wusb_wa_alloc_intr_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t);

void	wusb_wa_setup_trans_req(wusb_wa_trans_wrapper_t *, wusb_wa_seg_t *,
	uint8_t);
int	wusb_wa_setup_segs(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
	uint32_t, mblk_t *);
void	wusb_wa_free_segs(wusb_wa_trans_wrapper_t *);
void	wusb_wa_free_trans_wrapper(wusb_wa_trans_wrapper_t *);

void	wusb_wa_abort_req(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
	uint32_t);
int	wusb_wa_wr_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	wusb_wa_trans_wrapper_t *, usb_flags_t);
int	wusb_wa_submit_ctrl_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	wusb_wa_trans_wrapper_t *, usb_ctrl_req_t *, usb_flags_t);
int	wusb_wa_ctrl_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t);
int	wusb_wa_submit_bulk_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	wusb_wa_trans_wrapper_t *, usb_bulk_req_t *, usb_flags_t);
int	wusb_wa_bulk_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t);
int	wusb_wa_submit_intr_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	wusb_wa_trans_wrapper_t *, usb_intr_req_t *, usb_flags_t);
int	wusb_wa_intr_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
	usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t);

void	wusb_wa_start_xfer_timer(wusb_wa_rpipe_hdl_t *);

void	wusb_wa_xfer_timeout_handler(void *);
void	wusb_wa_stop_xfer_timer(wusb_wa_trans_wrapper_t *);

void	wusb_wa_clear_dev_ep(usba_pipe_handle_data_t *ph);

int	wusb_wa_get_data(wusb_wa_data_t *, wusb_wa_seg_t *, uint32_t);
int	wusb_wa_get_xfer_result(wusb_wa_data_t *);
void	wusb_wa_check_req_done(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
	uint8_t);
void	wusb_wa_handle_ctrl(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
	usb_cr_t, uint_t);
void	wusb_wa_handle_bulk(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
	usb_cr_t, uint_t);
void	wusb_wa_handle_intr(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
	usb_cr_t, uint_t);
void	wusb_wa_callback(wusb_wa_data_t *, usba_pipe_handle_data_t *,
	wusb_wa_trans_wrapper_t *, usb_cr_t);
usb_cr_t wusb_wa_sts2cr(uint8_t);


#ifdef __cplusplus
}
#endif

#endif /* _SYS_USB_WA_H */