Add the DragonFly cvs id and perform general cleanups on cvs/rcs/sccs ids. Most
[dragonfly.git] / sys / bus / usb / usbdivar.h
1 /*      $NetBSD: usbdivar.h,v 1.46 2000/01/19 01:16:40 augustss Exp $   */
2 /*      $FreeBSD: src/sys/dev/usb/usbdivar.h,v 1.14.2.2 2000/10/31 23:23:30 n_hibma Exp $       */
3 /*      $DragonFly: src/sys/bus/usb/usbdivar.h,v 1.2 2003/06/17 04:28:32 dillon 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 /* From usb_mem.h */
43 DECLARE_USB_DMA_T;
44
45 struct usbd_xfer;
46 struct usbd_pipe;
47
48 struct usbd_endpoint {
49         usb_endpoint_descriptor_t *edesc;
50         int                     refcnt;
51 };
52
53 struct usbd_bus_methods {
54         usbd_status           (*open_pipe)(struct usbd_pipe *pipe);
55         void                  (*do_poll)(struct usbd_bus *);
56         usbd_status           (*allocm)(struct usbd_bus *, usb_dma_t *,
57                                             u_int32_t bufsize);
58         void                  (*freem)(struct usbd_bus *, usb_dma_t *);
59         struct usbd_xfer *    (*allocx)(struct usbd_bus *);
60         void                  (*freex)(struct usbd_bus *,
61                                            struct usbd_xfer *);
62 };
63
64 struct usbd_pipe_methods {
65         usbd_status           (*transfer)(usbd_xfer_handle xfer);
66         usbd_status           (*start)(usbd_xfer_handle xfer);
67         void                  (*abort)(usbd_xfer_handle xfer);
68         void                  (*close)(usbd_pipe_handle pipe);
69         void                  (*cleartoggle)(usbd_pipe_handle pipe);
70         void                  (*done)(usbd_xfer_handle xfer);
71 };
72
73 struct usbd_port {
74         usb_port_status_t       status;
75         u_int16_t               power;  /* mA of current on port */
76         u_int8_t                portno;
77         u_int8_t                restartcnt;
78 #define USBD_RESTART_MAX 5
79         struct usbd_device     *device;
80         struct usbd_device     *parent; /* The ports hub */
81 };
82
83 struct usbd_hub {
84         usbd_status           (*explore)(usbd_device_handle hub);
85         void                   *hubsoftc;
86         usb_hub_descriptor_t    hubdesc;
87         struct usbd_port        ports[1];
88 };
89
90 struct usb_softc;
91
92 /*****/
93
94 struct usbd_bus {
95         /* Filled by HC driver */
96         USBBASEDEVICE           bdev; /* base device, host adapter */
97         struct usbd_bus_methods *methods;
98         u_int32_t               pipe_size; /* size of a pipe struct */
99         /* Filled by usb driver */
100         struct usbd_device     *root_hub;
101         usbd_device_handle      devices[USB_MAX_DEVICES];
102         char                    needs_explore;/* a hub a signalled a change */
103         char                    use_polling;
104         struct usb_softc       *usbctl;
105         struct usb_device_stats stats;
106         int                     intr_context;
107         u_int                   no_intrs;
108         int                     usbrev; /* USB revision */
109 #define USBREV_UNKNOWN  0
110 #define USBREV_PRE_1_0  1
111 #define USBREV_1_0      2
112 #define USBREV_1_1      3
113 #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1" }
114
115 #if defined(__NetBSD__) || defined(__OpenBSD__)
116         bus_dma_tag_t           dmatag; /* DMA tag */
117 #endif
118 };
119
120 struct usbd_device {
121         struct usbd_bus        *bus;           /* our controller */
122         struct usbd_pipe       *default_pipe;  /* pipe 0 */
123         u_int8_t                address;       /* device addess */
124         u_int8_t                config;        /* current configuration # */
125         u_int8_t                depth;         /* distance from root hub */
126         u_int8_t                lowspeed;      /* lowspeed flag */
127         u_int8_t                self_powered;  /* flag for self powered */
128         u_int16_t               power;         /* mA the device uses */
129         int16_t                 langid;        /* language for strings */
130 #define USBD_NOLANG (-1)
131         usb_event_cookie_t      cookie;        /* unique connection id */
132         struct usbd_port       *powersrc;      /* upstream hub port, or 0 */
133         struct usbd_endpoint    def_ep;        /* for pipe 0 */
134         usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
135         struct usbd_interface  *ifaces;        /* array of all interfaces */
136         usb_device_descriptor_t ddesc;         /* device descriptor */
137         usb_config_descriptor_t *cdesc;        /* full config descr */
138         struct usbd_quirks     *quirks;        /* device quirks, always set */
139         struct usbd_hub        *hub;           /* only if this is a hub */
140         device_ptr_t           *subdevs;       /* sub-devices, 0 terminated */
141 };
142
143 struct usbd_interface {
144         struct usbd_device     *device;
145         usb_interface_descriptor_t *idesc;
146         int                     index;
147         int                     altindex;
148         struct usbd_endpoint   *endpoints;
149         void                   *priv;
150         LIST_HEAD(, usbd_pipe)  pipes;
151 };
152
153 struct usbd_pipe {
154         struct usbd_interface  *iface;
155         struct usbd_device     *device;
156         struct usbd_endpoint   *endpoint;
157         int                     refcnt;
158         char                    running;
159         SIMPLEQ_HEAD(, usbd_xfer) queue;
160         LIST_ENTRY(usbd_pipe)   next;
161
162         usbd_xfer_handle        intrxfer; /* used for repeating requests */
163         char                    repeat;
164         int                     interval;
165
166         /* Filled by HC driver. */
167         struct usbd_pipe_methods *methods;
168 };
169
170 struct usbd_xfer {
171         struct usbd_pipe       *pipe;
172         void                   *priv;
173         void                   *buffer;
174         u_int32_t               length;
175         u_int32_t               actlen;
176         u_int16_t               flags;
177         u_int32_t               timeout;
178         usbd_status             status;
179         usbd_callback           callback;
180         __volatile char         done;
181
182         /* For control pipe */
183         usb_device_request_t    request;
184
185         /* For isoc */
186         u_int16_t               *frlengths;
187         int                     nframes;
188
189         /* For memory allocation */
190         struct usbd_device     *device;
191         usb_dma_t               dmabuf;
192
193         int                     rqflags;
194 #define URQ_REQUEST     0x01
195 #define URQ_AUTO_DMABUF 0x10
196 #define URQ_DEV_DMABUF  0x20
197
198         SIMPLEQ_ENTRY(usbd_xfer) next;
199
200         void                   *hcpriv; /* private use by the HC driver */
201         int                     hcprivint;
202
203 #if defined(__FreeBSD__)
204         struct callout_handle  timo_handle;
205 #endif
206 };
207
208 void usbd_init(void);
209 void usbd_finish(void);
210
211 /* Routines from usb_subr.c */
212 int             usbctlprint(void *, const char *);
213 void            usb_delay_ms(usbd_bus_handle, u_int);
214 void            usbd_devinfo_vp(usbd_device_handle, char *, char *);
215 usbd_status     usbd_reset_port(usbd_device_handle dev,
216                                      int port, usb_port_status_t *ps);
217 usbd_status     usbd_setup_pipe(usbd_device_handle dev,
218                                      usbd_interface_handle iface,
219                                      struct usbd_endpoint *, int,
220                                      usbd_pipe_handle *pipe);
221 usbd_status     usbd_new_device(device_ptr_t parent, 
222                                      usbd_bus_handle bus, int depth,
223                                      int lowspeed, int port, 
224                                      struct usbd_port *);
225 void            usbd_remove_device(usbd_device_handle,
226                                         struct usbd_port *);
227 int             usbd_printBCD(char *cp, int bcd);
228 usbd_status     usbd_fill_iface_data(usbd_device_handle dev, 
229                                           int i, int a);
230 void            usb_free_device(usbd_device_handle);
231
232 usbd_status     usb_insert_transfer(usbd_xfer_handle xfer);
233 void            usb_transfer_complete(usbd_xfer_handle xfer);
234 void            usb_disconnect_port(struct usbd_port *up, device_ptr_t);
235
236 /* Routines from usb.c */
237 int             usb_bus_count(void);
238 void            usb_needs_explore(usbd_bus_handle);
239
240 #ifdef DIAGNOSTIC
241 #define SPLUSBCHECK \
242         do { int _s = splusb(), _su = splusb(); \
243              if (!cold && _s != _su) printf("SPLUSBCHECK failed 0x%x!=0x%x, %s:%d\n", \
244                                    _s, _su, __FILE__, __LINE__); \
245              splx(_s); \
246         } while (0)
247 #else
248 #define SPLUSBCHECK
249 #endif
250
251 /* Locator stuff. */
252
253 #if defined(__NetBSD__)
254 #include "locators.h"
255 #elif defined(__FreeBSD__) || defined(__OpenBSD__)
256 /* XXX these values are used to statically bind some elements in the USB tree
257  * to specific driver instances. This should be somehow emulated in FreeBSD
258  * but can be done later on.
259  * The values are copied from the files.usb file in the NetBSD sources.
260  */
261 #define UHUBCF_PORT_DEFAULT -1
262 #define UHUBCF_CONFIGURATION_DEFAULT -1
263 #define UHUBCF_INTERFACE_DEFAULT -1
264 #define UHUBCF_VENDOR_DEFAULT -1
265 #define UHUBCF_PRODUCT_DEFAULT -1
266 #define UHUBCF_RELEASE_DEFAULT -1
267 #endif
268
269 #if defined (__OpenBSD__)
270 #define UHUBCF_PORT             0
271 #define UHUBCF_CONFIGURATION    1
272 #define UHUBCF_INTERFACE        2
273 #define UHUBCF_VENDOR           3
274 #define UHUBCF_PRODUCT          4
275 #define UHUBCF_RELEASE          5
276 #endif
277
278 #define uhubcf_port             cf_loc[UHUBCF_PORT]
279 #define uhubcf_configuration    cf_loc[UHUBCF_CONFIGURATION]
280 #define uhubcf_interface        cf_loc[UHUBCF_INTERFACE]
281 #define uhubcf_vendor           cf_loc[UHUBCF_VENDOR]
282 #define uhubcf_product          cf_loc[UHUBCF_PRODUCT]
283 #define uhubcf_release          cf_loc[UHUBCF_RELEASE]
284 #define UHUB_UNK_PORT           UHUBCF_PORT_DEFAULT /* wildcarded 'port' */
285 #define UHUB_UNK_CONFIGURATION  UHUBCF_CONFIGURATION_DEFAULT /* wildcarded 'configuration' */
286 #define UHUB_UNK_INTERFACE      UHUBCF_INTERFACE_DEFAULT /* wildcarded 'interface' */
287 #define UHUB_UNK_VENDOR         UHUBCF_VENDOR_DEFAULT /* wildcarded 'vendor' */
288 #define UHUB_UNK_PRODUCT        UHUBCF_PRODUCT_DEFAULT /* wildcarded 'product' */
289 #define UHUB_UNK_RELEASE        UHUBCF_RELEASE_DEFAULT /* wildcarded 'release' */
290