source: mainline/uspace/drv/uhci-hcd/iface.c@ 30a4301

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 30a4301 was ec59693, checked in by Vojtech Horky <vojtechhorky@…>, 14 years ago

USB HC interface has max packet size

Currently, it is only a hack to extend the interface as the values
are hard coded inside the remote part of the interface.

Sending of real values will be added once the old drivers API is
completely removed (no sense in changing the same thing twice).

  • Property mode set to 100644
File size: 9.5 KB
Line 
1/*
2 * Copyright (c) 2011 Vojtech Horky, Jan Vesely
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28/** @addtogroup usb
29 * @{
30 */
31/** @file
32 * @brief UHCI driver
33 */
34#include <driver.h>
35#include <remote_usbhc.h>
36
37#include <usb/debug.h>
38
39#include <errno.h>
40
41#include "iface.h"
42#include "uhci.h"
43
44static int get_address(device_t *dev, devman_handle_t handle,
45 usb_address_t *address)
46{
47 assert(dev);
48 uhci_t *hc = dev_to_uhci(dev);
49 assert(hc);
50 *address = usb_address_keeping_find(&hc->address_manager, handle);
51 if (*address <= 0)
52 return *address;
53 return EOK;
54}
55/*----------------------------------------------------------------------------*/
56static int reserve_default_address(device_t *dev)
57{
58 assert(dev);
59 uhci_t *hc = dev_to_uhci(dev);
60 assert(hc);
61 usb_address_keeping_reserve_default(&hc->address_manager);
62 return EOK;
63}
64/*----------------------------------------------------------------------------*/
65static int release_default_address(device_t *dev)
66{
67 assert(dev);
68 uhci_t *hc = dev_to_uhci(dev);
69 assert(hc);
70 usb_address_keeping_release_default(&hc->address_manager);
71 return EOK;
72}
73/*----------------------------------------------------------------------------*/
74static int request_address(device_t *dev, usb_address_t *address)
75{
76 assert(dev);
77 uhci_t *hc = dev_to_uhci(dev);
78 assert(hc);
79 *address = usb_address_keeping_request(&hc->address_manager);
80 if (*address <= 0)
81 return *address;
82 return EOK;
83}
84/*----------------------------------------------------------------------------*/
85static int bind_address(
86 device_t *dev, usb_address_t address, devman_handle_t handle)
87{
88 assert(dev);
89 uhci_t *hc = dev_to_uhci(dev);
90 assert(hc);
91 usb_address_keeping_devman_bind(&hc->address_manager, address, handle);
92 return EOK;
93}
94/*----------------------------------------------------------------------------*/
95static int release_address(device_t *dev, usb_address_t address)
96{
97 assert(dev);
98 uhci_t *hc = dev_to_uhci(dev);
99 assert(hc);
100 usb_address_keeping_release_default(&hc->address_manager);
101 return EOK;
102}
103/*----------------------------------------------------------------------------*/
104static int interrupt_out(device_t *dev, usb_target_t target,
105 size_t max_packet_size,
106 void *data, size_t size,
107 usbhc_iface_transfer_out_callback_t callback, void *arg)
108{
109 dev_speed_t speed = FULL_SPEED;
110
111 batch_t *batch = batch_get(dev, target, USB_TRANSFER_INTERRUPT,
112 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg);
113 if (!batch)
114 return ENOMEM;
115 batch_interrupt_out(batch);
116 return EOK;
117}
118/*----------------------------------------------------------------------------*/
119static int interrupt_in(device_t *dev, usb_target_t target,
120 size_t max_packet_size,
121 void *data, size_t size,
122 usbhc_iface_transfer_in_callback_t callback, void *arg)
123{
124 dev_speed_t speed = FULL_SPEED;
125
126 batch_t *batch = batch_get(dev, target, USB_TRANSFER_INTERRUPT,
127 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg);
128 if (!batch)
129 return ENOMEM;
130 batch_interrupt_in(batch);
131 return EOK;
132}
133/*----------------------------------------------------------------------------*/
134static int control_write(device_t *dev, usb_target_t target,
135 size_t max_packet_size,
136 void *setup_data, size_t setup_size, void *data, size_t size,
137 usbhc_iface_transfer_out_callback_t callback, void *arg)
138{
139 dev_speed_t speed = FULL_SPEED;
140
141 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
142 max_packet_size, speed, data, size, setup_data, setup_size,
143 NULL, callback, arg);
144 if (!batch)
145 return ENOMEM;
146 batch_control_write(batch);
147 return EOK;
148}
149/*----------------------------------------------------------------------------*/
150static int control_read(device_t *dev, usb_target_t target,
151 size_t max_packet_size,
152 void *setup_data, size_t setup_size, void *data, size_t size,
153 usbhc_iface_transfer_in_callback_t callback, void *arg)
154{
155 dev_speed_t speed = FULL_SPEED;
156
157 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
158 max_packet_size, speed, data, size, setup_data, setup_size, callback,
159 NULL, arg);
160 if (!batch)
161 return ENOMEM;
162 batch_control_read(batch);
163 return EOK;
164}
165/*----------------------------------------------------------------------------*/
166static int control_write_setup(device_t *dev, usb_target_t target,
167 size_t max_packet_size,
168 void *data, size_t size,
169 usbhc_iface_transfer_out_callback_t callback, void *arg)
170{
171 dev_speed_t speed = FULL_SPEED;
172
173 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
174 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
175 max_packet_size, speed, NULL, 0, data, size, NULL, callback, arg);
176 if (!batch)
177 return ENOMEM;
178 batch_control_setup_old(batch);
179 return EOK;
180}
181/*----------------------------------------------------------------------------*/
182static int control_write_data(device_t *dev, usb_target_t target,
183 size_t max_packet_size,
184 void *data, size_t size,
185 usbhc_iface_transfer_out_callback_t callback, void *arg)
186{
187 dev_speed_t speed = FULL_SPEED;
188
189 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
190 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
191 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg);
192 if (!batch)
193 return ENOMEM;
194 batch_control_write_data_old(batch);
195 return EOK;
196}
197/*----------------------------------------------------------------------------*/
198static int control_write_status(device_t *dev, usb_target_t target,
199 usbhc_iface_transfer_in_callback_t callback, void *arg)
200{
201 size_t max_packet_size = 8;
202 dev_speed_t speed = FULL_SPEED;
203
204 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
205 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
206 max_packet_size, speed, NULL, 0, NULL, 0, callback, NULL, arg);
207 if (!batch)
208 return ENOMEM;
209 batch_control_write_status_old(batch);
210 return EOK;
211}
212/*----------------------------------------------------------------------------*/
213static int control_read_setup(device_t *dev, usb_target_t target,
214 size_t max_packet_size,
215 void *data, size_t size,
216 usbhc_iface_transfer_out_callback_t callback, void *arg)
217{
218 dev_speed_t speed = FULL_SPEED;
219
220 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
221 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
222 max_packet_size, speed, NULL, 0, data, size, NULL, callback, arg);
223 if (!batch)
224 return ENOMEM;
225 batch_control_setup_old(batch);
226 return EOK;
227}
228/*----------------------------------------------------------------------------*/
229static int control_read_data(device_t *dev, usb_target_t target,
230 size_t max_packet_size,
231 void *data, size_t size,
232 usbhc_iface_transfer_in_callback_t callback, void *arg)
233{
234 dev_speed_t speed = FULL_SPEED;
235
236 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
237 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
238 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg);
239 if (!batch)
240 return ENOMEM;
241 batch_control_read_data_old(batch);
242 return EOK;
243}
244/*----------------------------------------------------------------------------*/
245static int control_read_status(device_t *dev, usb_target_t target,
246 usbhc_iface_transfer_out_callback_t callback, void *arg)
247{
248 size_t max_packet_size = 8;
249 dev_speed_t speed = FULL_SPEED;
250
251 usb_log_warning("Using deprecated API %s.\n", __FUNCTION__);
252 batch_t *batch = batch_get(dev, target, USB_TRANSFER_CONTROL,
253 max_packet_size, speed, NULL, 0, NULL, 0, NULL, callback, arg);
254 if (!batch)
255 return ENOMEM;
256 batch_control_read_status_old(batch);
257 return EOK;
258}
259/*----------------------------------------------------------------------------*/
260usbhc_iface_t uhci_iface = {
261 .tell_address = get_address,
262
263 .reserve_default_address = reserve_default_address,
264 .release_default_address = release_default_address,
265 .request_address = request_address,
266 .bind_address = bind_address,
267 .release_address = release_address,
268
269 .interrupt_out = interrupt_out,
270 .interrupt_in = interrupt_in,
271
272 .control_read = control_read,
273 .control_write = control_write,
274
275 .control_write_setup = control_write_setup,
276 .control_write_data = control_write_data,
277 .control_write_status = control_write_status,
278
279 .control_read_setup = control_read_setup,
280 .control_read_data = control_read_data,
281 .control_read_status = control_read_status
282};
283/**
284 * @}
285 */
Note: See TracBrowser for help on using the repository browser.