Remove pca and speaker device remains (both deleted).
[dragonfly.git] / sys / bus / usb / uhcivar.h
1 /*      $NetBSD: uhcivar.h,v 1.33 2002/02/11 11:41:30 augustss Exp $    */
2 /*      $FreeBSD: src/sys/dev/usb/uhcivar.h,v 1.40 2005/03/19 19:08:46 iedowse Exp $    */
3 /*      $DragonFly: src/sys/bus/usb/uhcivar.h,v 1.9 2007/06/30 20:39:22 hasso 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         u_int32_t uhci_xfer_flags;
90 };
91
92 #define UHCI_XFER_ABORTING      0x0001  /* xfer is aborting. */
93 #define UHCI_XFER_ABORTWAIT     0x0002  /* abort completion is being awaited. */
94
95 #define UXFER(xfer) ((struct uhci_xfer *)(xfer))
96
97 /*
98  * Extra information that we need for a TD.
99  */
100 struct uhci_soft_td {
101         uhci_td_t td;                   /* The real TD, must be first */
102         uhci_soft_td_qh_t link;         /* soft version of the td_link field */
103         uhci_physaddr_t physaddr;       /* TD's physical address. */
104 };
105 /*
106  * Make the size such that it is a multiple of UHCI_TD_ALIGN.  This way
107  * we can pack a number of soft TD together and have the real TD well
108  * aligned.
109  * NOTE: Minimum size is 32 bytes.
110  */
111 #define UHCI_STD_SIZE ((sizeof (struct uhci_soft_td) + UHCI_TD_ALIGN - 1) / UHCI_TD_ALIGN * UHCI_TD_ALIGN)
112 #define UHCI_STD_CHUNK (PAGE_SIZE / UHCI_STD_SIZE)
113
114 /*
115  * Extra information that we need for a QH.
116  */
117 struct uhci_soft_qh {
118         uhci_qh_t qh;                   /* The real QH, must be first */
119         uhci_soft_qh_t *hlink;          /* soft version of qh_hlink */
120         uhci_soft_td_t *elink;          /* soft version of qh_elink */
121         uhci_physaddr_t physaddr;       /* QH's physical address. */
122         int pos;                        /* Timeslot position */
123 };
124 /* See comment about UHCI_STD_SIZE. */
125 #define UHCI_SQH_SIZE ((sizeof (struct uhci_soft_qh) + UHCI_QH_ALIGN - 1) / UHCI_QH_ALIGN * UHCI_QH_ALIGN)
126 #define UHCI_SQH_CHUNK (PAGE_SIZE / UHCI_SQH_SIZE)
127
128 /*
129  * Information about an entry in the virtual frame list.
130  */
131 struct uhci_vframe {
132         uhci_soft_td_t *htd;            /* pointer to dummy TD */
133         uhci_soft_td_t *etd;            /* pointer to last TD */
134         uhci_soft_qh_t *hqh;            /* pointer to dummy QH */
135         uhci_soft_qh_t *eqh;            /* pointer to last QH */
136         u_int bandwidth;                /* max bandwidth used by this frame */
137 };
138
139 #define UHCI_SCFLG_DONEINIT     0x0001  /* uhci_init() done */
140
141 typedef struct uhci_softc {
142         struct usbd_bus sc_bus;         /* base device */
143         int sc_flags;
144         bus_space_tag_t iot;
145         bus_space_handle_t ioh;
146         bus_size_t sc_size;
147         void *ih;
148
149         struct resource *io_res;
150         struct resource *irq_res;
151
152         uhci_physaddr_t *sc_pframes;
153         usb_dma_t sc_dma;
154         struct uhci_vframe sc_vframes[UHCI_VFRAMELIST_COUNT];
155
156         uhci_soft_qh_t *sc_lctl_start;  /* dummy QH for low speed control */
157         uhci_soft_qh_t *sc_lctl_end;    /* last control QH */
158         uhci_soft_qh_t *sc_hctl_start;  /* dummy QH for high speed control */
159         uhci_soft_qh_t *sc_hctl_end;    /* last control QH */
160         uhci_soft_qh_t *sc_bulk_start;  /* dummy QH for bulk */
161         uhci_soft_qh_t *sc_bulk_end;    /* last bulk transfer */
162         uhci_soft_qh_t *sc_last_qh;     /* dummy QH at the end */
163         u_int32_t sc_loops;             /* number of QHs that wants looping */
164
165         uhci_soft_td_t *sc_freetds;     /* TD free list */
166         uhci_soft_qh_t *sc_freeqhs;     /* QH free list */
167
168         STAILQ_HEAD(, usbd_xfer) sc_free_xfers; /* free xfers */
169
170         u_int8_t sc_addr;               /* device address */
171         u_int8_t sc_conf;               /* device configuration */
172
173         u_int8_t sc_saved_sof;
174         u_int16_t sc_saved_frnum;
175
176 #ifdef USB_USE_SOFTINTR
177         char sc_softwake;
178 #endif /* USB_USE_SOFTINTR */
179
180         char sc_isreset;
181         char sc_suspend;
182         char sc_dying;
183
184         LIST_HEAD(, uhci_intr_info) sc_intrhead;
185
186         /* Info for the root hub interrupt channel. */
187         int sc_ival;                    /* time between root hub intrs */
188         usbd_xfer_handle sc_intr_xfer;  /* root hub interrupt transfer */
189         struct callout sc_poll_handle;
190
191         char sc_vendor[16];             /* vendor string for root hub */
192         int sc_id_vendor;               /* vendor ID for root hub */
193 } uhci_softc_t;
194
195 usbd_status     uhci_init(uhci_softc_t *);
196 int             uhci_intr(void *);
197 int             uhci_detach(uhci_softc_t *, int);
198
199 void            uhci_shutdown(void *v);
200 void            uhci_power(int state, void *priv);
201