source: mainline/uspace/lib/usbhost/src/usb_transfer_batch.c@ 766043c

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 766043c was 5fd9c30, checked in by Ondřej Hlavatý <aearsis@…>, 8 years ago

usbhost refactoring: let transfer_batch be initialized by bus

Currently makes older HCs fail, work in progress.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2 * Copyright (c) 2011 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 libusbhost
29 * @{
30 */
31/** @file
32 * USB transfer transaction structures (implementation).
33 */
34
35#include <usb/host/usb_transfer_batch.h>
36#include <usb/host/endpoint.h>
37#include <usb/host/bus.h>
38#include <usb/debug.h>
39
40#include <assert.h>
41#include <errno.h>
42
43
44/** Create a batch on given endpoint.
45 */
46usb_transfer_batch_t *usb_transfer_batch_create(endpoint_t *ep)
47{
48 assert(ep);
49 assert(ep->bus);
50
51 usb_transfer_batch_t *batch;
52 if (ep->bus->ops.create_batch)
53 batch = ep->bus->ops.create_batch(ep->bus, ep);
54 else
55 batch = malloc(sizeof(usb_transfer_batch_t));
56
57 return batch;
58}
59
60/** Initialize given batch structure.
61 */
62void usb_transfer_batch_init(usb_transfer_batch_t *batch, endpoint_t *ep)
63{
64 memset(batch, 0, sizeof(*batch));
65
66 batch->ep = ep;
67
68 endpoint_use(ep);
69}
70
71/** Call the handler of the batch.
72 *
73 * @param[in] batch Batch structure to use.
74 */
75static int batch_complete(usb_transfer_batch_t *batch)
76{
77 assert(batch);
78
79 usb_log_debug2("Batch %p " USB_TRANSFER_BATCH_FMT " completed.\n",
80 batch, USB_TRANSFER_BATCH_ARGS(*batch));
81
82 if (batch->error == EOK && batch->toggle_reset_mode != RESET_NONE) {
83 usb_log_debug2("Reseting %s due to transaction of %d:%d.\n",
84 batch->toggle_reset_mode == RESET_ALL ? "all EPs toggle" : "EP toggle",
85 batch->ep->target.address, batch->ep->target.endpoint);
86 bus_reset_toggle(batch->ep->bus,
87 batch->ep->target, batch->toggle_reset_mode == RESET_ALL);
88 }
89
90 return batch->on_complete
91 ? batch->on_complete(batch)
92 : EOK;
93}
94
95/** Destroy the batch.
96 *
97 * @param[in] batch Batch structure to use.
98 */
99void usb_transfer_batch_destroy(usb_transfer_batch_t *batch)
100{
101 assert(batch);
102 assert(batch->ep);
103 assert(batch->ep->bus);
104
105 usb_log_debug2("batch %p " USB_TRANSFER_BATCH_FMT " disposing.\n",
106 batch, USB_TRANSFER_BATCH_ARGS(*batch));
107
108 bus_t *bus = batch->ep->bus;
109 if (bus->ops.destroy_batch)
110 bus->ops.destroy_batch(batch);
111 else
112 free(batch);
113
114 endpoint_release(batch->ep);
115}
116
117/** Finish a transfer batch: call handler, destroy batch, release endpoint.
118 *
119 * Call only after the batch have been scheduled && completed!
120 *
121 * @param[in] batch Batch structure to use.
122 */
123void usb_transfer_batch_finish(usb_transfer_batch_t *batch)
124{
125 if (!batch_complete(batch))
126 usb_log_warning("failed to complete batch %p!", batch);
127
128 usb_transfer_batch_destroy(batch);
129}
130
131
132struct old_handler_wrapper_data {
133 usbhc_iface_transfer_in_callback_t in_callback;
134 usbhc_iface_transfer_out_callback_t out_callback;
135 void *arg;
136};
137
138static int old_handler_wrapper(usb_transfer_batch_t *batch)
139{
140 struct old_handler_wrapper_data *data = batch->on_complete_data;
141
142 assert(data);
143
144 if (data->out_callback)
145 data->out_callback(batch->error, data->arg);
146
147 if (data->in_callback)
148 data->in_callback(batch->error, batch->transfered_size, data->arg);
149
150 free(data);
151 return EOK;
152}
153
154void usb_transfer_batch_set_old_handlers(usb_transfer_batch_t *batch,
155 usbhc_iface_transfer_in_callback_t in_callback,
156 usbhc_iface_transfer_out_callback_t out_callback,
157 void *arg)
158{
159 struct old_handler_wrapper_data *data = malloc(sizeof(*data));
160
161 data->in_callback = in_callback;
162 data->out_callback = out_callback;
163 data->arg = arg;
164
165 batch->on_complete = old_handler_wrapper;
166 batch->on_complete_data = data;
167}
168/**
169 * @}
170 */
Note: See TracBrowser for help on using the repository browser.