/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _SYS_USB_WA_H #define _SYS_USB_WA_H #ifdef __cplusplus extern "C" { #endif #include #include #include /* Wire adapter class extension for descriptors */ typedef struct usb_wa_descr { uint8_t bLength; uint8_t bDescriptorType; uint16_t bcdWAVersion; uint8_t bNumPorts; uint8_t bmAttributes; uint16_t wNumRPipes; uint16_t wRPipeMaxBlock; uint8_t bRPipeBlockSize; uint8_t bPwrOn2PwrGood; uint8_t bNumMMCIEs; uint8_t DeviceRemovable; } usb_wa_descr_t; typedef struct usb_wa_rpipe_descr { uint8_t bLength; uint8_t bDescriptorType; uint16_t wRPipeIndex; uint16_t wRequests; uint16_t wBlocks; uint16_t wMaxPacketSize; union { struct { uint8_t bHSHubAddress; uint8_t bHSHubPort; } dwa_value; struct { uint8_t bMaxBurst; uint8_t bDeviceInfoIndex; } hwa_value; } wa_value; uint8_t bSpeed; uint8_t bDeviceAddress; uint8_t bEndpointAddress; uint8_t bDataSequence; uint32_t dwCurrentWindow; uint8_t bMaxDataSequence; uint8_t bInterval; uint8_t bOverTheAirInterval; uint8_t bmAttribute; uint8_t bmCharacteristics; uint8_t bmRetryOptions; uint16_t wNumTransactionErrors; } usb_wa_rpipe_descr_t; /* Rpipe bmCharacteristics mask and bits */ #define USB_RPIPE_CHA_MASK 0x0f #define USB_RPIPE_CHA_CTRL 0x01 #define USB_RRIPE_CHA_ISOC 0x02 #define USB_RRIPE_CHA_BULK 0x04 #define USB_RPIPE_CHA_INTR 0x08 /* * ************************************************************ * Wire adapter class request related structures and data types * ************************************************************ */ /* Wire adapter class specific requests */ #define WA_REQ_ABORT_RPIPE 0x0e #define WA_REQ_RESET_RPIPE 0x0f /* HWA specific requests as host controller, T8-50 */ #define HWA_REQ_ADD_MMC_IE 0x14 #define HWA_REQ_REMOVE_MMC_IE 0x15 #define HWA_REQ_SET_NUM_DNTS 0x16 #define HWA_REQ_SET_CLUSTER_ID 0x17 #define HWA_REQ_SET_DEVICE_INFO 0x18 #define HWA_REQ_GET_TIME 0x19 #define HWA_REQ_SET_STREAM_IDX 0x1a #define HWA_REQ_SET_WUSB_MAS 0x1b #define HWA_REQ_CH_STOP 0x1c /* DWA specific requests */ #define DWA_REQ_SET_EP_ATTRIB 0x1e /* wLength for wire adapter class requests */ #define WA_GET_RPIPE_STATUS_LEN 1 #define WA_GET_WA_STATUS_LEN 4 /* wLength for HWA specific requests */ #define WUSB_SET_DEV_INFO_LEN 36 #define WUSB_SET_WUSB_MAS_LEN 32 /* wLength for DWA specific requests */ #define DWA_GET_STATUS_LEN 4 #define DWA_ISOC_EP_ATTRIB_LEN 6 /* Wire adapter class feature selector */ #define WA_DEV_ENABLE 1 #define WA_DEV_RESET 2 #define WA_RPIPE_PAUSE 1 #define WA_RPIPE_STALL 2 /* Rpipe status bits */ #define WA_RPIPE_IDLE 0x01 #define WA_PRIPE_PAUSED 0x02 #define WA_RPIPE_CONFIGURED 0x04 #define WA_RPIPE_STALLED 0x08 /* Wire adapter status bits */ #define WA_HC_ENABLED 0x00000001 #define WA_HC_RESET_IN_PROGRESS 0x00000002 /* HWA specific definitions */ #define WUSB_CLASS_IF_REQ_IN_TYPE (USB_DEV_REQ_DEV_TO_HOST \ |USB_DEV_REQ_TYPE_CLASS \ |USB_DEV_REQ_RCPT_IF) #define WUSB_CLASS_IF_REQ_OUT_TYPE (USB_DEV_REQ_HOST_TO_DEV \ |USB_DEV_REQ_TYPE_CLASS \ |USB_DEV_REQ_RCPT_IF) #define WA_CLASS_RPIPE_REQ_IN_TYPE (USB_DEV_REQ_DEV_TO_HOST \ |USB_DEV_REQ_TYPE_CLASS \ |USB_DEV_REQ_RCPT_RPIPE) #define WA_CLASS_RPIPE_REQ_OUT_TYPE (USB_DEV_REQ_HOST_TO_DEV \ |USB_DEV_REQ_TYPE_CLASS \ |USB_DEV_REQ_RCPT_RPIPE) #define HWA_TIME_ADJ 0 #define HWA_TIME_BPST 1 #define HWA_TIME_WUSB 2 typedef struct hwa_dev_info { uint8_t bmDeviceAvailablilityInfo[32]; uint8_t bDeviceAddress; uint8_t wPHYRates[2]; uint8_t bmDeviceAttribute; } hwa_dev_info_t; /* DWA specific definitions */ typedef struct dwa_isoc_ep_attrib { uint16_t wMaxStreamDelay; uint16_t wOverTheAirPacketSize; uint16_t wReserved; } dwa_isoc_ep_attrib_t; /* * ***************************************************************** * Wire adapter class notification related structures and data types * ***************************************************************** */ /* Wire adapter class specific notification */ #define WA_NOTIF_TYPE_TRANSFER 0x93 typedef struct wa_notif_header { uint8_t bLength; uint8_t bNotifyType; } wa_notif_header_t; typedef struct wa_notif_transfer { uint8_t bLength; uint8_t bNotifyType; uint8_t bEndpoint; uint8_t bReserved; } wa_notif_transfer_t; /* HWA specific notifications */ #define HWA_NOTIF_TYPE_BPST_ADJ 0x94 #define HWA_NOTIF_TYPE_DN_RECEIVED 0x95 typedef struct hwa_notif_bpst_adj { uint8_t bLength; uint8_t bNotifyType; uint8_t bAdjustment; } hwa_notif_bpst_adj_t; typedef struct hwa_notif_dn_recvd { uint8_t bLength; uint8_t bNotifyType; uint8_t bSourceDeviceAddr; uint8_t bmAttributes; uint8_t notifdata[1]; /* variable length raw data */ } hwa_notif_dn_recvd_t; /* DWA specific notifications */ #define DWA_NOTIF_TYPE_RWAKE 0x91 #define DWA_NOTIF_TYPE_PORTSTATUS 0x92 typedef struct dwa_notif_rwake { uint8_t bLength; uint8_t bNotifyType; } dwa_notif_rwake; typedef struct dwa_notif_portstatus { uint8_t bLength; uint8_t bNotifyType; uint8_t bPortIndex; } dwa_notif_portstatus; /* * ********************************************************************* * Wire adapter class transfer request related structures and data types * ********************************************************************* */ /* Wire adapter class transfer requests */ #define WA_XFER_REQ_TYPE_CTRL 0x80 #define WA_XFER_REQ_TYPE_BULK_INTR 0x81 #define WA_XFER_REQ_TYPE_ABORT 0x84 /* HWA specific transfer request */ #define HWA_XFER_REQ_TYPE_ISOC 0x82 /* Wire adapter class transfer request length */ #define WA_CTRL_REQ_LEN 0x18 #define WA_BULK_INTR_REQ_LEN 0x10 #define WA_ABORT_REQ_LEN 0x08 /* HWA specific transfer request length */ #define HWA_ISOC_REQ_LEN 0x14 typedef struct wa_ctrl_req { uint8_t bLength; uint8_t bRequestType; uint16_t wRPipe; uint32_t dwTransferID; uint32_t dwTransferLength; uint8_t bTransferSegment; uint8_t bmAttribute; uint16_t wReserved; uint8_t baSetupData[8]; } wa_ctrl_req_t; /* ctrl request bmAttribute */ #define WA_CTRL_DIR_MASK 0x01 #define WA_CTRL_DIR_IN 0x01 #define WA_CTRL_DIR_OUT 0x00 /* ctrl request bmAttribute valid only for HWA */ #define WA_CTRL_SECRT_MASK 0x02 #define WA_CTRL_SECRT_REGULAR 0x00 #define WA_CTRL_SECRT_NONE 0x02 typedef struct wa_bulk_intr_req { uint8_t bLength; uint8_t bRequestType; uint16_t wRPipe; uint32_t dwTransferID; uint32_t dwTransferLength; uint8_t bTransferSegment; uint8_t bReserved; uint16_t wReserved; } wa_bulk_intr_req_t; typedef struct wa_abort_req { uint8_t bLength; uint8_t bRequestType; uint16_t wRPipe; uint32_t dwTransferID; } wa_abort_req_t; /* HWA specific transfer request definitions */ typedef struct hwa_isoc_req { uint8_t bLength; uint8_t bRequestType; uint16_t wRPipe; uint32_t dwTransferID; uint32_t dwTransferLength; uint8_t bTransferSegment; uint8_t bReserved; uint16_t wPresentationTime; uint32_t dwNumOfPackets; } wa_isoc_req_t; typedef struct hwa_isoc_pkt { uint16_t wLength; uint8_t bPacketType; uint8_t bReserved; uint16_t PacketLength[1]; /* variable length array */ } hwa_isoc_pkt_t; #define HWA_ISOC_PKT_INFO_TYPE 0xa0 /* Wire adapter class transfer result */ typedef struct wa_xfer_result { uint8_t bLength; uint8_t bResultType; uint32_t dwTransferID; uint32_t dwTransferLength; uint8_t bTransferSegment; uint8_t bTransferStatus; uint32_t dwNumOfPackets; } wa_xfer_result_t; #define WA_RESULT_TYPE_TRANSFER 0x83 #define WA_XFER_RESULT_LEN 0x10 enum wa_xfer_status { WA_STS_SUCCESS = 0, WA_STS_HALTED = 1, WA_STS_DATA_BUFFER_ERROR = 2, WA_STS_BABBLE = 3, WA_STS_NOT_FOUND = 5, WA_STS_INSUFFICIENT_RESOURCE = 6, WA_STS_TRANSACTION_ERROR = 7, WA_STS_ABORTED = 8, WA_STS_RPIPE_NOT_READY = 9, WA_STS_INVALID_REQ_FORMAT = 10, WA_STS_UNEXPECTED_SEGMENT_NUM = 11, WA_STS_RPIPE_TYPE_MISMATCH = 12, WA_STS_PACKET_DISCARDED = 13, } wa_xfer_status_t; #define WA_RPIPE_STATE_FREE 0 /* not assigned */ #define WA_RPIPE_STATE_IDLE 1 /* configured but not active */ #define WA_RPIPE_STATE_ACTIVE 2 /* configured and active */ #define WA_RPIPE_STATE_PAUSE 3 /* configured and paused */ #define WA_RPIPE_STATE_ERROR 4 /* error */ #define WA_RPIPE_DEFAULT_TIMEOUT 5 #define WA_MAX_SEG_COUNT 128 /* 7bit */ #define WA_DIR_IN 1 #define WA_DIR_OUT 0 #define WA_GET_ID(x) id32_alloc((void *)(x), KM_NOSLEEP) #define WA_LOOKUP_ID(x) id32_lookup((x)) #define WA_FREE_ID(x) id32_free((x)) typedef struct wusb_wa_seg { void *seg_wr; /* wrapper */ uint8_t seg_num; uint32_t seg_id; /* will delete */ uint32_t seg_len; uint32_t seg_actual_len; uint8_t seg_status; /* WA result status */ uint8_t seg_state; /* segment state */ uint8_t seg_done; usb_bulk_req_t *seg_trans_reqp; /* for transfer reqp */ uint8_t seg_trans_req_state; /* state:submitted */ kcondvar_t seg_trans_cv; usb_bulk_req_t *seg_data_reqp; /* for out data */ uint8_t seg_data_req_state; /* state */ kcondvar_t seg_data_cv; } wusb_wa_seg_t; _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_seg_t::seg_wr wusb_wa_seg_t::seg_num wusb_wa_seg_t::seg_id wusb_wa_seg_t::seg_len wusb_wa_seg_t::seg_trans_reqp wusb_wa_seg_t::seg_data_reqp)) struct wusb_wa_trans_wrapper; typedef struct wusb_wa_rpipe_hdl { uint_t rp_state; /* free, idle, active, pause, err */ kmutex_t rp_mutex; kcondvar_t rp_cv; uint_t rp_refcnt; /* for multiplexing */ timeout_id_t rp_timer_id; usb_wa_rpipe_descr_t rp_descr; uint8_t rp_block_chg; /* wBlocks changed? */ uint16_t rp_avail_reqs; /* available req slots */ void *rp_curr_wr; /* current wr */ struct wusb_wa_trans_wrapper *rp_timeout_list; /* timeout list */ } wusb_wa_rpipe_hdl_t; _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_rpipe_hdl_t)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_rpipe_hdl_t::rp_descr)) typedef struct wusb_wa_data { dev_info_t *wa_dip; void *wa_private_data; kmutex_t wa_mutex; uint8_t wa_ifno; usb_if_descr_t wa_if_descr; usb_wa_descr_t wa_descr; uint16_t wa_avail_blocks; /* available blocks */ usb_ep_descr_t wa_intr_ept; usb_ep_descr_t wa_bulkin_ept; usb_ep_descr_t wa_bulkout_ept; uint_t wa_state; usb_pipe_policy_t wa_pipe_policy; usb_pipe_handle_t wa_default_pipe; /* INTR IN ep */ usb_pipe_handle_t wa_intr_ph; usb_pipe_policy_t wa_intr_pipe_policy; uint_t wa_intr_pipe_state; /* BULK IN ep */ usb_pipe_handle_t wa_bulkin_ph; usb_pipe_policy_t wa_bulkin_pipe_policy; uint_t wa_bulkin_pipe_state; /* BULK OUT ep */ usb_pipe_handle_t wa_bulkout_ph; usb_pipe_policy_t wa_bulkout_pipe_policy; uint_t wa_bulkout_pipe_state; uint16_t wa_num_rpipes; wusb_wa_rpipe_hdl_t *wa_rpipe_hdl; int (*pipe_periodic_req)(struct wusb_wa_data *, usba_pipe_handle_data_t *); void (*intr_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req); void (*intr_exc_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req); void (*rpipe_xfer_cb)(dev_info_t *dip, usba_pipe_handle_data_t *ph, struct wusb_wa_trans_wrapper *, usb_cr_t cr); } wusb_wa_data_t; _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_data_t::wa_mutex, wusb_wa_data_t)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_dip)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_default_pipe)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_bulkout_ph)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_bulkin_ph)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_intr_ph)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::wa_ifno wusb_wa_data_t::wa_descr wusb_wa_data_t::wa_private_data)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::rpipe_xfer_cb)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_data_t::pipe_periodic_req)) typedef enum { WR_NO_ERROR = 0, WR_SEG_REQ_ERR = 1, /* send seg request error */ WR_SEG_DAT_ERR = 2, /* send seg data error */ WR_XFER_ERR = 3, /* general xfer error */ WR_ABORTED = 4, /* aborted */ WR_TIMEOUT = 5, /* timeout */ WR_INTERRUPTED = 6, /* user interrupted */ WR_FINISHED = 7, /* finished successfully */ } wusb_wa_wr_state_t; typedef struct wusb_wa_trans_wrapper { usba_pipe_handle_data_t *wr_ph; wusb_wa_rpipe_hdl_t *wr_rp; wusb_wa_data_t *wr_wa_data; kcondvar_t wr_cv; /* cv, use Rpipe's mutex to protect */ usb_flags_t wr_flags; uint8_t wr_type; /* transfer type */ uint8_t wr_nsegs; /* number of segs */ uint32_t wr_max_seglen; /* max data len per seg */ uint8_t wr_dir; /* transfer direction */ uint32_t wr_id; /* unique id */ usb_opaque_t wr_reqp; /* original reqp */ int wr_timeout; wusb_wa_seg_t *wr_seg_array; uint8_t wr_curr_seg; /* next seg to process */ wusb_wa_wr_state_t wr_state; /* 1 - error, not continue */ uint8_t wr_has_aborted; /* boolean */ uint8_t wr_seg_done; /* number of segs done */ void (*wr_cb)(wusb_wa_data_t *wa_data, struct wusb_wa_trans_wrapper *wr, usb_cr_t cr, uint_t reset_flag); /* callback func */ struct wusb_wa_trans_wrapper *wr_timeout_next; /* timeout list */ } wusb_wa_trans_wrapper_t; _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_trans_wrapper_t)) _NOTE(MUTEX_PROTECTS_DATA(wusb_wa_rpipe_hdl_t::rp_mutex, wusb_wa_seg_t)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_rp)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_ph)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_cb)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_reqp wusb_wa_trans_wrapper_t::wr_dir wusb_wa_trans_wrapper_t::wr_nsegs wusb_wa_trans_wrapper_t::wr_seg_array wusb_wa_trans_wrapper_t::wr_id)) _NOTE(DATA_READABLE_WITHOUT_LOCK(wusb_wa_trans_wrapper_t::wr_wa_data)) typedef struct wusb_secrt_data { usb_security_descr_t secrt_descr; uint_t secrt_n_encry; usb_encryption_descr_t *secrt_encry_descr; } wusb_secrt_data_t; typedef struct wusb_wa_cb { int (*pipe_periodic_req)(wusb_wa_data_t *, usba_pipe_handle_data_t *); void (*intr_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req); void (*intr_exc_cb)(usb_pipe_handle_t ph, struct usb_intr_req *req); void (*rpipe_xfer_cb)(dev_info_t *dip, usba_pipe_handle_data_t *ph, wusb_wa_trans_wrapper_t *, usb_cr_t cr); } wusb_wa_cb_t; #define WA_PIPE_CLOSED 0x00 #define WA_PIPE_ACTIVE 0x01 #define WA_PIPE_STOPPED 0X02 #define WA_PIPE_CLOSING 0x03 #define WA_PIPE_RESET 0x04 #define WA_PIPES_OPENED 0x00000001 int wusb_parse_wa_descr(usb_wa_descr_t *, usb_alt_if_data_t *); void wusb_wa_rpipes_init(wusb_wa_data_t *); void wusb_wa_rpipes_fini(wusb_wa_data_t *); int wusb_wa_data_init(dev_info_t *, wusb_wa_data_t *, wusb_wa_cb_t *, usb_client_dev_data_t *, uint_t, usb_log_handle_t); void wusb_wa_data_fini(wusb_wa_data_t *); int wusb_wa_get_rpipe_descr(dev_info_t *, usb_pipe_handle_t, uint16_t, usb_wa_rpipe_descr_t *, uint_t, usb_log_handle_t); int wusb_wa_get_rpipe_descrs(wusb_wa_data_t *, usb_pipe_handle_t, uint_t, usb_log_handle_t); int wusb_get_wa_status(wusb_wa_data_t *, usb_pipe_handle_t, uint32_t *); int wusb_wa_reset(wusb_wa_data_t *, usb_pipe_handle_t); int wusb_wa_enable(wusb_wa_data_t *, usb_pipe_handle_t); int wusb_wa_disable(wusb_wa_data_t *, usb_pipe_handle_t); int wusb_wa_open_pipes(wusb_wa_data_t *); void wusb_wa_close_pipes(wusb_wa_data_t *); int wusb_wa_start_nep(wusb_wa_data_t *, usb_flags_t); void wusb_wa_stop_nep(wusb_wa_data_t *); int wusb_wa_get_rpipe(wusb_wa_data_t *, usb_pipe_handle_t, uint8_t, wusb_wa_rpipe_hdl_t **, uint_t, usb_log_handle_t); int wusb_wa_release_rpipe(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *); int wusb_wa_get_ep_comp_descr(usba_pipe_handle_data_t *, usb_ep_comp_descr_t *); int wusb_wa_set_rpipe_descr(dev_info_t *, usb_pipe_handle_t, usb_wa_rpipe_descr_t *); int wusb_wa_set_rpipe_target(dev_info_t *, wusb_wa_data_t *, usb_pipe_handle_t, usba_pipe_handle_data_t *, wusb_wa_rpipe_hdl_t *); int wusb_wa_rpipe_abort(dev_info_t *, usb_pipe_handle_t, wusb_wa_rpipe_hdl_t *); int wusb_wa_rpipe_reset(dev_info_t *, usba_pipe_handle_data_t *, wusb_wa_rpipe_hdl_t *, int); int wusb_wa_get_rpipe_status(dev_info_t *, usb_pipe_handle_t, uint16_t, uint8_t *); wusb_wa_trans_wrapper_t * wusb_wa_create_ctrl_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t); wusb_wa_trans_wrapper_t * wusb_wa_create_bulk_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t); wusb_wa_trans_wrapper_t * wusb_wa_create_intr_wrapper(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t); wusb_wa_trans_wrapper_t * wusb_wa_alloc_ctrl_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t); wusb_wa_trans_wrapper_t * wusb_wa_alloc_bulk_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t); wusb_wa_trans_wrapper_t * wusb_wa_alloc_intr_resources(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t); void wusb_wa_setup_trans_req(wusb_wa_trans_wrapper_t *, wusb_wa_seg_t *, uint8_t); int wusb_wa_setup_segs(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *, uint32_t, mblk_t *); void wusb_wa_free_segs(wusb_wa_trans_wrapper_t *); void wusb_wa_free_trans_wrapper(wusb_wa_trans_wrapper_t *); void wusb_wa_abort_req(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *, uint32_t); int wusb_wa_wr_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, wusb_wa_trans_wrapper_t *, usb_flags_t); int wusb_wa_submit_ctrl_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, wusb_wa_trans_wrapper_t *, usb_ctrl_req_t *, usb_flags_t); int wusb_wa_ctrl_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_ctrl_req_t *, usb_flags_t); int wusb_wa_submit_bulk_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, wusb_wa_trans_wrapper_t *, usb_bulk_req_t *, usb_flags_t); int wusb_wa_bulk_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_bulk_req_t *, usb_flags_t); int wusb_wa_submit_intr_wr(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, wusb_wa_trans_wrapper_t *, usb_intr_req_t *, usb_flags_t); int wusb_wa_intr_xfer(wusb_wa_data_t *, wusb_wa_rpipe_hdl_t *, usba_pipe_handle_data_t *, usb_intr_req_t *, usb_flags_t); void wusb_wa_start_xfer_timer(wusb_wa_rpipe_hdl_t *); void wusb_wa_xfer_timeout_handler(void *); void wusb_wa_stop_xfer_timer(wusb_wa_trans_wrapper_t *); void wusb_wa_clear_dev_ep(usba_pipe_handle_data_t *ph); int wusb_wa_get_data(wusb_wa_data_t *, wusb_wa_seg_t *, uint32_t); int wusb_wa_get_xfer_result(wusb_wa_data_t *); void wusb_wa_check_req_done(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *, uint8_t); void wusb_wa_handle_ctrl(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *, usb_cr_t, uint_t); void wusb_wa_handle_bulk(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *, usb_cr_t, uint_t); void wusb_wa_handle_intr(wusb_wa_data_t *, wusb_wa_trans_wrapper_t *, usb_cr_t, uint_t); void wusb_wa_callback(wusb_wa_data_t *, usba_pipe_handle_data_t *, wusb_wa_trans_wrapper_t *, usb_cr_t); usb_cr_t wusb_wa_sts2cr(uint8_t); #ifdef __cplusplus } #endif #endif /* _SYS_USB_WA_H */