source: mainline/uspace/drv/bus/usb/xhci/hc.h@ 9848c77

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 9848c77 was 708d8fcd, checked in by Ondřej Hlavatý <aearsis@…>, 8 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: 3.8 KB
Line 
1/*
2 * Copyright (c) 2017 Ondrej Hlavaty
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 drvusbxhci
30 * @{
31 */
32/** @file
33 * @brief The host controller data bookkeeping.
34 */
35
36#ifndef XHCI_HC_H
37#define XHCI_HC_H
38
39#include <fibril_synch.h>
40#include <usb/host/usb_transfer_batch.h>
41#include "hw_struct/regs.h"
42#include "hw_struct/context.h"
43#include "scratchpad.h"
44#include "trb_ring.h"
45
46#include "rh.h"
47#include "commands.h"
48#include "bus.h"
49
50typedef struct xhci_command xhci_cmd_t;
51
52typedef struct xhci_hc {
53 /** Common HC device header */
54 hc_device_t base;
55
56 /* MMIO range */
57 addr_range_t mmio_range;
58
59 /* Mapped register sets */
60 void *reg_base;
61 xhci_cap_regs_t *cap_regs;
62 xhci_op_regs_t *op_regs;
63 xhci_rt_regs_t *rt_regs;
64 xhci_doorbell_t *db_arry;
65 xhci_extcap_t *xecp; /**< First extended capability */
66 xhci_legsup_t *legsup; /**< Legacy support capability */
67
68 /* Structures in allocated memory */
69 xhci_event_ring_t event_ring;
70 uint64_t *dcbaa;
71 dma_buffer_t dcbaa_dma;
72 dma_buffer_t scratchpad_array;
73
74 /* Command ring management */
75 xhci_cmd_ring_t cr;
76
77 /* Root hub emulation */
78 xhci_rh_t rh;
79
80 /* Bus bookkeeping */
81 xhci_bus_t bus;
82
83 /* Cached capabilities */
84 unsigned max_slots;
85 bool ac64;
86 unsigned ist; /**< IST in microframes */
87
88 /** Port speed mapping */
89 xhci_port_speed_t speeds [16];
90 uint8_t speed_to_psiv [USB_SPEED_MAX];
91} xhci_hc_t;
92
93static inline xhci_hc_t *bus_to_hc(bus_t *bus)
94{
95 assert(bus);
96 return member_to_inst(bus, xhci_hc_t, bus);
97}
98
99typedef struct xhci_endpoint xhci_endpoint_t;
100typedef struct xhci_device xhci_device_t;
101
102int hc_init_mmio(xhci_hc_t *, const hw_res_list_parsed_t *);
103int hc_init_memory(xhci_hc_t *, ddf_dev_t *);
104int hc_claim(xhci_hc_t *, ddf_dev_t *);
105int hc_irq_code_gen(irq_code_t *, xhci_hc_t *, const hw_res_list_parsed_t *);
106int hc_start(xhci_hc_t *, bool);
107void hc_fini(xhci_hc_t *);
108void hc_ring_doorbell(xhci_hc_t *, unsigned, unsigned);
109int hc_enable_slot(xhci_hc_t *, uint32_t *);
110int hc_disable_slot(xhci_hc_t *, xhci_device_t *);
111int hc_address_device(xhci_hc_t *, xhci_device_t *, xhci_endpoint_t *);
112int hc_configure_device(xhci_hc_t *, uint32_t);
113int hc_deconfigure_device(xhci_hc_t *, uint32_t);
114int hc_add_endpoint(xhci_hc_t *, uint32_t, uint8_t, xhci_ep_ctx_t *);
115int hc_drop_endpoint(xhci_hc_t *, uint32_t, uint8_t);
116int hc_update_endpoint(xhci_hc_t *, uint32_t, uint8_t, xhci_ep_ctx_t *);
117
118int hc_status(bus_t *, uint32_t *);
119void hc_interrupt(bus_t *, uint32_t);
120
121#endif
122
123/**
124 * @}
125 */
Note: See TracBrowser for help on using the repository browser.