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