Annotation of sys/dev/usb/uhcivar.h, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: uhcivar.h,v 1.19 2007/06/15 11:41:48 mbalmer Exp $ */
2: /* $NetBSD: uhcivar.h,v 1.36 2002/12/31 00:39:11 augustss Exp $ */
3: /* $FreeBSD: src/sys/dev/usb/uhcivar.h,v 1.14 1999/11/17 22:33:42 n_hibma Exp $ */
4:
5: /*
6: * Copyright (c) 1998 The NetBSD Foundation, Inc.
7: * All rights reserved.
8: *
9: * This code is derived from software contributed to The NetBSD Foundation
10: * by Lennart Augustsson (lennart@augustsson.net) at
11: * Carlstedt Research & Technology.
12: *
13: * Redistribution and use in source and binary forms, with or without
14: * modification, are permitted provided that the following conditions
15: * are met:
16: * 1. Redistributions of source code must retain the above copyright
17: * notice, this list of conditions and the following disclaimer.
18: * 2. Redistributions in binary form must reproduce the above copyright
19: * notice, this list of conditions and the following disclaimer in the
20: * documentation and/or other materials provided with the distribution.
21: * 3. All advertising materials mentioning features or use of this software
22: * must display the following acknowledgement:
23: * This product includes software developed by the NetBSD
24: * Foundation, Inc. and its contributors.
25: * 4. Neither the name of The NetBSD Foundation nor the names of its
26: * contributors may be used to endorse or promote products derived
27: * from this software without specific prior written permission.
28: *
29: * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
30: * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
31: * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
32: * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
33: * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
34: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
35: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
36: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
37: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
39: * POSSIBILITY OF SUCH DAMAGE.
40: */
41:
42: /*
43: * To avoid having 1024 TDs for each isochronous transfer we introduce
44: * a virtual frame list. Every UHCI_VFRAMELIST_COUNT entries in the real
45: * frame list points to a non-active TD. These, in turn, form the
46: * starts of the virtual frame list. This also has the advantage that it
47: * simplifies linking in/out of TDs/QHs in the schedule.
48: * Furthermore, initially each of the inactive TDs point to an inactive
49: * QH that forms the start of the interrupt traffic for that slot.
50: * Each of these QHs point to the same QH that is the start of control
51: * traffic. This QH points at another QH which is the start of the
52: * bulk traffic.
53: *
54: * UHCI_VFRAMELIST_COUNT should be a power of 2 and <= UHCI_FRAMELIST_COUNT.
55: */
56: #define UHCI_VFRAMELIST_COUNT 128
57:
58: typedef struct uhci_soft_qh uhci_soft_qh_t;
59: typedef struct uhci_soft_td uhci_soft_td_t;
60:
61: typedef union {
62: struct uhci_soft_qh *sqh;
63: struct uhci_soft_td *std;
64: } uhci_soft_td_qh_t;
65:
66: /*
67: * An interrupt info struct contains the information needed to
68: * execute a requested routine when the controller generates an
69: * interrupt. Since we cannot know which transfer generated
70: * the interrupt all structs are linked together so they can be
71: * searched at interrupt time.
72: */
73: typedef struct uhci_intr_info {
74: struct uhci_softc *sc;
75: usbd_xfer_handle xfer;
76: uhci_soft_td_t *stdstart;
77: uhci_soft_td_t *stdend;
78: LIST_ENTRY(uhci_intr_info) list;
79: #ifdef DIAGNOSTIC
80: int isdone;
81: #endif
82: } uhci_intr_info_t;
83:
84: struct uhci_xfer {
85: struct usbd_xfer xfer;
86: uhci_intr_info_t iinfo;
87: struct usb_task abort_task;
88: int curframe;
89: };
90:
91: #define UXFER(xfer) ((struct uhci_xfer *)(xfer))
92:
93: /*
94: * Extra information that we need for a TD.
95: */
96: struct uhci_soft_td {
97: uhci_td_t td; /* The real TD, must be first */
98: uhci_soft_td_qh_t link; /* soft version of the td_link field */
99: uhci_physaddr_t physaddr; /* TD's physical address. */
100: };
101: /*
102: * Make the size such that it is a multiple of UHCI_TD_ALIGN. This way
103: * we can pack a number of soft TD together and have the real TD well
104: * aligned.
105: * NOTE: Minimum size is 32 bytes.
106: */
107: #define UHCI_STD_SIZE ((sizeof (struct uhci_soft_td) + UHCI_TD_ALIGN - 1) / UHCI_TD_ALIGN * UHCI_TD_ALIGN)
108: #define UHCI_STD_CHUNK 128 /*(PAGE_SIZE / UHCI_TD_SIZE)*/
109:
110: /*
111: * Extra information that we need for a QH.
112: */
113: struct uhci_soft_qh {
114: uhci_qh_t qh; /* The real QH, must be first */
115: uhci_soft_qh_t *hlink; /* soft version of qh_hlink */
116: uhci_soft_td_t *elink; /* soft version of qh_elink */
117: uhci_physaddr_t physaddr; /* QH's physical address. */
118: int pos; /* Timeslot position */
119: };
120: /* See comment about UHCI_STD_SIZE. */
121: #define UHCI_SQH_SIZE ((sizeof (struct uhci_soft_qh) + UHCI_QH_ALIGN - 1) / UHCI_QH_ALIGN * UHCI_QH_ALIGN)
122: #define UHCI_SQH_CHUNK 128 /*(PAGE_SIZE / UHCI_QH_SIZE)*/
123:
124: /*
125: * Information about an entry in the virtual frame list.
126: */
127: struct uhci_vframe {
128: uhci_soft_td_t *htd; /* pointer to dummy TD */
129: uhci_soft_td_t *etd; /* pointer to last TD */
130: uhci_soft_qh_t *hqh; /* pointer to dummy QH */
131: uhci_soft_qh_t *eqh; /* pointer to last QH */
132: u_int bandwidth; /* max bandwidth used by this frame */
133: };
134:
135: typedef struct uhci_softc {
136: struct usbd_bus sc_bus; /* base device */
137: bus_space_tag_t iot;
138: bus_space_handle_t ioh;
139: bus_size_t sc_size;
140:
141: uhci_physaddr_t *sc_pframes;
142: usb_dma_t sc_dma;
143: struct uhci_vframe sc_vframes[UHCI_VFRAMELIST_COUNT];
144:
145: uhci_soft_qh_t *sc_lctl_start; /* dummy QH for low speed control */
146: uhci_soft_qh_t *sc_lctl_end; /* last control QH */
147: uhci_soft_qh_t *sc_hctl_start; /* dummy QH for high speed control */
148: uhci_soft_qh_t *sc_hctl_end; /* last control QH */
149: uhci_soft_qh_t *sc_bulk_start; /* dummy QH for bulk */
150: uhci_soft_qh_t *sc_bulk_end; /* last bulk transfer */
151: uhci_soft_qh_t *sc_last_qh; /* dummy QH at the end */
152: u_int32_t sc_loops; /* number of QHs that wants looping */
153:
154: uhci_soft_td_t *sc_freetds; /* TD free list */
155: uhci_soft_qh_t *sc_freeqhs; /* QH free list */
156:
157: SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */
158:
159: u_int8_t sc_addr; /* device address */
160: u_int8_t sc_conf; /* device configuration */
161:
162: u_int8_t sc_saved_sof;
163: u_int16_t sc_saved_frnum;
164:
165: #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
166: char sc_softwake;
167: #endif /* __HAVE_GENERIC_SOFT_INTERRUPTS */
168:
169: char sc_isreset;
170: char sc_suspend;
171: char sc_dying;
172:
173: LIST_HEAD(, uhci_intr_info) sc_intrhead;
174:
175: /* Info for the root hub interrupt "pipe". */
176: int sc_ival; /* time between root hub intrs */
177: usbd_xfer_handle sc_intr_xfer; /* root hub interrupt transfer */
178: struct timeout sc_poll_handle;
179:
180: char sc_vendor[32]; /* vendor string for root hub */
181: int sc_id_vendor; /* vendor ID for root hub */
182:
183: void *sc_powerhook; /* cookie from power hook */
184: void *sc_shutdownhook; /* cookie from shutdown hook */
185:
186: struct device *sc_child; /* /dev/usb# device */
187: } uhci_softc_t;
188:
189: usbd_status uhci_init(uhci_softc_t *);
190: usbd_status uhci_run(uhci_softc_t *, int run);
191: int uhci_intr(void *);
192: int uhci_detach(uhci_softc_t *, int);
193: int uhci_activate(struct device *, enum devact);
CVSweb