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