Add IDs for the following:
[dragonfly.git] / sys / bus / usb / usbdivar.h
1 /*
2  * $NetBSD: usbdivar.h,v 1.70 2002/07/11 21:14:36 augustss Exp $
3  * $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.40 2003/07/15 22:42:37 jmg Exp $
4  * $DragonFly: src/sys/bus/usb/usbdivar.h,v 1.4 2004/02/11 15:17:26 joerg Exp $
5  */
6
7 /*
8  * Copyright (c) 1998 The NetBSD Foundation, Inc.
9  * All rights reserved.
10  *
11  * This code is derived from software contributed to The NetBSD Foundation
12  * by Lennart Augustsson (lennart@augustsson.net) at
13  * Carlstedt Research & Technology.
14  *
15  * Redistribution and use in source and binary forms, with or without
16  * modification, are permitted provided that the following conditions
17  * are met:
18  * 1. Redistributions of source code must retain the above copyright
19  *    notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  *    notice, this list of conditions and the following disclaimer in the
22  *    documentation and/or other materials provided with the distribution.
23  * 3. All advertising materials mentioning features or use of this software
24  *    must display the following acknowledgement:
25  *        This product includes software developed by the NetBSD
26  *        Foundation, Inc. and its contributors.
27  * 4. Neither the name of The NetBSD Foundation nor the names of its
28  *    contributors may be used to endorse or promote products derived
29  *    from this software without specific prior written permission.
30  *
31  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
32  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
33  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
34  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
35  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
36  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
37  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
38  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
39  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
40  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGE.
42  */
43
44 #if defined(__NetBSD__)
45 #include <sys/callout.h>
46 #endif
47
48 /* From usb_mem.h */
49 DECLARE_USB_DMA_T;
50
51 struct usbd_xfer;
52 struct usbd_pipe;
53
54 struct usbd_endpoint {
55         usb_endpoint_descriptor_t *edesc;
56         int                     refcnt;
57 };
58
59 struct usbd_bus_methods {
60         usbd_status           (*open_pipe)(struct usbd_pipe *pipe);
61         void                  (*soft_intr)(void *);
62         void                  (*do_poll)(struct usbd_bus *);
63         usbd_status           (*allocm)(struct usbd_bus *, usb_dma_t *,
64                                         u_int32_t bufsize);
65         void                  (*freem)(struct usbd_bus *, usb_dma_t *);
66         struct usbd_xfer *    (*allocx)(struct usbd_bus *);
67         void                  (*freex)(struct usbd_bus *, struct usbd_xfer *);
68 };
69
70 struct usbd_pipe_methods {
71         usbd_status           (*transfer)(usbd_xfer_handle xfer);
72         usbd_status           (*start)(usbd_xfer_handle xfer);
73         void                  (*abort)(usbd_xfer_handle xfer);
74         void                  (*close)(usbd_pipe_handle pipe);
75         void                  (*cleartoggle)(usbd_pipe_handle pipe);
76         void                  (*done)(usbd_xfer_handle xfer);
77 };
78
79 struct usbd_port {
80         usb_port_status_t       status;
81         u_int16_t               power;  /* mA of current on port */
82         u_int8_t                portno;
83         u_int8_t                restartcnt;
84 #define USBD_RESTART_MAX 5
85         struct usbd_device     *device; /* Connected device */
86         struct usbd_device     *parent; /* The ports hub */
87 };
88
89 struct usbd_hub {
90         usbd_status           (*explore)(usbd_device_handle hub);
91         void                   *hubsoftc;
92         usb_hub_descriptor_t    hubdesc;
93         struct usbd_port        ports[1];
94 };
95
96 struct usb_softc;
97
98 /*****/
99
100 struct usbd_bus {
101         /* Filled by HC driver */
102         USBBASEDEVICE           bdev; /* base device, host adapter */
103         struct usbd_bus_methods *methods;
104         u_int32_t               pipe_size; /* size of a pipe struct */
105         /* Filled by usb driver */
106         struct usbd_device     *root_hub;
107         usbd_device_handle      devices[USB_MAX_DEVICES];
108         char                    needs_explore;/* a hub a signalled a change */
109         char                    use_polling;
110         struct usb_softc       *usbctl;
111         struct usb_device_stats stats;
112         int                     intr_context;
113         u_int                   no_intrs;
114         int                     usbrev; /* USB revision */
115 #define USBREV_UNKNOWN  0
116 #define USBREV_PRE_1_0  1
117 #define USBREV_1_0      2
118 #define USBREV_1_1      3
119 #define USBREV_2_0      4
120 #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0" }
121
122 #ifdef USB_USE_SOFTINTR
123 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
124         void                   *soft; /* soft interrupt cookie */
125 #else
126         struct callout          softi;
127 #endif
128 #endif
129
130         bus_dma_tag_t           dmatag; /* DMA tag */
131 };
132
133 struct usbd_device {
134         struct usbd_bus        *bus;           /* our controller */
135         struct usbd_pipe       *default_pipe;  /* pipe 0 */
136         u_int8_t                address;       /* device addess */
137         u_int8_t                config;        /* current configuration # */
138         u_int8_t                depth;         /* distance from root hub */
139         u_int8_t                speed;         /* low/full/high speed */
140         u_int8_t                self_powered;  /* flag for self powered */
141         u_int16_t               power;         /* mA the device uses */
142         int16_t                 langid;        /* language for strings */
143 #define USBD_NOLANG (-1)
144         usb_event_cookie_t      cookie;        /* unique connection id */
145         struct usbd_port       *powersrc;      /* upstream hub port, or 0 */
146         struct usbd_device     *myhub;         /* upstream hub */
147         struct usbd_device     *myhighhub;     /* closest high speed hub */
148         struct usbd_endpoint    def_ep;        /* for pipe 0 */
149         usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
150         struct usbd_interface  *ifaces;        /* array of all interfaces */
151         usb_device_descriptor_t ddesc;         /* device descriptor */
152         usb_config_descriptor_t *cdesc;        /* full config descr */
153         const struct usbd_quirks     *quirks;  /* device quirks, always set */
154         struct usbd_hub        *hub;           /* only if this is a hub */
155         device_ptr_t           *subdevs;       /* sub-devices, 0 terminated */
156 };
157
158 struct usbd_interface {
159         struct usbd_device     *device;
160         usb_interface_descriptor_t *idesc;
161         int                     index;
162         int                     altindex;
163         struct usbd_endpoint   *endpoints;
164         void                   *priv;
165         LIST_HEAD(, usbd_pipe)  pipes;
166 };
167
168 struct usbd_pipe {
169         struct usbd_interface  *iface;
170         struct usbd_device     *device;
171         struct usbd_endpoint   *endpoint;
172         int                     refcnt;
173         char                    running;
174         char                    aborting;
175         SIMPLEQ_HEAD(, usbd_xfer) queue;
176         LIST_ENTRY(usbd_pipe)   next;
177
178         usbd_xfer_handle        intrxfer; /* used for repeating requests */
179         char                    repeat;
180         int                     interval;
181
182         /* Filled by HC driver. */
183         struct usbd_pipe_methods *methods;
184 };
185
186 struct usbd_xfer {
187         struct usbd_pipe       *pipe;
188         void                   *priv;
189         void                   *buffer;
190         u_int32_t               length;
191         u_int32_t               actlen;
192         u_int16_t               flags;
193         u_int32_t               timeout;
194         usbd_status             status;
195         usbd_callback           callback;
196         __volatile char         done;
197 #ifdef DIAGNOSTIC
198         u_int32_t               busy_free;
199 #define XFER_FREE 0x46524545
200 #define XFER_BUSY 0x42555359
201 #define XFER_ONQU 0x4f4e5155
202 #endif
203
204         /* For control pipe */
205         usb_device_request_t    request;
206
207         /* For isoc */
208         u_int16_t               *frlengths;
209         int                     nframes;
210
211         /* For memory allocation */
212         struct usbd_device     *device;
213         usb_dma_t               dmabuf;
214
215         int                     rqflags;
216 #define URQ_REQUEST     0x01
217 #define URQ_AUTO_DMABUF 0x10
218 #define URQ_DEV_DMABUF  0x20
219
220         SIMPLEQ_ENTRY(usbd_xfer) next;
221
222         void                   *hcpriv; /* private use by the HC driver */
223
224         usb_callout_t           timeout_handle;
225 };
226
227 void usbd_init(void);
228 void usbd_finish(void);
229
230 #ifdef USB_DEBUG
231 void usbd_dump_iface(struct usbd_interface *iface);
232 void usbd_dump_device(struct usbd_device *dev);
233 void usbd_dump_endpoint(struct usbd_endpoint *endp);
234 void usbd_dump_queue(usbd_pipe_handle pipe);
235 void usbd_dump_pipe(usbd_pipe_handle pipe);
236 #endif
237
238 /* Routines from usb_subr.c */
239 int             usbctlprint(void *, const char *);
240 void            usb_delay_ms(usbd_bus_handle, u_int);
241 usbd_status     usbd_reset_port(usbd_device_handle dev,
242                                 int port, usb_port_status_t *ps);
243 usbd_status     usbd_setup_pipe(usbd_device_handle dev,
244                                 usbd_interface_handle iface,
245                                 struct usbd_endpoint *, int,
246                                 usbd_pipe_handle *pipe);
247 usbd_status     usbd_new_device(device_ptr_t parent,
248                                 usbd_bus_handle bus, int depth,
249                                 int lowspeed, int port,
250                                 struct usbd_port *);
251 void            usbd_remove_device(usbd_device_handle, struct usbd_port *);
252 int             usbd_printBCD(char *cp, int bcd);
253 usbd_status     usbd_fill_iface_data(usbd_device_handle dev, int i, int a);
254 void            usb_free_device(usbd_device_handle);
255
256 usbd_status     usb_insert_transfer(usbd_xfer_handle xfer);
257 void            usb_transfer_complete(usbd_xfer_handle xfer);
258 void            usb_disconnect_port(struct usbd_port *up, device_ptr_t);
259
260 /* Routines from usb.c */
261 void            usb_needs_explore(usbd_device_handle);
262 void            usb_schedsoftintr(struct usbd_bus *);
263
264 /*
265  * XXX This check is extremely bogus. Bad Bad Bad.
266  */
267 #if defined(DIAGNOSTIC) && 0
268 #define SPLUSBCHECK \
269         do { int _s = splusb(), _su = splusb(); \
270              if (!cold && _s != _su) printf("SPLUSBCHECK failed 0x%x!=0x%x, %s:%d\n", \
271                                    _s, _su, __FILE__, __LINE__); \
272              splx(_s); \
273         } while (0)
274 #else
275 #define SPLUSBCHECK
276 #endif
277
278 /* Locator stuff. */
279
280 #if defined(__NetBSD__)
281 #include "locators.h"
282 #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
283 /* XXX these values are used to statically bind some elements in the USB tree
284  * to specific driver instances. This should be somehow emulated in FreeBSD
285  * but can be done later on.
286  * The values are copied from the files.usb file in the NetBSD sources.
287  */
288 #define UHUBCF_PORT_DEFAULT -1
289 #define UHUBCF_CONFIGURATION_DEFAULT -1
290 #define UHUBCF_INTERFACE_DEFAULT -1
291 #define UHUBCF_VENDOR_DEFAULT -1
292 #define UHUBCF_PRODUCT_DEFAULT -1
293 #define UHUBCF_RELEASE_DEFAULT -1
294 #endif
295
296 #if defined (__OpenBSD__)
297 #define UHUBCF_PORT             0
298 #define UHUBCF_CONFIGURATION    1
299 #define UHUBCF_INTERFACE        2
300 #define UHUBCF_VENDOR           3
301 #define UHUBCF_PRODUCT          4
302 #define UHUBCF_RELEASE          5
303 #endif
304
305 #define uhubcf_port             cf_loc[UHUBCF_PORT]
306 #define uhubcf_configuration    cf_loc[UHUBCF_CONFIGURATION]
307 #define uhubcf_interface        cf_loc[UHUBCF_INTERFACE]
308 #define uhubcf_vendor           cf_loc[UHUBCF_VENDOR]
309 #define uhubcf_product          cf_loc[UHUBCF_PRODUCT]
310 #define uhubcf_release          cf_loc[UHUBCF_RELEASE]
311 #define UHUB_UNK_PORT           UHUBCF_PORT_DEFAULT /* wildcarded 'port' */
312 #define UHUB_UNK_CONFIGURATION  UHUBCF_CONFIGURATION_DEFAULT /* wildcarded 'configuration' */
313 #define UHUB_UNK_INTERFACE      UHUBCF_INTERFACE_DEFAULT /* wildcarded 'interface' */
314 #define UHUB_UNK_VENDOR         UHUBCF_VENDOR_DEFAULT /* wildcarded 'vendor' */
315 #define UHUB_UNK_PRODUCT        UHUBCF_PRODUCT_DEFAULT /* wildcarded 'product' */
316 #define UHUB_UNK_RELEASE        UHUBCF_RELEASE_DEFAULT /* wildcarded 'release' */
317