Annotation of sys/dev/usb/ehcivar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: ehcivar.h,v 1.13 2007/06/12 16:26:36 mbalmer Exp $ */
2: /* $NetBSD: ehcivar.h,v 1.19 2005/04/29 15:04:29 augustss Exp $ */
3:
4: /*
5: * Copyright (c) 2001 The NetBSD Foundation, Inc.
6: * All rights reserved.
7: *
8: * This code is derived from software contributed to The NetBSD Foundation
9: * by Lennart Augustsson (lennart@augustsson.net).
10: *
11: * Redistribution and use in source and binary forms, with or without
12: * modification, are permitted provided that the following conditions
13: * are met:
14: * 1. Redistributions of source code must retain the above copyright
15: * notice, this list of conditions and the following disclaimer.
16: * 2. Redistributions in binary form must reproduce the above copyright
17: * notice, this list of conditions and the following disclaimer in the
18: * documentation and/or other materials provided with the distribution.
19: * 3. All advertising materials mentioning features or use of this software
20: * must display the following acknowledgement:
21: * This product includes software developed by the NetBSD
22: * Foundation, Inc. and its contributors.
23: * 4. Neither the name of The NetBSD Foundation nor the names of its
24: * contributors may be used to endorse or promote products derived
25: * from this software without specific prior written permission.
26: *
27: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37: * POSSIBILITY OF SUCH DAMAGE.
38: */
39:
40: typedef struct ehci_soft_qtd {
41: ehci_qtd_t qtd;
42: struct ehci_soft_qtd *nextqtd; /* mirrors nextqtd in TD */
43: ehci_physaddr_t physaddr;
44: usbd_xfer_handle xfer;
45: LIST_ENTRY(ehci_soft_qtd) hnext;
46: u_int16_t len;
47: } ehci_soft_qtd_t;
48: #define EHCI_SQTD_SIZE ((sizeof (struct ehci_soft_qtd) + EHCI_QTD_ALIGN - 1) / EHCI_QTD_ALIGN * EHCI_QTD_ALIGN)
49: #define EHCI_SQTD_CHUNK (EHCI_PAGE_SIZE / EHCI_SQTD_SIZE)
50:
51: typedef struct ehci_soft_qh {
52: ehci_qh_t qh;
53: struct ehci_soft_qh *next;
54: struct ehci_soft_qh *prev;
55: struct ehci_soft_qtd *sqtd;
56: ehci_physaddr_t physaddr;
57: int islot;
58: } ehci_soft_qh_t;
59: #define EHCI_SQH_SIZE ((sizeof (struct ehci_soft_qh) + EHCI_QH_ALIGN - 1) / EHCI_QH_ALIGN * EHCI_QH_ALIGN)
60: #define EHCI_SQH_CHUNK (EHCI_PAGE_SIZE / EHCI_SQH_SIZE)
61:
62: struct ehci_xfer {
63: struct usbd_xfer xfer;
64: struct usb_task abort_task;
65: LIST_ENTRY(ehci_xfer) inext; /* list of active xfers */
66: ehci_soft_qtd_t *sqtdstart;
67: ehci_soft_qtd_t *sqtdend;
68: u_int32_t ehci_xfer_flags;
69: #ifdef DIAGNOSTIC
70: int isdone;
71: #endif
72: };
73: #define EHCI_XFER_ABORTING 0x0001 /* xfer is aborting. */
74: #define EHCI_XFER_ABORTWAIT 0x0002 /* abort completion is being awaited. */
75:
76: #define EXFER(xfer) ((struct ehci_xfer *)(xfer))
77:
78: /* Information about an entry in the interrupt list. */
79: struct ehci_soft_islot {
80: ehci_soft_qh_t *sqh; /* Queue Head. */
81: };
82:
83: #define EHCI_FRAMELIST_MAXCOUNT 1024
84: #define EHCI_IPOLLRATES 8 /* Poll rates (1ms, 2, 4, 8 .. 128) */
85: #define EHCI_INTRQHS ((1 << EHCI_IPOLLRATES) - 1)
86: #define EHCI_IQHIDX(lev, pos) \
87: ((((pos) & ((1 << (lev)) - 1)) | (1 << (lev))) - 1)
88: #define EHCI_ILEV_IVAL(lev) (1 << (lev))
89:
90:
91: #define EHCI_HASH_SIZE 128
92: #define EHCI_COMPANION_MAX 8
93:
94: typedef struct ehci_softc {
95: struct usbd_bus sc_bus; /* base device */
96: bus_space_tag_t iot;
97: bus_space_handle_t ioh;
98: bus_size_t sc_size;
99: u_int sc_offs; /* offset to operational regs */
100: int sc_flags; /* misc flags */
101: #define EHCIF_DROPPED_INTR_WORKAROUND 0x01
102:
103: char sc_vendor[16]; /* vendor string for root hub */
104: int sc_id_vendor; /* vendor ID for root hub */
105:
106: u_int32_t sc_cmd; /* shadow of cmd reg during suspend */
107: void *sc_powerhook; /* cookie from power hook */
108: void *sc_shutdownhook; /* cookie from shutdown hook */
109:
110: usb_dma_t sc_fldma;
111: ehci_link_t *sc_flist;
112: u_int sc_flsize;
113: u_int sc_rand; /* XXX need proper intr scheduling */
114:
115: struct ehci_soft_islot sc_islots[EHCI_INTRQHS];
116:
117: LIST_HEAD(, ehci_xfer) sc_intrhead;
118:
119: ehci_soft_qh_t *sc_freeqhs;
120: ehci_soft_qtd_t *sc_freeqtds;
121:
122: int sc_noport;
123: u_int8_t sc_addr; /* device address */
124: u_int8_t sc_conf; /* device configuration */
125: usbd_xfer_handle sc_intrxfer;
126: char sc_isreset;
127: char sc_softwake;
128:
129: u_int32_t sc_eintrs;
130: ehci_soft_qh_t *sc_async_head;
131:
132: SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */
133:
134: struct rwlock sc_doorbell_lock;
135:
136: struct timeout sc_tmo_pcd;
137: struct timeout sc_tmo_intrlist;
138:
139: struct device *sc_child; /* /dev/usb# device */
140:
141: char sc_dying;
142: } ehci_softc_t;
143:
144: #define EREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (a))
145: #define EREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (a))
146: #define EREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (a))
147: #define EWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (a), (x))
148: #define EWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (a), (x))
149: #define EWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (a), (x))
150: #define EOREAD1(sc, a) bus_space_read_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
151: #define EOREAD2(sc, a) bus_space_read_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
152: #define EOREAD4(sc, a) bus_space_read_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a))
153: #define EOWRITE1(sc, a, x) bus_space_write_1((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
154: #define EOWRITE2(sc, a, x) bus_space_write_2((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
155: #define EOWRITE4(sc, a, x) bus_space_write_4((sc)->iot, (sc)->ioh, (sc)->sc_offs+(a), (x))
156:
157: usbd_status ehci_init(ehci_softc_t *);
158: int ehci_intr(void *);
159: int ehci_detach(ehci_softc_t *, int);
160: int ehci_activate(struct device *, enum devact);
161: void ehci_shutdown(void *);
CVSweb