source: mainline/uspace/drv/bus/usb/xhci/hc.h@ 49e62998

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

xhci: do not rely on internal fibril quirks

Previousy, we abused the fact new fibrils are spawned for handling
notifications, so we could afford blocking the event handler. We were
told this is a subject to change and we should stop doing it.

This commit removes the abuse, but newly requires event handlers not to
block waiting for another event (e.g. commands do wait for events). To
quickly detect this situation, deadlock detection was added.

This commit breaks current functionality. Our current job is to identify
processes which do block and have them moved to separate fibril / spawn
fibril for the process alone.

  • Property mode set to 100644
File size: 4.0 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 /* Fibril that is currently hanling events */
84 fid_t event_handler;
85
86 /* Cached capabilities */
87 unsigned max_slots;
88 bool ac64;
89 uint32_t wrap_count; /** Amount of mfindex wraps HC has done */
90 unsigned ist; /**< IST in microframes */
91
92 /** Port speed mapping */
93 xhci_port_speed_t speeds [16];
94 uint8_t speed_to_psiv [USB_SPEED_MAX];
95} xhci_hc_t;
96
97static inline xhci_hc_t *bus_to_hc(bus_t *bus)
98{
99 assert(bus);
100 return member_to_inst(bus, xhci_hc_t, bus);
101}
102
103typedef struct xhci_endpoint xhci_endpoint_t;
104typedef struct xhci_device xhci_device_t;
105
106int hc_init_mmio(xhci_hc_t *, const hw_res_list_parsed_t *);
107int hc_init_memory(xhci_hc_t *, ddf_dev_t *);
108int hc_claim(xhci_hc_t *, ddf_dev_t *);
109int hc_irq_code_gen(irq_code_t *, xhci_hc_t *, const hw_res_list_parsed_t *);
110int hc_start(xhci_hc_t *, bool);
111void hc_fini(xhci_hc_t *);
112void hc_ring_doorbell(xhci_hc_t *, unsigned, unsigned);
113int hc_enable_slot(xhci_hc_t *, uint32_t *);
114int hc_disable_slot(xhci_hc_t *, xhci_device_t *);
115int hc_address_device(xhci_hc_t *, xhci_device_t *, xhci_endpoint_t *);
116int hc_configure_device(xhci_hc_t *, uint32_t);
117int hc_deconfigure_device(xhci_hc_t *, uint32_t);
118int hc_add_endpoint(xhci_hc_t *, uint32_t, uint8_t, xhci_ep_ctx_t *);
119int hc_drop_endpoint(xhci_hc_t *, uint32_t, uint8_t);
120int hc_update_endpoint(xhci_hc_t *, uint32_t, uint8_t, xhci_ep_ctx_t *);
121int hc_stop_endpoint(xhci_hc_t *, uint32_t , uint8_t);
122
123int hc_status(bus_t *, uint32_t *);
124void hc_interrupt(bus_t *, uint32_t);
125
126#endif
127
128/**
129 * @}
130 */
Note: See TracBrowser for help on using the repository browser.