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 */
|