source: mainline/uspace/drv/bus/usb/uhci/uhci_batch.h@ 0892663a

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

usbhost: device removal and off/onlining moved into the library

Also, it is just not possible to make generic transfer abortion. So the
current semantics of endpoint unregistering is also aborting the pending
transfer. As it is not yet implemented in XHCI, and the stub in UHCI is
missing the magic, it breaks offlining interrupt devices, such as mouse.

When finishing this commit, I came across the fact we need some more
synchronization above device. Guard can protect internal structures, but
it cannot synchronize multiple calls to offline, or offline & removal
between each other - they both need to allow driver to unregister
endpoints, and as such must release the guard.

  • Property mode set to 100644
File size: 3.9 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
29/** @addtogroup drvusbuhcihc
30 * @{
31 */
32/** @file
33 * @brief UHCI driver USB tranfer helper functions
34 */
35
36#ifndef DRV_UHCI_BATCH_H
37#define DRV_UHCI_BATCH_H
38
39#include <adt/list.h>
40#include <assert.h>
41#include <errno.h>
42#include <stdbool.h>
43#include <stddef.h>
44#include <usb/host/usb_transfer_batch.h>
45#include <usb/host/endpoint.h>
46
47#include "hw_struct/queue_head.h"
48#include "hw_struct/transfer_descriptor.h"
49
50/** UHCI specific data required for USB transfer */
51typedef struct uhci_transfer_batch {
52 usb_transfer_batch_t base;
53
54 /** Queue head
55 * This QH is used to maintain UHCI schedule structure and the element
56 * pointer points to the first TD of this batch.
57 */
58 qh_t *qh;
59 /** List of TDs needed for the transfer */
60 td_t *tds;
61 /** Number of TDs used by the transfer */
62 size_t td_count;
63 /** Data buffer, must be accessible by the UHCI hw */
64 void *device_buffer;
65 /** List element */
66 link_t link;
67} uhci_transfer_batch_t;
68
69uhci_transfer_batch_t * uhci_transfer_batch_create(endpoint_t *);
70int uhci_transfer_batch_prepare(uhci_transfer_batch_t *);
71bool uhci_transfer_batch_check_completed(uhci_transfer_batch_t *);
72void uhci_transfer_batch_abort(uhci_transfer_batch_t *);
73void uhci_transfer_batch_destroy(uhci_transfer_batch_t *);
74
75/** Get offset to setup buffer accessible to the HC hw.
76 * @param uhci_batch UHCI batch structure.
77 * @return Pointer to the setup buffer.
78 */
79static inline void * uhci_transfer_batch_setup_buffer(
80 const uhci_transfer_batch_t *uhci_batch)
81{
82 assert(uhci_batch);
83 assert(uhci_batch->device_buffer);
84 return uhci_batch->device_buffer + sizeof(qh_t) +
85 uhci_batch->td_count * sizeof(td_t);
86}
87
88/** Get offset to data buffer accessible to the HC hw.
89 * @param uhci_batch UHCI batch structure.
90 * @return Pointer to the data buffer.
91 */
92static inline void * uhci_transfer_batch_data_buffer(
93 const uhci_transfer_batch_t *uhci_batch)
94{
95 assert(uhci_batch);
96 return uhci_transfer_batch_setup_buffer(uhci_batch) +
97 (uhci_batch->base.ep->transfer_type == USB_TRANSFER_CONTROL ? USB_SETUP_PACKET_SIZE : 0);
98}
99
100/** Linked list conversion wrapper.
101 * @param l Linked list link.
102 * @return Pointer to the uhci batch structure.
103 */
104static inline uhci_transfer_batch_t *uhci_transfer_batch_from_link(link_t *l)
105{
106 assert(l);
107 return list_get_instance(l, uhci_transfer_batch_t, link);
108}
109
110static inline uhci_transfer_batch_t *uhci_transfer_batch_get(usb_transfer_batch_t *b)
111{
112 assert(b);
113 return (uhci_transfer_batch_t *) b;
114}
115
116#endif
117
118/**
119 * @}
120 */
Note: See TracBrowser for help on using the repository browser.