xref: /onnv-gate/usr/src/uts/common/sys/usb/usba/wa.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_USB_WA_H
27*9430SRaymond.Chen@Sun.COM #define	_SYS_USB_WA_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 #include <sys/usb/usba.h>
34*9430SRaymond.Chen@Sun.COM #include <sys/usb/usba/usba_types.h>
35*9430SRaymond.Chen@Sun.COM #include <sys/id32.h>
36*9430SRaymond.Chen@Sun.COM 
37*9430SRaymond.Chen@Sun.COM /* Wire adapter class extension for descriptors */
38*9430SRaymond.Chen@Sun.COM typedef struct usb_wa_descr {
39*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
40*9430SRaymond.Chen@Sun.COM 	uint8_t		bDescriptorType;
41*9430SRaymond.Chen@Sun.COM 	uint16_t	bcdWAVersion;
42*9430SRaymond.Chen@Sun.COM 	uint8_t		bNumPorts;
43*9430SRaymond.Chen@Sun.COM 	uint8_t		bmAttributes;
44*9430SRaymond.Chen@Sun.COM 	uint16_t	wNumRPipes;
45*9430SRaymond.Chen@Sun.COM 	uint16_t	wRPipeMaxBlock;
46*9430SRaymond.Chen@Sun.COM 	uint8_t		bRPipeBlockSize;
47*9430SRaymond.Chen@Sun.COM 	uint8_t		bPwrOn2PwrGood;
48*9430SRaymond.Chen@Sun.COM 	uint8_t		bNumMMCIEs;
49*9430SRaymond.Chen@Sun.COM 	uint8_t		DeviceRemovable;
50*9430SRaymond.Chen@Sun.COM } usb_wa_descr_t;
51*9430SRaymond.Chen@Sun.COM 
52*9430SRaymond.Chen@Sun.COM typedef struct usb_wa_rpipe_descr {
53*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
54*9430SRaymond.Chen@Sun.COM 	uint8_t		bDescriptorType;
55*9430SRaymond.Chen@Sun.COM 	uint16_t	wRPipeIndex;
56*9430SRaymond.Chen@Sun.COM 	uint16_t	wRequests;
57*9430SRaymond.Chen@Sun.COM 	uint16_t	wBlocks;
58*9430SRaymond.Chen@Sun.COM 	uint16_t	wMaxPacketSize;
59*9430SRaymond.Chen@Sun.COM 	union {
60*9430SRaymond.Chen@Sun.COM 		struct {
61*9430SRaymond.Chen@Sun.COM 			uint8_t	bHSHubAddress;
62*9430SRaymond.Chen@Sun.COM 			uint8_t	bHSHubPort;
63*9430SRaymond.Chen@Sun.COM 		} dwa_value;
64*9430SRaymond.Chen@Sun.COM 
65*9430SRaymond.Chen@Sun.COM 		struct {
66*9430SRaymond.Chen@Sun.COM 			uint8_t	bMaxBurst;
67*9430SRaymond.Chen@Sun.COM 			uint8_t	bDeviceInfoIndex;
68*9430SRaymond.Chen@Sun.COM 		} hwa_value;
69*9430SRaymond.Chen@Sun.COM 	} wa_value;
70*9430SRaymond.Chen@Sun.COM 
71*9430SRaymond.Chen@Sun.COM 	uint8_t		bSpeed;
72*9430SRaymond.Chen@Sun.COM 	uint8_t		bDeviceAddress;
73*9430SRaymond.Chen@Sun.COM 	uint8_t		bEndpointAddress;
74*9430SRaymond.Chen@Sun.COM 	uint8_t		bDataSequence;
75*9430SRaymond.Chen@Sun.COM 	uint32_t	dwCurrentWindow;
76*9430SRaymond.Chen@Sun.COM 	uint8_t		bMaxDataSequence;
77*9430SRaymond.Chen@Sun.COM 	uint8_t		bInterval;
78*9430SRaymond.Chen@Sun.COM 	uint8_t		bOverTheAirInterval;
79*9430SRaymond.Chen@Sun.COM 	uint8_t		bmAttribute;
80*9430SRaymond.Chen@Sun.COM 	uint8_t		bmCharacteristics;
81*9430SRaymond.Chen@Sun.COM 	uint8_t		bmRetryOptions;
82*9430SRaymond.Chen@Sun.COM 	uint16_t	wNumTransactionErrors;
83*9430SRaymond.Chen@Sun.COM } usb_wa_rpipe_descr_t;
84*9430SRaymond.Chen@Sun.COM 
85*9430SRaymond.Chen@Sun.COM /* Rpipe bmCharacteristics mask and bits */
86*9430SRaymond.Chen@Sun.COM #define	USB_RPIPE_CHA_MASK		0x0f
87*9430SRaymond.Chen@Sun.COM #define	USB_RPIPE_CHA_CTRL		0x01
88*9430SRaymond.Chen@Sun.COM #define	USB_RRIPE_CHA_ISOC		0x02
89*9430SRaymond.Chen@Sun.COM #define	USB_RRIPE_CHA_BULK		0x04
90*9430SRaymond.Chen@Sun.COM #define	USB_RPIPE_CHA_INTR		0x08
91*9430SRaymond.Chen@Sun.COM 
92*9430SRaymond.Chen@Sun.COM /*
93*9430SRaymond.Chen@Sun.COM  * ************************************************************
94*9430SRaymond.Chen@Sun.COM  * Wire adapter class request related structures and data types
95*9430SRaymond.Chen@Sun.COM  * ************************************************************
96*9430SRaymond.Chen@Sun.COM  */
97*9430SRaymond.Chen@Sun.COM 
98*9430SRaymond.Chen@Sun.COM /* Wire adapter class specific requests */
99*9430SRaymond.Chen@Sun.COM #define	WA_REQ_ABORT_RPIPE		0x0e
100*9430SRaymond.Chen@Sun.COM #define	WA_REQ_RESET_RPIPE		0x0f
101*9430SRaymond.Chen@Sun.COM 
102*9430SRaymond.Chen@Sun.COM /* HWA specific requests as host controller, T8-50 */
103*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_ADD_MMC_IE		0x14
104*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_REMOVE_MMC_IE		0x15
105*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_SET_NUM_DNTS		0x16
106*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_SET_CLUSTER_ID		0x17
107*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_SET_DEVICE_INFO		0x18
108*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_GET_TIME		0x19
109*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_SET_STREAM_IDX		0x1a
110*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_SET_WUSB_MAS		0x1b
111*9430SRaymond.Chen@Sun.COM #define	HWA_REQ_CH_STOP			0x1c
112*9430SRaymond.Chen@Sun.COM 
113*9430SRaymond.Chen@Sun.COM /* DWA specific requests */
114*9430SRaymond.Chen@Sun.COM #define	DWA_REQ_SET_EP_ATTRIB		0x1e
115*9430SRaymond.Chen@Sun.COM 
116*9430SRaymond.Chen@Sun.COM /* wLength for wire adapter class requests */
117*9430SRaymond.Chen@Sun.COM #define	WA_GET_RPIPE_STATUS_LEN		1
118*9430SRaymond.Chen@Sun.COM #define	WA_GET_WA_STATUS_LEN		4
119*9430SRaymond.Chen@Sun.COM 
120*9430SRaymond.Chen@Sun.COM /* wLength for HWA specific requests */
121*9430SRaymond.Chen@Sun.COM #define	WUSB_SET_DEV_INFO_LEN		36
122*9430SRaymond.Chen@Sun.COM #define	WUSB_SET_WUSB_MAS_LEN		32
123*9430SRaymond.Chen@Sun.COM 
124*9430SRaymond.Chen@Sun.COM /* wLength for DWA specific requests */
125*9430SRaymond.Chen@Sun.COM #define	DWA_GET_STATUS_LEN		4
126*9430SRaymond.Chen@Sun.COM #define	DWA_ISOC_EP_ATTRIB_LEN		6
127*9430SRaymond.Chen@Sun.COM 
128*9430SRaymond.Chen@Sun.COM /* Wire adapter class feature selector */
129*9430SRaymond.Chen@Sun.COM #define	WA_DEV_ENABLE			1
130*9430SRaymond.Chen@Sun.COM #define	WA_DEV_RESET			2
131*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_PAUSE			1
132*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STALL			2
133*9430SRaymond.Chen@Sun.COM 
134*9430SRaymond.Chen@Sun.COM /* Rpipe status bits */
135*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_IDLE			0x01
136*9430SRaymond.Chen@Sun.COM #define	WA_PRIPE_PAUSED			0x02
137*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_CONFIGURED		0x04
138*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STALLED		0x08
139*9430SRaymond.Chen@Sun.COM 
140*9430SRaymond.Chen@Sun.COM /* Wire adapter status bits */
141*9430SRaymond.Chen@Sun.COM #define	WA_HC_ENABLED			0x00000001
142*9430SRaymond.Chen@Sun.COM #define	WA_HC_RESET_IN_PROGRESS		0x00000002
143*9430SRaymond.Chen@Sun.COM 
144*9430SRaymond.Chen@Sun.COM /* HWA specific definitions */
145*9430SRaymond.Chen@Sun.COM #define	WUSB_CLASS_IF_REQ_IN_TYPE	(USB_DEV_REQ_DEV_TO_HOST \
146*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_TYPE_CLASS \
147*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_RCPT_IF)
148*9430SRaymond.Chen@Sun.COM 
149*9430SRaymond.Chen@Sun.COM #define	WUSB_CLASS_IF_REQ_OUT_TYPE	(USB_DEV_REQ_HOST_TO_DEV \
150*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_TYPE_CLASS \
151*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_RCPT_IF)
152*9430SRaymond.Chen@Sun.COM 
153*9430SRaymond.Chen@Sun.COM #define	WA_CLASS_RPIPE_REQ_IN_TYPE	(USB_DEV_REQ_DEV_TO_HOST \
154*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_TYPE_CLASS \
155*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_RCPT_RPIPE)
156*9430SRaymond.Chen@Sun.COM 
157*9430SRaymond.Chen@Sun.COM #define	WA_CLASS_RPIPE_REQ_OUT_TYPE	(USB_DEV_REQ_HOST_TO_DEV \
158*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_TYPE_CLASS \
159*9430SRaymond.Chen@Sun.COM 					|USB_DEV_REQ_RCPT_RPIPE)
160*9430SRaymond.Chen@Sun.COM 
161*9430SRaymond.Chen@Sun.COM #define	HWA_TIME_ADJ			0
162*9430SRaymond.Chen@Sun.COM #define	HWA_TIME_BPST			1
163*9430SRaymond.Chen@Sun.COM #define	HWA_TIME_WUSB			2
164*9430SRaymond.Chen@Sun.COM 
165*9430SRaymond.Chen@Sun.COM typedef struct hwa_dev_info {
166*9430SRaymond.Chen@Sun.COM 	uint8_t		bmDeviceAvailablilityInfo[32];
167*9430SRaymond.Chen@Sun.COM 	uint8_t		bDeviceAddress;
168*9430SRaymond.Chen@Sun.COM 	uint8_t		wPHYRates[2];
169*9430SRaymond.Chen@Sun.COM 	uint8_t		bmDeviceAttribute;
170*9430SRaymond.Chen@Sun.COM } hwa_dev_info_t;
171*9430SRaymond.Chen@Sun.COM 
172*9430SRaymond.Chen@Sun.COM /* DWA specific definitions */
173*9430SRaymond.Chen@Sun.COM typedef struct dwa_isoc_ep_attrib {
174*9430SRaymond.Chen@Sun.COM 	uint16_t	wMaxStreamDelay;
175*9430SRaymond.Chen@Sun.COM 	uint16_t	wOverTheAirPacketSize;
176*9430SRaymond.Chen@Sun.COM 	uint16_t	wReserved;
177*9430SRaymond.Chen@Sun.COM } dwa_isoc_ep_attrib_t;
178*9430SRaymond.Chen@Sun.COM 
179*9430SRaymond.Chen@Sun.COM 
180*9430SRaymond.Chen@Sun.COM /*
181*9430SRaymond.Chen@Sun.COM  * *****************************************************************
182*9430SRaymond.Chen@Sun.COM  * Wire adapter class notification related structures and data types
183*9430SRaymond.Chen@Sun.COM  * *****************************************************************
184*9430SRaymond.Chen@Sun.COM  */
185*9430SRaymond.Chen@Sun.COM 
186*9430SRaymond.Chen@Sun.COM /* Wire adapter class specific notification */
187*9430SRaymond.Chen@Sun.COM #define	WA_NOTIF_TYPE_TRANSFER		0x93
188*9430SRaymond.Chen@Sun.COM 
189*9430SRaymond.Chen@Sun.COM typedef struct wa_notif_header {
190*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
191*9430SRaymond.Chen@Sun.COM 	uint8_t		bNotifyType;
192*9430SRaymond.Chen@Sun.COM } wa_notif_header_t;
193*9430SRaymond.Chen@Sun.COM 
194*9430SRaymond.Chen@Sun.COM typedef struct wa_notif_transfer {
195*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
196*9430SRaymond.Chen@Sun.COM 	uint8_t		bNotifyType;
197*9430SRaymond.Chen@Sun.COM 	uint8_t		bEndpoint;
198*9430SRaymond.Chen@Sun.COM 	uint8_t		bReserved;
199*9430SRaymond.Chen@Sun.COM } wa_notif_transfer_t;
200*9430SRaymond.Chen@Sun.COM 
201*9430SRaymond.Chen@Sun.COM /* HWA specific notifications */
202*9430SRaymond.Chen@Sun.COM #define	HWA_NOTIF_TYPE_BPST_ADJ		0x94
203*9430SRaymond.Chen@Sun.COM #define	HWA_NOTIF_TYPE_DN_RECEIVED	0x95
204*9430SRaymond.Chen@Sun.COM 
205*9430SRaymond.Chen@Sun.COM typedef struct hwa_notif_bpst_adj {
206*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
207*9430SRaymond.Chen@Sun.COM 	uint8_t		bNotifyType;
208*9430SRaymond.Chen@Sun.COM 	uint8_t		bAdjustment;
209*9430SRaymond.Chen@Sun.COM } hwa_notif_bpst_adj_t;
210*9430SRaymond.Chen@Sun.COM 
211*9430SRaymond.Chen@Sun.COM typedef struct hwa_notif_dn_recvd {
212*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
213*9430SRaymond.Chen@Sun.COM 	uint8_t		bNotifyType;
214*9430SRaymond.Chen@Sun.COM 	uint8_t		bSourceDeviceAddr;
215*9430SRaymond.Chen@Sun.COM 	uint8_t		bmAttributes;
216*9430SRaymond.Chen@Sun.COM 	uint8_t		notifdata[1];	/* variable length raw data */
217*9430SRaymond.Chen@Sun.COM } hwa_notif_dn_recvd_t;
218*9430SRaymond.Chen@Sun.COM 
219*9430SRaymond.Chen@Sun.COM /* DWA specific notifications */
220*9430SRaymond.Chen@Sun.COM #define	DWA_NOTIF_TYPE_RWAKE		0x91
221*9430SRaymond.Chen@Sun.COM #define	DWA_NOTIF_TYPE_PORTSTATUS	0x92
222*9430SRaymond.Chen@Sun.COM 
223*9430SRaymond.Chen@Sun.COM typedef struct dwa_notif_rwake {
224*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
225*9430SRaymond.Chen@Sun.COM 	uint8_t		bNotifyType;
226*9430SRaymond.Chen@Sun.COM } dwa_notif_rwake;
227*9430SRaymond.Chen@Sun.COM 
228*9430SRaymond.Chen@Sun.COM typedef struct dwa_notif_portstatus {
229*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
230*9430SRaymond.Chen@Sun.COM 	uint8_t		bNotifyType;
231*9430SRaymond.Chen@Sun.COM 	uint8_t		bPortIndex;
232*9430SRaymond.Chen@Sun.COM } dwa_notif_portstatus;
233*9430SRaymond.Chen@Sun.COM 
234*9430SRaymond.Chen@Sun.COM 
235*9430SRaymond.Chen@Sun.COM /*
236*9430SRaymond.Chen@Sun.COM  * *********************************************************************
237*9430SRaymond.Chen@Sun.COM  * Wire adapter class transfer request related structures and data types
238*9430SRaymond.Chen@Sun.COM  * *********************************************************************
239*9430SRaymond.Chen@Sun.COM  */
240*9430SRaymond.Chen@Sun.COM 
241*9430SRaymond.Chen@Sun.COM /* Wire adapter class transfer requests */
242*9430SRaymond.Chen@Sun.COM #define	WA_XFER_REQ_TYPE_CTRL		0x80
243*9430SRaymond.Chen@Sun.COM #define	WA_XFER_REQ_TYPE_BULK_INTR	0x81
244*9430SRaymond.Chen@Sun.COM #define	WA_XFER_REQ_TYPE_ABORT		0x84
245*9430SRaymond.Chen@Sun.COM /* HWA specific transfer request */
246*9430SRaymond.Chen@Sun.COM #define	HWA_XFER_REQ_TYPE_ISOC		0x82
247*9430SRaymond.Chen@Sun.COM 
248*9430SRaymond.Chen@Sun.COM /* Wire adapter class transfer request length */
249*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_REQ_LEN			0x18
250*9430SRaymond.Chen@Sun.COM #define	WA_BULK_INTR_REQ_LEN		0x10
251*9430SRaymond.Chen@Sun.COM #define	WA_ABORT_REQ_LEN		0x08
252*9430SRaymond.Chen@Sun.COM /* HWA specific transfer request length */
253*9430SRaymond.Chen@Sun.COM #define	HWA_ISOC_REQ_LEN		0x14
254*9430SRaymond.Chen@Sun.COM 
255*9430SRaymond.Chen@Sun.COM typedef struct wa_ctrl_req {
256*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
257*9430SRaymond.Chen@Sun.COM 	uint8_t		bRequestType;
258*9430SRaymond.Chen@Sun.COM 	uint16_t	wRPipe;
259*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferID;
260*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferLength;
261*9430SRaymond.Chen@Sun.COM 	uint8_t		bTransferSegment;
262*9430SRaymond.Chen@Sun.COM 	uint8_t		bmAttribute;
263*9430SRaymond.Chen@Sun.COM 	uint16_t	wReserved;
264*9430SRaymond.Chen@Sun.COM 	uint8_t		baSetupData[8];
265*9430SRaymond.Chen@Sun.COM } wa_ctrl_req_t;
266*9430SRaymond.Chen@Sun.COM 
267*9430SRaymond.Chen@Sun.COM /* ctrl request bmAttribute */
268*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_DIR_MASK		0x01
269*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_DIR_IN			0x01
270*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_DIR_OUT			0x00
271*9430SRaymond.Chen@Sun.COM 
272*9430SRaymond.Chen@Sun.COM /* ctrl request bmAttribute valid only for HWA */
273*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_SECRT_MASK		0x02
274*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_SECRT_REGULAR		0x00
275*9430SRaymond.Chen@Sun.COM #define	WA_CTRL_SECRT_NONE		0x02
276*9430SRaymond.Chen@Sun.COM 
277*9430SRaymond.Chen@Sun.COM typedef struct wa_bulk_intr_req {
278*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
279*9430SRaymond.Chen@Sun.COM 	uint8_t		bRequestType;
280*9430SRaymond.Chen@Sun.COM 	uint16_t	wRPipe;
281*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferID;
282*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferLength;
283*9430SRaymond.Chen@Sun.COM 	uint8_t		bTransferSegment;
284*9430SRaymond.Chen@Sun.COM 	uint8_t		bReserved;
285*9430SRaymond.Chen@Sun.COM 	uint16_t	wReserved;
286*9430SRaymond.Chen@Sun.COM } wa_bulk_intr_req_t;
287*9430SRaymond.Chen@Sun.COM 
288*9430SRaymond.Chen@Sun.COM typedef struct wa_abort_req {
289*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
290*9430SRaymond.Chen@Sun.COM 	uint8_t		bRequestType;
291*9430SRaymond.Chen@Sun.COM 	uint16_t	wRPipe;
292*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferID;
293*9430SRaymond.Chen@Sun.COM } wa_abort_req_t;
294*9430SRaymond.Chen@Sun.COM 
295*9430SRaymond.Chen@Sun.COM 
296*9430SRaymond.Chen@Sun.COM /* HWA specific transfer request definitions */
297*9430SRaymond.Chen@Sun.COM typedef struct hwa_isoc_req {
298*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
299*9430SRaymond.Chen@Sun.COM 	uint8_t		bRequestType;
300*9430SRaymond.Chen@Sun.COM 	uint16_t	wRPipe;
301*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferID;
302*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferLength;
303*9430SRaymond.Chen@Sun.COM 	uint8_t		bTransferSegment;
304*9430SRaymond.Chen@Sun.COM 	uint8_t		bReserved;
305*9430SRaymond.Chen@Sun.COM 	uint16_t	wPresentationTime;
306*9430SRaymond.Chen@Sun.COM 	uint32_t	dwNumOfPackets;
307*9430SRaymond.Chen@Sun.COM } wa_isoc_req_t;
308*9430SRaymond.Chen@Sun.COM 
309*9430SRaymond.Chen@Sun.COM typedef struct hwa_isoc_pkt {
310*9430SRaymond.Chen@Sun.COM 	uint16_t	wLength;
311*9430SRaymond.Chen@Sun.COM 	uint8_t		bPacketType;
312*9430SRaymond.Chen@Sun.COM 	uint8_t		bReserved;
313*9430SRaymond.Chen@Sun.COM 	uint16_t	PacketLength[1];	/* variable length array */
314*9430SRaymond.Chen@Sun.COM } hwa_isoc_pkt_t;
315*9430SRaymond.Chen@Sun.COM 
316*9430SRaymond.Chen@Sun.COM #define	HWA_ISOC_PKT_INFO_TYPE		0xa0
317*9430SRaymond.Chen@Sun.COM 
318*9430SRaymond.Chen@Sun.COM /* Wire adapter class transfer result */
319*9430SRaymond.Chen@Sun.COM typedef struct wa_xfer_result {
320*9430SRaymond.Chen@Sun.COM 	uint8_t		bLength;
321*9430SRaymond.Chen@Sun.COM 	uint8_t		bResultType;
322*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferID;
323*9430SRaymond.Chen@Sun.COM 	uint32_t	dwTransferLength;
324*9430SRaymond.Chen@Sun.COM 	uint8_t		bTransferSegment;
325*9430SRaymond.Chen@Sun.COM 	uint8_t		bTransferStatus;
326*9430SRaymond.Chen@Sun.COM 	uint32_t	dwNumOfPackets;
327*9430SRaymond.Chen@Sun.COM } wa_xfer_result_t;
328*9430SRaymond.Chen@Sun.COM 
329*9430SRaymond.Chen@Sun.COM #define	WA_RESULT_TYPE_TRANSFER		0x83
330*9430SRaymond.Chen@Sun.COM #define	WA_XFER_RESULT_LEN		0x10
331*9430SRaymond.Chen@Sun.COM 
332*9430SRaymond.Chen@Sun.COM enum wa_xfer_status {
333*9430SRaymond.Chen@Sun.COM 	WA_STS_SUCCESS = 0,
334*9430SRaymond.Chen@Sun.COM 	WA_STS_HALTED = 1,
335*9430SRaymond.Chen@Sun.COM 	WA_STS_DATA_BUFFER_ERROR = 2,
336*9430SRaymond.Chen@Sun.COM 	WA_STS_BABBLE = 3,
337*9430SRaymond.Chen@Sun.COM 	WA_STS_NOT_FOUND = 5,
338*9430SRaymond.Chen@Sun.COM 	WA_STS_INSUFFICIENT_RESOURCE = 6,
339*9430SRaymond.Chen@Sun.COM 	WA_STS_TRANSACTION_ERROR = 7,
340*9430SRaymond.Chen@Sun.COM 	WA_STS_ABORTED = 8,
341*9430SRaymond.Chen@Sun.COM 	WA_STS_RPIPE_NOT_READY = 9,
342*9430SRaymond.Chen@Sun.COM 	WA_STS_INVALID_REQ_FORMAT = 10,
343*9430SRaymond.Chen@Sun.COM 	WA_STS_UNEXPECTED_SEGMENT_NUM = 11,
344*9430SRaymond.Chen@Sun.COM 	WA_STS_RPIPE_TYPE_MISMATCH = 12,
345*9430SRaymond.Chen@Sun.COM 	WA_STS_PACKET_DISCARDED = 13,
346*9430SRaymond.Chen@Sun.COM } wa_xfer_status_t;
347*9430SRaymond.Chen@Sun.COM 
348*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STATE_FREE		0	/* not assigned */
349*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STATE_IDLE		1	/* configured but not active */
350*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STATE_ACTIVE		2	/* configured and active */
351*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STATE_PAUSE		3	/* configured and paused */
352*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_STATE_ERROR		4	/* error */
353*9430SRaymond.Chen@Sun.COM 
354*9430SRaymond.Chen@Sun.COM #define	WA_RPIPE_DEFAULT_TIMEOUT	5
355*9430SRaymond.Chen@Sun.COM #define	WA_MAX_SEG_COUNT		128	/* 7bit */
356*9430SRaymond.Chen@Sun.COM #define	WA_DIR_IN			1
357*9430SRaymond.Chen@Sun.COM #define	WA_DIR_OUT			0
358*9430SRaymond.Chen@Sun.COM 
359*9430SRaymond.Chen@Sun.COM #define	WA_GET_ID(x)		id32_alloc((void *)(x), KM_NOSLEEP)
360*9430SRaymond.Chen@Sun.COM #define	WA_LOOKUP_ID(x)		id32_lookup((x))
361*9430SRaymond.Chen@Sun.COM #define	WA_FREE_ID(x)		id32_free((x))
362*9430SRaymond.Chen@Sun.COM 
363*9430SRaymond.Chen@Sun.COM typedef struct wusb_wa_seg {
364*9430SRaymond.Chen@Sun.COM 	void			*seg_wr;	/* wrapper */
365*9430SRaymond.Chen@Sun.COM 	uint8_t			seg_num;
366*9430SRaymond.Chen@Sun.COM 	uint32_t		seg_id;		/* will delete */
367*9430SRaymond.Chen@Sun.COM 	uint32_t		seg_len;
368*9430SRaymond.Chen@Sun.COM 	uint32_t		seg_actual_len;
369*9430SRaymond.Chen@Sun.COM 	uint8_t			seg_status;	/* WA result status */
370*9430SRaymond.Chen@Sun.COM 	uint8_t			seg_state;	/* segment state */
371*9430SRaymond.Chen@Sun.COM 	uint8_t			seg_done;
372*9430SRaymond.Chen@Sun.COM 
373*9430SRaymond.Chen@Sun.COM 	usb_bulk_req_t		*seg_trans_reqp; /* for transfer reqp */
374*9430SRaymond.Chen@Sun.COM 	uint8_t			seg_trans_req_state; /* state:submitted */
375*9430SRaymond.Chen@Sun.COM 	kcondvar_t		seg_trans_cv;
376*9430SRaymond.Chen@Sun.COM 
377*9430SRaymond.Chen@Sun.COM 	usb_bulk_req_t		*seg_data_reqp;  /* for out data */
378*9430SRaymond.Chen@Sun.COM 	uint8_t			seg_data_req_state; /* state */
379*9430SRaymond.Chen@Sun.COM 	kcondvar_t		seg_data_cv;
380*9430SRaymond.Chen@Sun.COM } wusb_wa_seg_t;
381*9430SRaymond.Chen@Sun.COM 
382*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_seg_t::seg_wr
383*9430SRaymond.Chen@Sun.COM 		wusb_wa_seg_t::seg_num
384*9430SRaymond.Chen@Sun.COM 		wusb_wa_seg_t::seg_id
385*9430SRaymond.Chen@Sun.COM 		wusb_wa_seg_t::seg_len
386*9430SRaymond.Chen@Sun.COM 		wusb_wa_seg_t::seg_trans_reqp
387*9430SRaymond.Chen@Sun.COM 		wusb_wa_seg_t::seg_data_reqp))
388*9430SRaymond.Chen@Sun.COM 
389*9430SRaymond.Chen@Sun.COM struct wusb_wa_trans_wrapper;
390*9430SRaymond.Chen@Sun.COM 
391*9430SRaymond.Chen@Sun.COM typedef struct wusb_wa_rpipe_hdl {
392*9430SRaymond.Chen@Sun.COM 	uint_t			rp_state; /* free, idle, active, pause, err */
393*9430SRaymond.Chen@Sun.COM 	kmutex_t		rp_mutex;
394*9430SRaymond.Chen@Sun.COM 	kcondvar_t		rp_cv;
395*9430SRaymond.Chen@Sun.COM 	uint_t			rp_refcnt;	/* for multiplexing */
396*9430SRaymond.Chen@Sun.COM 	timeout_id_t		rp_timer_id;
397*9430SRaymond.Chen@Sun.COM 	usb_wa_rpipe_descr_t	rp_descr;
398*9430SRaymond.Chen@Sun.COM 	uint8_t			rp_block_chg;	/* wBlocks changed? */
399*9430SRaymond.Chen@Sun.COM 	uint16_t		rp_avail_reqs;	/* available req slots */
400*9430SRaymond.Chen@Sun.COM 	void			*rp_curr_wr;	/* current wr */
401*9430SRaymond.Chen@Sun.COM 	struct wusb_wa_trans_wrapper *rp_timeout_list;	/* timeout list */
402*9430SRaymond.Chen@Sun.COM } wusb_wa_rpipe_hdl_t;
403*9430SRaymond.Chen@Sun.COM 
404*9430SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_rpipe_hdl_t))
405*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_rpipe_hdl_t::rp_descr))
406*9430SRaymond.Chen@Sun.COM 
407*9430SRaymond.Chen@Sun.COM typedef struct wusb_wa_data {
408*9430SRaymond.Chen@Sun.COM 	dev_info_t		*wa_dip;
409*9430SRaymond.Chen@Sun.COM 	void			*wa_private_data;
410*9430SRaymond.Chen@Sun.COM 
411*9430SRaymond.Chen@Sun.COM 	kmutex_t		wa_mutex;
412*9430SRaymond.Chen@Sun.COM 
413*9430SRaymond.Chen@Sun.COM 	uint8_t			wa_ifno;
414*9430SRaymond.Chen@Sun.COM 	usb_if_descr_t		wa_if_descr;
415*9430SRaymond.Chen@Sun.COM 	usb_wa_descr_t		wa_descr;
416*9430SRaymond.Chen@Sun.COM 	uint16_t		wa_avail_blocks; /* available blocks */
417*9430SRaymond.Chen@Sun.COM 
418*9430SRaymond.Chen@Sun.COM 	usb_ep_descr_t		wa_intr_ept;
419*9430SRaymond.Chen@Sun.COM 	usb_ep_descr_t		wa_bulkin_ept;
420*9430SRaymond.Chen@Sun.COM 	usb_ep_descr_t		wa_bulkout_ept;
421*9430SRaymond.Chen@Sun.COM 
422*9430SRaymond.Chen@Sun.COM 	uint_t			wa_state;
423*9430SRaymond.Chen@Sun.COM 	usb_pipe_policy_t	wa_pipe_policy;
424*9430SRaymond.Chen@Sun.COM 
425*9430SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	wa_default_pipe;
426*9430SRaymond.Chen@Sun.COM 
427*9430SRaymond.Chen@Sun.COM 	/* INTR IN ep */
428*9430SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	wa_intr_ph;
429*9430SRaymond.Chen@Sun.COM 	usb_pipe_policy_t	wa_intr_pipe_policy;
430*9430SRaymond.Chen@Sun.COM 	uint_t			wa_intr_pipe_state;
431*9430SRaymond.Chen@Sun.COM 
432*9430SRaymond.Chen@Sun.COM 	/* BULK IN ep */
433*9430SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	wa_bulkin_ph;
434*9430SRaymond.Chen@Sun.COM 	usb_pipe_policy_t	wa_bulkin_pipe_policy;
435*9430SRaymond.Chen@Sun.COM 	uint_t			wa_bulkin_pipe_state;
436*9430SRaymond.Chen@Sun.COM 
437*9430SRaymond.Chen@Sun.COM 	/* BULK OUT ep */
438*9430SRaymond.Chen@Sun.COM 	usb_pipe_handle_t	wa_bulkout_ph;
439*9430SRaymond.Chen@Sun.COM 	usb_pipe_policy_t	wa_bulkout_pipe_policy;
440*9430SRaymond.Chen@Sun.COM 	uint_t			wa_bulkout_pipe_state;
441*9430SRaymond.Chen@Sun.COM 
442*9430SRaymond.Chen@Sun.COM 	uint16_t		wa_num_rpipes;
443*9430SRaymond.Chen@Sun.COM 	wusb_wa_rpipe_hdl_t	*wa_rpipe_hdl;
444*9430SRaymond.Chen@Sun.COM 
445*9430SRaymond.Chen@Sun.COM 	int  (*pipe_periodic_req)(struct wusb_wa_data *,
446*9430SRaymond.Chen@Sun.COM 		usba_pipe_handle_data_t *);
447*9430SRaymond.Chen@Sun.COM 	void (*intr_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
448*9430SRaymond.Chen@Sun.COM 	void (*intr_exc_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
449*9430SRaymond.Chen@Sun.COM 	void (*rpipe_xfer_cb)(dev_info_t *dip, usba_pipe_handle_data_t *ph,
450*9430SRaymond.Chen@Sun.COM 	    struct wusb_wa_trans_wrapper *, usb_cr_t cr);
451*9430SRaymond.Chen@Sun.COM } wusb_wa_data_t;
452*9430SRaymond.Chen@Sun.COM 
453*9430SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_data_t::wa_mutex, wusb_wa_data_t))
454*9430SRaymond.Chen@Sun.COM 
455*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_dip))
456*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_default_pipe))
457*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_bulkout_ph))
458*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_bulkin_ph))
459*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_intr_ph))
460*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_ifno
461*9430SRaymond.Chen@Sun.COM 		wusb_wa_data_t::wa_descr
462*9430SRaymond.Chen@Sun.COM 		wusb_wa_data_t::wa_private_data))
463*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::rpipe_xfer_cb))
464*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::pipe_periodic_req))
465*9430SRaymond.Chen@Sun.COM 
466*9430SRaymond.Chen@Sun.COM typedef enum {
467*9430SRaymond.Chen@Sun.COM 	WR_NO_ERROR = 0,
468*9430SRaymond.Chen@Sun.COM 	WR_SEG_REQ_ERR = 1,	/* send seg request error */
469*9430SRaymond.Chen@Sun.COM 	WR_SEG_DAT_ERR = 2,	/* send seg data error */
470*9430SRaymond.Chen@Sun.COM 	WR_XFER_ERR = 3,	/* general xfer error */
471*9430SRaymond.Chen@Sun.COM 	WR_ABORTED = 4,		/* aborted */
472*9430SRaymond.Chen@Sun.COM 	WR_TIMEOUT = 5,		/* timeout */
473*9430SRaymond.Chen@Sun.COM 	WR_INTERRUPTED = 6,	/* user interrupted */
474*9430SRaymond.Chen@Sun.COM 	WR_FINISHED = 7,	/* finished successfully */
475*9430SRaymond.Chen@Sun.COM } wusb_wa_wr_state_t;
476*9430SRaymond.Chen@Sun.COM 
477*9430SRaymond.Chen@Sun.COM typedef struct wusb_wa_trans_wrapper {
478*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t	*wr_ph;
479*9430SRaymond.Chen@Sun.COM 	wusb_wa_rpipe_hdl_t	*wr_rp;
480*9430SRaymond.Chen@Sun.COM 	wusb_wa_data_t		*wr_wa_data;
481*9430SRaymond.Chen@Sun.COM 	kcondvar_t		wr_cv;	/* cv, use Rpipe's mutex to protect */
482*9430SRaymond.Chen@Sun.COM 	usb_flags_t		wr_flags;
483*9430SRaymond.Chen@Sun.COM 	uint8_t			wr_type;	/* transfer type */
484*9430SRaymond.Chen@Sun.COM 	uint8_t			wr_nsegs;	/* number of segs */
485*9430SRaymond.Chen@Sun.COM 	uint32_t		wr_max_seglen;	/* max data len per seg */
486*9430SRaymond.Chen@Sun.COM 	uint8_t			wr_dir;		/* transfer direction */
487*9430SRaymond.Chen@Sun.COM 	uint32_t		wr_id;		/* unique id */
488*9430SRaymond.Chen@Sun.COM 	usb_opaque_t		wr_reqp;	/* original reqp */
489*9430SRaymond.Chen@Sun.COM 	int			wr_timeout;
490*9430SRaymond.Chen@Sun.COM 	wusb_wa_seg_t		*wr_seg_array;
491*9430SRaymond.Chen@Sun.COM 	uint8_t			wr_curr_seg;	/* next seg to process */
492*9430SRaymond.Chen@Sun.COM 	wusb_wa_wr_state_t	wr_state;	/* 1 - error, not continue */
493*9430SRaymond.Chen@Sun.COM 	uint8_t			wr_has_aborted; /* boolean */
494*9430SRaymond.Chen@Sun.COM 	uint8_t			wr_seg_done;	/* number of segs done */
495*9430SRaymond.Chen@Sun.COM 	void			(*wr_cb)(wusb_wa_data_t *wa_data,
496*9430SRaymond.Chen@Sun.COM 				struct wusb_wa_trans_wrapper *wr,
497*9430SRaymond.Chen@Sun.COM 				usb_cr_t cr,
498*9430SRaymond.Chen@Sun.COM 				uint_t reset_flag);	/* callback func */
499*9430SRaymond.Chen@Sun.COM 
500*9430SRaymond.Chen@Sun.COM 	struct wusb_wa_trans_wrapper *wr_timeout_next; /* timeout list */
501*9430SRaymond.Chen@Sun.COM } wusb_wa_trans_wrapper_t;
502*9430SRaymond.Chen@Sun.COM 
503*9430SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex,
504*9430SRaymond.Chen@Sun.COM     wusb_wa_trans_wrapper_t))
505*9430SRaymond.Chen@Sun.COM _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_seg_t))
506*9430SRaymond.Chen@Sun.COM 
507*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_rp))
508*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_ph))
509*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_cb))
510*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_reqp
511*9430SRaymond.Chen@Sun.COM 		wusb_wa_trans_wrapper_t::wr_dir
512*9430SRaymond.Chen@Sun.COM 		wusb_wa_trans_wrapper_t::wr_nsegs
513*9430SRaymond.Chen@Sun.COM 		wusb_wa_trans_wrapper_t::wr_seg_array
514*9430SRaymond.Chen@Sun.COM 		wusb_wa_trans_wrapper_t::wr_id))
515*9430SRaymond.Chen@Sun.COM _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_wa_data))
516*9430SRaymond.Chen@Sun.COM 
517*9430SRaymond.Chen@Sun.COM typedef struct wusb_secrt_data {
518*9430SRaymond.Chen@Sun.COM 	usb_security_descr_t	secrt_descr;
519*9430SRaymond.Chen@Sun.COM 	uint_t			secrt_n_encry;
520*9430SRaymond.Chen@Sun.COM 	usb_encryption_descr_t	*secrt_encry_descr;
521*9430SRaymond.Chen@Sun.COM } wusb_secrt_data_t;
522*9430SRaymond.Chen@Sun.COM 
523*9430SRaymond.Chen@Sun.COM typedef struct wusb_wa_cb {
524*9430SRaymond.Chen@Sun.COM 	int  (*pipe_periodic_req)(wusb_wa_data_t *,
525*9430SRaymond.Chen@Sun.COM 		usba_pipe_handle_data_t *);
526*9430SRaymond.Chen@Sun.COM 	void (*intr_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
527*9430SRaymond.Chen@Sun.COM 	void (*intr_exc_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req);
528*9430SRaymond.Chen@Sun.COM 	void (*rpipe_xfer_cb)(dev_info_t *dip, usba_pipe_handle_data_t *ph,
529*9430SRaymond.Chen@Sun.COM 	    wusb_wa_trans_wrapper_t *, usb_cr_t cr);
530*9430SRaymond.Chen@Sun.COM } wusb_wa_cb_t;
531*9430SRaymond.Chen@Sun.COM 
532*9430SRaymond.Chen@Sun.COM #define	WA_PIPE_CLOSED		0x00
533*9430SRaymond.Chen@Sun.COM #define	WA_PIPE_ACTIVE		0x01
534*9430SRaymond.Chen@Sun.COM #define	WA_PIPE_STOPPED		0X02
535*9430SRaymond.Chen@Sun.COM #define	WA_PIPE_CLOSING		0x03
536*9430SRaymond.Chen@Sun.COM #define	WA_PIPE_RESET		0x04
537*9430SRaymond.Chen@Sun.COM 
538*9430SRaymond.Chen@Sun.COM #define	WA_PIPES_OPENED		0x00000001
539*9430SRaymond.Chen@Sun.COM 
540*9430SRaymond.Chen@Sun.COM int	wusb_parse_wa_descr(usb_wa_descr_t *, usb_alt_if_data_t *);
541*9430SRaymond.Chen@Sun.COM void	wusb_wa_rpipes_init(wusb_wa_data_t *);
542*9430SRaymond.Chen@Sun.COM void	wusb_wa_rpipes_fini(wusb_wa_data_t *);
543*9430SRaymond.Chen@Sun.COM int	wusb_wa_data_init(dev_info_t *, wusb_wa_data_t *, wusb_wa_cb_t *,
544*9430SRaymond.Chen@Sun.COM 	usb_client_dev_data_t *, uint_t, usb_log_handle_t);
545*9430SRaymond.Chen@Sun.COM void	wusb_wa_data_fini(wusb_wa_data_t *);
546*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_rpipe_descr(dev_info_t *, usb_pipe_handle_t, uint16_t,
547*9430SRaymond.Chen@Sun.COM 	usb_wa_rpipe_descr_t *, uint_t, usb_log_handle_t);
548*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_rpipe_descrs(wusb_wa_data_t *, usb_pipe_handle_t,
549*9430SRaymond.Chen@Sun.COM 	uint_t, usb_log_handle_t);
550*9430SRaymond.Chen@Sun.COM int	wusb_get_wa_status(wusb_wa_data_t *, usb_pipe_handle_t, uint32_t *);
551*9430SRaymond.Chen@Sun.COM int	wusb_wa_reset(wusb_wa_data_t *, usb_pipe_handle_t);
552*9430SRaymond.Chen@Sun.COM int	wusb_wa_enable(wusb_wa_data_t *, usb_pipe_handle_t);
553*9430SRaymond.Chen@Sun.COM int	wusb_wa_disable(wusb_wa_data_t *, usb_pipe_handle_t);
554*9430SRaymond.Chen@Sun.COM int	wusb_wa_open_pipes(wusb_wa_data_t *);
555*9430SRaymond.Chen@Sun.COM void	wusb_wa_close_pipes(wusb_wa_data_t *);
556*9430SRaymond.Chen@Sun.COM int	wusb_wa_start_nep(wusb_wa_data_t *, usb_flags_t);
557*9430SRaymond.Chen@Sun.COM void	wusb_wa_stop_nep(wusb_wa_data_t *);
558*9430SRaymond.Chen@Sun.COM 
559*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_rpipe(wusb_wa_data_t *, usb_pipe_handle_t, uint8_t,
560*9430SRaymond.Chen@Sun.COM 	wusb_wa_rpipe_hdl_t **, uint_t, usb_log_handle_t);
561*9430SRaymond.Chen@Sun.COM int	wusb_wa_release_rpipe(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *);
562*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_ep_comp_descr(usba_pipe_handle_data_t *,
563*9430SRaymond.Chen@Sun.COM 	usb_ep_comp_descr_t *);
564*9430SRaymond.Chen@Sun.COM int	wusb_wa_set_rpipe_descr(dev_info_t *, usb_pipe_handle_t,
565*9430SRaymond.Chen@Sun.COM 	usb_wa_rpipe_descr_t *);
566*9430SRaymond.Chen@Sun.COM int	wusb_wa_set_rpipe_target(dev_info_t *, wusb_wa_data_t *,
567*9430SRaymond.Chen@Sun.COM 	usb_pipe_handle_t, usba_pipe_handle_data_t *, wusb_wa_rpipe_hdl_t *);
568*9430SRaymond.Chen@Sun.COM int	wusb_wa_rpipe_abort(dev_info_t *, usb_pipe_handle_t,
569*9430SRaymond.Chen@Sun.COM 	wusb_wa_rpipe_hdl_t *);
570*9430SRaymond.Chen@Sun.COM int	wusb_wa_rpipe_reset(dev_info_t *, usba_pipe_handle_data_t *,
571*9430SRaymond.Chen@Sun.COM 	wusb_wa_rpipe_hdl_t *, int);
572*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_rpipe_status(dev_info_t *, usb_pipe_handle_t, uint16_t,
573*9430SRaymond.Chen@Sun.COM 	uint8_t	*);
574*9430SRaymond.Chen@Sun.COM wusb_wa_trans_wrapper_t *
575*9430SRaymond.Chen@Sun.COM wusb_wa_create_ctrl_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
576*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t	*, usb_ctrl_req_t *, usb_flags_t);
577*9430SRaymond.Chen@Sun.COM wusb_wa_trans_wrapper_t *
578*9430SRaymond.Chen@Sun.COM wusb_wa_create_bulk_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
579*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t);
580*9430SRaymond.Chen@Sun.COM wusb_wa_trans_wrapper_t *
581*9430SRaymond.Chen@Sun.COM wusb_wa_create_intr_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
582*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t);
583*9430SRaymond.Chen@Sun.COM wusb_wa_trans_wrapper_t *
584*9430SRaymond.Chen@Sun.COM wusb_wa_alloc_ctrl_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
585*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t);
586*9430SRaymond.Chen@Sun.COM wusb_wa_trans_wrapper_t *
587*9430SRaymond.Chen@Sun.COM wusb_wa_alloc_bulk_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
588*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t);
589*9430SRaymond.Chen@Sun.COM wusb_wa_trans_wrapper_t *
590*9430SRaymond.Chen@Sun.COM wusb_wa_alloc_intr_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
591*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t);
592*9430SRaymond.Chen@Sun.COM 
593*9430SRaymond.Chen@Sun.COM void	wusb_wa_setup_trans_req(wusb_wa_trans_wrapper_t *, wusb_wa_seg_t *,
594*9430SRaymond.Chen@Sun.COM 	uint8_t);
595*9430SRaymond.Chen@Sun.COM int	wusb_wa_setup_segs(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
596*9430SRaymond.Chen@Sun.COM 	uint32_t, mblk_t *);
597*9430SRaymond.Chen@Sun.COM void	wusb_wa_free_segs(wusb_wa_trans_wrapper_t *);
598*9430SRaymond.Chen@Sun.COM void	wusb_wa_free_trans_wrapper(wusb_wa_trans_wrapper_t *);
599*9430SRaymond.Chen@Sun.COM 
600*9430SRaymond.Chen@Sun.COM void	wusb_wa_abort_req(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
601*9430SRaymond.Chen@Sun.COM 	uint32_t);
602*9430SRaymond.Chen@Sun.COM int	wusb_wa_wr_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
603*9430SRaymond.Chen@Sun.COM 	wusb_wa_trans_wrapper_t *, usb_flags_t);
604*9430SRaymond.Chen@Sun.COM int	wusb_wa_submit_ctrl_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
605*9430SRaymond.Chen@Sun.COM 	wusb_wa_trans_wrapper_t *, usb_ctrl_req_t *, usb_flags_t);
606*9430SRaymond.Chen@Sun.COM int	wusb_wa_ctrl_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
607*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t);
608*9430SRaymond.Chen@Sun.COM int	wusb_wa_submit_bulk_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
609*9430SRaymond.Chen@Sun.COM 	wusb_wa_trans_wrapper_t *, usb_bulk_req_t *, usb_flags_t);
610*9430SRaymond.Chen@Sun.COM int	wusb_wa_bulk_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
611*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t);
612*9430SRaymond.Chen@Sun.COM int	wusb_wa_submit_intr_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
613*9430SRaymond.Chen@Sun.COM 	wusb_wa_trans_wrapper_t *, usb_intr_req_t *, usb_flags_t);
614*9430SRaymond.Chen@Sun.COM int	wusb_wa_intr_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *,
615*9430SRaymond.Chen@Sun.COM 	usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t);
616*9430SRaymond.Chen@Sun.COM 
617*9430SRaymond.Chen@Sun.COM void	wusb_wa_start_xfer_timer(wusb_wa_rpipe_hdl_t *);
618*9430SRaymond.Chen@Sun.COM 
619*9430SRaymond.Chen@Sun.COM void	wusb_wa_xfer_timeout_handler(void *);
620*9430SRaymond.Chen@Sun.COM void	wusb_wa_stop_xfer_timer(wusb_wa_trans_wrapper_t *);
621*9430SRaymond.Chen@Sun.COM 
622*9430SRaymond.Chen@Sun.COM void	wusb_wa_clear_dev_ep(usba_pipe_handle_data_t *ph);
623*9430SRaymond.Chen@Sun.COM 
624*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_data(wusb_wa_data_t *, wusb_wa_seg_t *, uint32_t);
625*9430SRaymond.Chen@Sun.COM int	wusb_wa_get_xfer_result(wusb_wa_data_t *);
626*9430SRaymond.Chen@Sun.COM void	wusb_wa_check_req_done(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
627*9430SRaymond.Chen@Sun.COM 	uint8_t);
628*9430SRaymond.Chen@Sun.COM void	wusb_wa_handle_ctrl(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
629*9430SRaymond.Chen@Sun.COM 	usb_cr_t, uint_t);
630*9430SRaymond.Chen@Sun.COM void	wusb_wa_handle_bulk(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
631*9430SRaymond.Chen@Sun.COM 	usb_cr_t, uint_t);
632*9430SRaymond.Chen@Sun.COM void	wusb_wa_handle_intr(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *,
633*9430SRaymond.Chen@Sun.COM 	usb_cr_t, uint_t);
634*9430SRaymond.Chen@Sun.COM void	wusb_wa_callback(wusb_wa_data_t *, usba_pipe_handle_data_t *,
635*9430SRaymond.Chen@Sun.COM 	wusb_wa_trans_wrapper_t *, usb_cr_t);
636*9430SRaymond.Chen@Sun.COM usb_cr_t wusb_wa_sts2cr(uint8_t);
637*9430SRaymond.Chen@Sun.COM 
638*9430SRaymond.Chen@Sun.COM 
639*9430SRaymond.Chen@Sun.COM #ifdef __cplusplus
640*9430SRaymond.Chen@Sun.COM }
641*9430SRaymond.Chen@Sun.COM #endif
642*9430SRaymond.Chen@Sun.COM 
643*9430SRaymond.Chen@Sun.COM #endif /* _SYS_USB_WA_H */
644