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