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 2006 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 #ifndef _SYS_USB_EHCI_XFER_H
27 #define	_SYS_USB_EHCI_XFER_H
28 
29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
30 
31 #ifdef	__cplusplus
32 extern "C" {
33 #endif
34 
35 /*
36  * Enchanced Host Controller Driver (EHCI)
37  *
38  * The EHCI driver is a software driver which interfaces to the Universal
39  * Serial Bus layer (USBA) and the Host Controller (HC). The interface to
40  * the Host Controller is defined by the EHCI Host Controller Interface.
41  *
42  * This header file describes the data structures and function prototypes
43  * required for the EHCI Driver to perform different USB transfers.
44  */
45 
46 /* EHCI Queue Head (QH) related functions */
47 extern ehci_qh_t *ehci_alloc_qh(
48 				ehci_state_t		*ehcip,
49 				usba_pipe_handle_data_t	*ph,
50 				uint_t			flag);
51 extern void	ehci_insert_qh(
52 				ehci_state_t		*ehcip,
53 				usba_pipe_handle_data_t	*ph);
54 extern void	ehci_remove_qh(
55 				ehci_state_t		*ehcip,
56 				ehci_pipe_private_t	*pp,
57 				boolean_t		reclaim);
58 extern void	ehci_deallocate_qh(
59 				ehci_state_t		*ehcip,
60 				ehci_qh_t		*old_qh);
61 extern uint32_t	ehci_qh_cpu_to_iommu(
62 				ehci_state_t		*ehcip,
63 				ehci_qh_t		*addr);
64 extern ehci_qh_t *ehci_qh_iommu_to_cpu(
65 				ehci_state_t		*ehcip,
66 				uintptr_t		addr);
67 
68 /* EHCI Queue Element Transfer Descriptor (QTD) related functions */
69 extern ehci_trans_wrapper_t *ehci_allocate_ctrl_resources(
70 				ehci_state_t		*ehcip,
71 				ehci_pipe_private_t	*pp,
72 				usb_ctrl_req_t		*ctrl_reqp,
73 				usb_flags_t		usb_flags);
74 extern void	ehci_insert_ctrl_req(
75 				ehci_state_t		*ehcip,
76 				usba_pipe_handle_data_t	*ph,
77 				usb_ctrl_req_t		*ctrl_reqp,
78 				ehci_trans_wrapper_t	*tw,
79 				usb_flags_t		usb_flags);
80 extern ehci_trans_wrapper_t *ehci_allocate_bulk_resources(
81 				ehci_state_t		*ehcip,
82 				ehci_pipe_private_t	*pp,
83 				usb_bulk_req_t		*bulk_reqp,
84 				usb_flags_t		usb_flags);
85 extern void	ehci_insert_bulk_req(
86 				ehci_state_t		*ehcip,
87 				usba_pipe_handle_data_t	*ph,
88 				usb_bulk_req_t		*bulk_reqp,
89 				ehci_trans_wrapper_t	*tw,
90 				usb_flags_t		flags);
91 extern int	ehci_start_periodic_pipe_polling(
92 				ehci_state_t		*ehcip,
93 				usba_pipe_handle_data_t	*ph,
94 				usb_opaque_t		periodic_in_reqp,
95 				usb_flags_t		flags);
96 extern ehci_trans_wrapper_t *ehci_allocate_intr_resources(
97 				ehci_state_t		*ehcip,
98 				usba_pipe_handle_data_t	*ph,
99 				usb_intr_req_t		*intr_reqp,
100 				usb_flags_t		usb_flags);
101 extern void	ehci_insert_intr_req(
102 				ehci_state_t		*ehcip,
103 				ehci_pipe_private_t	*pp,
104 				ehci_trans_wrapper_t	*tw,
105 				usb_flags_t		flags);
106 extern int	ehci_stop_periodic_pipe_polling(
107 				ehci_state_t		*ehcip,
108 				usba_pipe_handle_data_t	*ph,
109 				usb_flags_t		flags);
110 extern int	ehci_insert_qtd(
111 				ehci_state_t		*ehcip,
112 				uint32_t		qtd_ctrl,
113 				size_t			qtd_dma_offs,
114 				size_t			qtd_length,
115 				uint32_t		qtd_flag,
116 				ehci_pipe_private_t	*pp,
117 				ehci_trans_wrapper_t	*tw);
118 extern void	ehci_remove_qtd_from_active_qtd_list(
119 				ehci_state_t		*ehcip,
120 				ehci_qtd_t		*curr_qtd);
121 extern void	ehci_deallocate_qtd(
122 				ehci_state_t		*ehcip,
123 				ehci_qtd_t		*old_qtd);
124 extern uint32_t	ehci_qtd_cpu_to_iommu(
125 				ehci_state_t		*ehcip,
126 				ehci_qtd_t		*addr);
127 extern ehci_qtd_t *ehci_qtd_iommu_to_cpu(
128 				ehci_state_t		*ehcip,
129 				uintptr_t		addr);
130 
131 /* Transfer Wrapper (TW) functions */
132 extern int	ehci_allocate_tds_for_tw(
133 				ehci_state_t		*ehcip,
134 				ehci_pipe_private_t	*pp,
135 				ehci_trans_wrapper_t	*tw,
136 				size_t			qtd_count);
137 extern void	ehci_stop_xfer_timer(
138 				ehci_state_t		*ehcip,
139 				ehci_trans_wrapper_t	*tw,
140 				uint_t			flag);
141 extern void	ehci_deallocate_tw(
142 				ehci_state_t		*ehcip,
143 				ehci_pipe_private_t	*pp,
144 				ehci_trans_wrapper_t	*tw);
145 extern void	ehci_free_dma_resources(
146 				ehci_state_t		*ehcip,
147 				usba_pipe_handle_data_t	*ph);
148 
149 /* Miscillaneous functions */
150 extern int	ehci_allocate_intr_in_resource(
151 				ehci_state_t		*ehcip,
152 				ehci_pipe_private_t	*pp,
153 				ehci_trans_wrapper_t	*tw,
154 				usb_flags_t		flags);
155 extern void	ehci_deallocate_intr_in_resource(
156 				ehci_state_t		*ehcip,
157 				ehci_pipe_private_t	*pp,
158 				ehci_trans_wrapper_t	*tw);
159 extern void	ehci_pipe_cleanup(
160 				ehci_state_t		*ehcip,
161 				usba_pipe_handle_data_t	*ph);
162 extern void	ehci_check_for_transfers_completion(
163 				ehci_state_t		*ehcip,
164 				ehci_pipe_private_t	*pp);
165 extern void	ehci_restore_data_toggle(
166 				ehci_state_t		*ehcip,
167 				usba_pipe_handle_data_t	*ph);
168 extern void	ehci_handle_outstanding_requests(
169 				ehci_state_t		*ehcip,
170 				ehci_pipe_private_t	*pp);
171 extern void	ehci_do_client_periodic_in_req_callback(
172 				ehci_state_t		*ehcip,
173 				ehci_pipe_private_t	*pp,
174 				usb_cr_t		completion_reason);
175 extern void	ehci_hcdi_callback(
176 				usba_pipe_handle_data_t	*ph,
177 				ehci_trans_wrapper_t	*tw,
178 				usb_cr_t		completion_reason);
179 extern void	ehci_handle_clear_tt_buffer(
180 				ehci_state_t		*ehcip,
181 				ehci_pipe_private_t	*pp,
182 				ehci_trans_wrapper_t	*tw,
183 				ehci_qtd_t		*qtd,
184 				void			*);
185 extern void	ehci_handle_clear_tt_buffer_error(
186 				ehci_state_t		*ehcip,
187 				ehci_pipe_private_t	*hub_pp,
188 				ehci_trans_wrapper_t	*tw,
189 				ehci_qtd_t		*qtd,
190 				void			*,
191 				usb_cr_t		error);
192 #ifdef __cplusplus
193 }
194 #endif
195 
196 #endif /* _SYS_USB_EHCI_XFER_H */
197