source: mainline/uspace/drv/uhci/iface.c@ 67a1b78

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 67a1b78 was 67a1b78, checked in by Jan Vesely <jano.vesely@…>, 14 years ago

Dropped usage od hcdhubd.h

Fixed parameter order in callback_in

  • Property mode set to 100644
File size: 6.5 KB
Line 
1/*
2 * Copyright (c) 2010 Vojtech Horky
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#include <driver.h>
29#include <remote_usbhc.h>
30#include <errno.h>
31
32#include "iface.h"
33#include "uhci.h"
34
35static int get_address(device_t *dev, devman_handle_t handle,
36 usb_address_t *address)
37{
38 assert(dev);
39 uhci_t *hc = (uhci_t *)dev->driver_data;
40 assert(hc);
41 *address = usb_address_keeping_find(&hc->address_manager, handle);
42 if (*address <= 0)
43 return *address;
44 return EOK;
45}
46/*----------------------------------------------------------------------------*/
47static int reserve_default_address(device_t *dev)
48{
49 assert(dev);
50 uhci_t *hc = (uhci_t *)dev->driver_data;
51 assert(hc);
52 usb_address_keeping_reserve_default(&hc->address_manager);
53 return EOK;
54}
55/*----------------------------------------------------------------------------*/
56static int release_default_address(device_t *dev)
57{
58 assert(dev);
59 uhci_t *hc = (uhci_t *)dev->driver_data;
60 assert(hc);
61 usb_address_keeping_release_default(&hc->address_manager);
62 return EOK;
63}
64/*----------------------------------------------------------------------------*/
65static int request_address(device_t *dev, usb_address_t *address)
66{
67 assert(dev);
68 uhci_t *hc = (uhci_t *)dev->driver_data;
69 assert(hc);
70 *address = usb_address_keeping_request(&hc->address_manager);
71 if (*address <= 0)
72 return *address;
73 return EOK;
74}
75/*----------------------------------------------------------------------------*/
76static int bind_address(
77 device_t *dev, usb_address_t address, devman_handle_t handle)
78{
79 assert(dev);
80 uhci_t *hc = (uhci_t *)dev->driver_data;
81 assert(hc);
82 usb_address_keeping_devman_bind(&hc->address_manager, address, handle);
83 return EOK;
84}
85/*----------------------------------------------------------------------------*/
86static int release_address(device_t *dev, usb_address_t address)
87{
88 assert(dev);
89 uhci_t *hc = (uhci_t *)dev->driver_data;
90 assert(hc);
91 usb_address_keeping_release_default(&hc->address_manager);
92 return EOK;
93}
94/*----------------------------------------------------------------------------*/
95static int interrupt_out(device_t *dev, usb_target_t target,
96 void *data, size_t size,
97 usbhc_iface_transfer_out_callback_t callback, void *arg)
98{
99 return uhci_transfer(dev, target, USB_TRANSFER_INTERRUPT, 0, USB_PID_OUT,
100 data, size, callback, NULL, arg);
101}
102/*----------------------------------------------------------------------------*/
103static int interrupt_in(device_t *dev, usb_target_t target,
104 void *data, size_t size,
105 usbhc_iface_transfer_in_callback_t callback, void *arg)
106{
107 return uhci_transfer(dev, target, USB_TRANSFER_INTERRUPT, 0, USB_PID_IN,
108 data, size, NULL, callback, arg);
109}
110/*----------------------------------------------------------------------------*/
111static int control_write_setup(device_t *dev, usb_target_t target,
112 void *data, size_t size,
113 usbhc_iface_transfer_out_callback_t callback, void *arg)
114{
115 return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_SETUP,
116 data, size, callback, NULL, arg);
117}
118/*----------------------------------------------------------------------------*/
119static int control_write_data(device_t *dev, usb_target_t target,
120 void *data, size_t size,
121 usbhc_iface_transfer_out_callback_t callback, void *arg)
122{
123 return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 1, USB_PID_OUT,
124 data, size, callback, NULL, arg);
125}
126/*----------------------------------------------------------------------------*/
127static int control_write_status(device_t *dev, usb_target_t target,
128 usbhc_iface_transfer_in_callback_t callback, void *arg)
129{
130 return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_IN,
131 NULL, 0, NULL, callback, arg);
132}
133/*----------------------------------------------------------------------------*/
134static int control_read_setup(device_t *dev, usb_target_t target,
135 void *data, size_t size,
136 usbhc_iface_transfer_out_callback_t callback, void *arg)
137{
138 return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_SETUP,
139 data, size, callback, NULL, arg);
140}
141/*----------------------------------------------------------------------------*/
142static int control_read_data(device_t *dev, usb_target_t target,
143 void *data, size_t size,
144 usbhc_iface_transfer_in_callback_t callback, void *arg)
145{
146 return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 1, USB_PID_IN,
147 data, size, NULL, callback, arg);
148}
149/*----------------------------------------------------------------------------*/
150static int control_read_status(device_t *dev, usb_target_t target,
151 usbhc_iface_transfer_out_callback_t callback, void *arg)
152{
153 return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_OUT,
154 NULL, 0, callback, NULL, arg);
155}
156
157
158usbhc_iface_t uhci_iface = {
159 .tell_address = get_address,
160
161 .reserve_default_address = reserve_default_address,
162 .release_default_address = release_default_address,
163 .request_address = request_address,
164 .bind_address = bind_address,
165 .release_address = release_address,
166
167 .interrupt_out = interrupt_out,
168 .interrupt_in = interrupt_in,
169
170 .control_write_setup = control_write_setup,
171 .control_write_data = control_write_data,
172 .control_write_status = control_write_status,
173
174 .control_read_setup = control_read_setup,
175 .control_read_data = control_read_data,
176 .control_read_status = control_read_status
177};
Note: See TracBrowser for help on using the repository browser.