source: mainline/uspace/lib/drv/include/usbhc_iface.h@ 708d8fcd

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

xhci: rewritten isochronous transfers

There was a fundamental problem with relying on hardware to send
RING_OVERRUN/UNDERRUN events, which QEMU (and possibly others) do not
send. That resulted in not knowing if the transfer is still on schedule,
and having to ring the doorbell every time. That is not feasible,
because then the transfer can be more frequent than it should be.
Furthermore, it ignored the fact that isochronous TRBs are to be
scheduled not too late, but also not too soon (see 4.11.2.5 of the xHCI
spec).

Now, scheduling the TRBs to hardware is called feeding, and can be
delayed by setting a timer. Ring overruns/underruns are detected also at
the end of handling an event.

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*
2 * Copyright (c) 2010 Vojtech Horky
3 * Copyright (c) 2017 Ondrej Hlavaty
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup libdrv
31 * @addtogroup usb
32 * @{
33 */
34/** @file
35 * @brief USB host controler interface definition. This is the interface of
36 * USB host controller function, which can be used by usb device drivers.
37 */
38
39#ifndef LIBDRV_USBHC_IFACE_H_
40#define LIBDRV_USBHC_IFACE_H_
41
42#include "ddf/driver.h"
43#include "usb_iface.h"
44#include <async.h>
45
46typedef struct usb_pipe_desc {
47 /** Endpoint number. */
48 usb_endpoint_t endpoint_no;
49
50 /** Endpoint transfer type. */
51 usb_transfer_type_t transfer_type;
52
53 /** Endpoint direction. */
54 usb_direction_t direction;
55
56 /** Maximum size of one transfer */
57 size_t max_transfer_size;
58} usb_pipe_desc_t;
59
60/** This structure follows standard endpoint descriptor + superspeed companion
61 * descriptor, and exists to avoid dependency of libdrv on libusb. Keep the
62 * internal fields named exactly like their source (because we want to use the
63 * same macros to access them).
64 * Callers shall fill it with bare contents of respective descriptors (in usb endianity).
65 */
66typedef struct usb_endpoint_descriptors {
67 struct {
68 uint8_t endpoint_address;
69 uint8_t attributes;
70 uint16_t max_packet_size;
71 uint8_t poll_interval;
72 } endpoint;
73
74 /* Superspeed companion descriptor */
75 struct companion_desc_t {
76 uint8_t max_burst;
77 uint8_t attributes;
78 uint16_t bytes_per_interval;
79 } companion;
80} usb_endpoint_descriptors_t;
81
82extern int usbhc_reserve_default_address(async_exch_t *, usb_speed_t);
83extern int usbhc_release_default_address(async_exch_t *);
84
85extern int usbhc_device_enumerate(async_exch_t *, unsigned port);
86extern int usbhc_device_remove(async_exch_t *, unsigned port);
87
88extern int usbhc_register_endpoint(async_exch_t *, usb_pipe_desc_t *, const usb_endpoint_descriptors_t *);
89extern int usbhc_unregister_endpoint(async_exch_t *, const usb_pipe_desc_t *);
90
91extern int usbhc_read(async_exch_t *, usb_endpoint_t, uint64_t, void *, size_t,
92 size_t *);
93extern int usbhc_write(async_exch_t *, usb_endpoint_t, uint64_t, const void *,
94 size_t);
95
96/** Callback for outgoing transfer */
97typedef int (*usbhc_iface_transfer_callback_t)(void *, int, size_t);
98
99/** USB device communication interface. */
100typedef struct {
101 int (*reserve_default_address)(ddf_fun_t *, usb_speed_t);
102 int (*release_default_address)(ddf_fun_t *);
103
104 int (*device_enumerate)(ddf_fun_t *, unsigned);
105 int (*device_remove)(ddf_fun_t *, unsigned);
106
107 int (*register_endpoint)(ddf_fun_t *, usb_pipe_desc_t *, const usb_endpoint_descriptors_t *);
108 int (*unregister_endpoint)(ddf_fun_t *, const usb_pipe_desc_t *);
109
110 int (*read)(ddf_fun_t *, usb_target_t,
111 uint64_t, char *, size_t,
112 usbhc_iface_transfer_callback_t, void *);
113 int (*write)(ddf_fun_t *, usb_target_t,
114 uint64_t, const char *, size_t,
115 usbhc_iface_transfer_callback_t, void *);
116} usbhc_iface_t;
117
118#endif
119/**
120 * @}
121 */
Note: See TracBrowser for help on using the repository browser.