source: mainline/uspace/drv/bus/usb/uhci/hc.h@ ee0ffa6

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

usb2_bus: no longer be a bus

As the number of implemented functions got to 3, it's not so beneficial
to inherit usb2 bus to get the functionality. Overall, four trampolines
needed to be added, which is an acceptable number.

Now, the usb2_bus has become a usb2_bus_helper, to be used as
a companion to the common bus.

This is mostly a preparation to remove the runtime binding of the bus
methods.

  • Property mode set to 100644
File size: 4.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 host controller driver structure
34 */
35
36#ifndef DRV_UHCI_HC_H
37#define DRV_UHCI_HC_H
38
39#include <device/hw_res_parsed.h>
40#include <fibril.h>
41#include <macros.h>
42#include <stdbool.h>
43#include <ddi.h>
44#include <usb/host/hcd.h>
45#include <usb/host/usb2_bus.h>
46#include <usb/host/usb_transfer_batch.h>
47
48#include "uhci_rh.h"
49#include "transfer_list.h"
50#include "hw_struct/link_pointer.h"
51
52/** UHCI I/O registers layout */
53typedef struct uhci_regs {
54 /** Command register, controls HC behaviour */
55 ioport16_t usbcmd;
56#define UHCI_CMD_MAX_PACKET (1 << 7)
57#define UHCI_CMD_CONFIGURE (1 << 6)
58#define UHCI_CMD_DEBUG (1 << 5)
59#define UHCI_CMD_FORCE_GLOBAL_RESUME (1 << 4)
60#define UHCI_CMD_FORCE_GLOBAL_SUSPEND (1 << 3)
61#define UHCI_CMD_GLOBAL_RESET (1 << 2)
62#define UHCI_CMD_HCRESET (1 << 1)
63#define UHCI_CMD_RUN_STOP (1 << 0)
64
65 /** Status register, 1 means interrupt is asserted (if enabled) */
66 ioport16_t usbsts;
67#define UHCI_STATUS_HALTED (1 << 5)
68#define UHCI_STATUS_PROCESS_ERROR (1 << 4)
69#define UHCI_STATUS_SYSTEM_ERROR (1 << 3)
70#define UHCI_STATUS_RESUME (1 << 2)
71#define UHCI_STATUS_ERROR_INTERRUPT (1 << 1)
72#define UHCI_STATUS_INTERRUPT (1 << 0)
73#define UHCI_STATUS_NM_INTERRUPTS \
74 (UHCI_STATUS_PROCESS_ERROR | UHCI_STATUS_SYSTEM_ERROR)
75
76 /** Interrupt enabled registers */
77 ioport16_t usbintr;
78#define UHCI_INTR_SHORT_PACKET (1 << 3)
79#define UHCI_INTR_COMPLETE (1 << 2)
80#define UHCI_INTR_RESUME (1 << 1)
81#define UHCI_INTR_CRC (1 << 0)
82
83 /** Register stores frame number used in SOF packet */
84 ioport16_t frnum;
85
86 /** Pointer(physical) to the Frame List */
87 ioport32_t flbaseadd;
88
89 /** SOF modification to match external timers */
90 ioport8_t sofmod;
91
92 PADD8[3];
93 ioport16_t ports[];
94} uhci_regs_t;
95
96#define UHCI_FRAME_LIST_COUNT 1024
97#define UHCI_DEBUGER_TIMEOUT 5000000
98#define UHCI_ALLOWED_HW_FAIL 5
99
100/** Main UHCI driver structure */
101typedef struct hc {
102 /* Common hc_device header */
103 hc_device_t base;
104
105 uhci_rh_t rh;
106 bus_t bus;
107 usb2_bus_helper_t bus_helper;
108
109 /** Addresses of I/O registers */
110 uhci_regs_t *registers;
111
112 /** Frame List contains 1024 link pointers */
113 link_pointer_t *frame_list;
114
115 /** List and queue of interrupt transfers */
116 transfer_list_t transfers_interrupt;
117 /** List and queue of low speed control transfers */
118 transfer_list_t transfers_control_slow;
119 /** List and queue of full speed bulk transfers */
120 transfer_list_t transfers_bulk_full;
121 /** List and queue of full speed control transfers */
122 transfer_list_t transfers_control_full;
123
124 /** Pointer table to the above lists, helps during scheduling */
125 transfer_list_t *transfers[2][4];
126
127 /**
128 * Guard for the pending list. Can be locked under EP guard, but not
129 * vice versa.
130 */
131 fibril_mutex_t guard;
132 /** List of endpoints with a transfer scheduled */
133 list_t pending_endpoints;
134
135 /** Number of hw failures detected. */
136 unsigned hw_failures;
137} hc_t;
138
139typedef struct uhci_endpoint {
140 endpoint_t base;
141
142 bool toggle;
143} uhci_endpoint_t;
144
145static inline hc_t *hcd_to_hc(hc_device_t *hcd)
146{
147 assert(hcd);
148 return (hc_t *) hcd;
149}
150
151static inline hc_t *bus_to_hc(bus_t *bus)
152{
153 assert(bus);
154 return member_to_inst(bus, hc_t, bus);
155}
156
157int hc_unschedule_batch(usb_transfer_batch_t *);
158
159extern int hc_add(hc_device_t *, const hw_res_list_parsed_t *);
160extern int hc_gen_irq_code(irq_code_t *, hc_device_t *, const hw_res_list_parsed_t *);
161extern int hc_start(hc_device_t *);
162extern int hc_setup_roothub(hc_device_t *);
163extern int hc_gone(hc_device_t *);
164
165#endif
166
167/**
168 * @}
169 */
Note: See TracBrowser for help on using the repository browser.