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