source: mainline/uspace/drv/bus/usb/xhci/rh.h@ 5d25984

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

xhci: defer roothub events processing

There are two new generic mechanisms, which are used in only one
instance.

First one is a simple wrapper for roothub event handlers that should run
in separate fibril. The usage can be seen at line 337, for example. The
mechanism just passes arguments to a newly created fibril.

The second is a bit more complex, and its purpose is to broadcast roothub
events to all fibrils that could wait for it. It's used to wait for port
reset complete at USB 2 ports. See rh_port_reset_sync.

Sorry for naming both mechanisms "rh_event", which could create
a confusion.

  • Property mode set to 100644
File size: 3.0 KB
Line 
1/*
2 * Copyright (c) 2017 Michal Staruch
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 roothub structures abstraction.
34 */
35
36#ifndef XHCI_RH_H
37#define XHCI_RH_H
38
39#include <usb/host/usb_transfer_batch.h>
40#include <usb/host/bus.h>
41
42#include "hw_struct/regs.h"
43#include "endpoint.h"
44
45typedef struct xhci_hc xhci_hc_t;
46typedef struct ddf_dev ddf_dev_t;
47
48/**
49 * xHCI lets the controller define speeds of ports it controls.
50 */
51typedef struct xhci_port_speed {
52 char name [4];
53 uint8_t major, minor;
54 uint64_t rx_bps, tx_bps;
55 usb_speed_t usb_speed;
56} xhci_port_speed_t;
57
58typedef struct hcd_roothub hcd_roothub_t;
59typedef struct xhci_bus xhci_bus_t;
60
61/* XHCI root hub instance */
62typedef struct {
63 /** Host controller */
64 xhci_hc_t *hc;
65
66 /* Root for the device tree */
67 xhci_device_t device;
68
69 /** Interrupt transfer waiting for an actual interrupt to occur */
70 usb_transfer_batch_t *unfinished_interrupt_transfer;
71
72 /* Number of hub ports. */
73 uint8_t max_ports;
74
75 /* Device pointers connected to RH ports or NULL. (size is `max_ports`) */
76 xhci_device_t **devices_by_port;
77
78 /* Roothub events. */
79 fibril_mutex_t event_guard;
80 fibril_condvar_t event_ready, event_handled;
81 unsigned event_readers_waiting, event_readers_to_go;
82 struct {
83 uint8_t port_id;
84 uint32_t events;
85 } event;
86} xhci_rh_t;
87
88int xhci_rh_init(xhci_rh_t *, xhci_hc_t *);
89int xhci_rh_fini(xhci_rh_t *);
90const xhci_port_speed_t *xhci_rh_get_port_speed(xhci_rh_t *, uint8_t);
91
92int xhci_rh_handle_port_status_change_event(xhci_hc_t *, xhci_trb_t *);
93void xhci_rh_handle_port_change(xhci_rh_t *);
94
95int xhci_rh_address_device(xhci_rh_t *rh, device_t *dev, xhci_bus_t *bus);
96
97#endif
98
99/**
100 * @}
101 */
Note: See TracBrowser for help on using the repository browser.