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

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

Refactoring uhci_ functions are called on uhci_t not device_t

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