Line data Source code
1 : /* $OpenBSD: usbdivar.h,v 1.75 2018/05/01 18:14:46 landry Exp $ */
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.11 1999/11/17 22:33:51 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 : *
22 : * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
23 : * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
24 : * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
26 : * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
28 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
31 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32 : * POSSIBILITY OF SUCH DAMAGE.
33 : */
34 :
35 : #ifndef _USBDIVAR_H_
36 : #define _USBDIVAR_H_
37 :
38 : #include "bpfilter.h"
39 : #if NBPFILTER > 0
40 : #include <net/bpf.h>
41 : #endif
42 :
43 : #include <sys/timeout.h>
44 :
45 : /* From usb_mem.h */
46 : struct usb_dma_block;
47 : struct usb_dma {
48 : struct usb_dma_block *block;
49 : u_int offs;
50 : };
51 :
52 : struct usbd_xfer;
53 : struct usbd_pipe;
54 :
55 : struct usbd_endpoint {
56 : usb_endpoint_descriptor_t *edesc;
57 : int refcnt;
58 : int savedtoggle;
59 : };
60 :
61 : struct usbd_bus_methods {
62 : usbd_status (*open_pipe)(struct usbd_pipe *);
63 : int (*dev_setaddr)(struct usbd_device *, int);
64 : void (*soft_intr)(void *);
65 : void (*do_poll)(struct usbd_bus *);
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)(struct usbd_xfer *);
72 : usbd_status (*start)(struct usbd_xfer *);
73 : void (*abort)(struct usbd_xfer *);
74 : void (*close)(struct usbd_pipe *);
75 : void (*cleartoggle)(struct usbd_pipe *);
76 : void (*done)(struct usbd_xfer *);
77 : };
78 :
79 : struct usbd_tt {
80 : struct usbd_hub *hub;
81 : };
82 :
83 : struct usbd_port {
84 : usb_port_status_t status;
85 : u_int16_t power; /* mA of current on port */
86 : u_int8_t portno;
87 : u_int8_t restartcnt;
88 : #define USBD_RESTART_MAX 5
89 : u_int8_t reattach;
90 : struct usbd_device *device; /* Connected device */
91 : struct usbd_device *parent; /* The ports hub */
92 : struct usbd_tt *tt; /* Transaction translator (if any) */
93 : };
94 :
95 : struct usbd_hub {
96 : int (*explore)(struct usbd_device *);
97 : void *hubsoftc;
98 : struct usbd_port *ports;
99 : int nports;
100 : u_int8_t powerdelay;
101 : u_int8_t ttthink;
102 : };
103 :
104 : struct usbd_bus {
105 : /* Filled by HC driver */
106 : struct device bdev; /* base device, host adapter */
107 : struct usbd_bus_methods *methods;
108 : #if NBPFILTER > 0
109 : void *bpfif;
110 : caddr_t bpf;
111 : #endif
112 : u_int32_t pipe_size; /* size of a pipe struct */
113 : /* Filled by usb driver */
114 : struct usbd_device *root_hub;
115 : struct usbd_device *devices[USB_MAX_DEVICES];
116 : char use_polling;
117 : char dying;
118 : int flags;
119 : #define USB_BUS_CONFIG_PENDING 0x01
120 : #define USB_BUS_DISCONNECTING 0x02
121 : struct device *usbctl;
122 : struct usb_device_stats stats;
123 : int intr_context;
124 : u_int no_intrs;
125 : int usbrev; /* USB revision */
126 : #define USBREV_UNKNOWN 0
127 : #define USBREV_PRE_1_0 1
128 : #define USBREV_1_0 2
129 : #define USBREV_1_1 3
130 : #define USBREV_2_0 4
131 : #define USBREV_3_0 5
132 : #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0", "3.0" }
133 : void *soft; /* soft interrupt cookie */
134 : bus_dma_tag_t dmatag; /* DMA tag */
135 : };
136 :
137 : struct usbd_device {
138 : struct usbd_bus *bus; /* our controller */
139 : struct usbd_pipe *default_pipe; /* pipe 0 */
140 : u_int8_t dying; /* hardware removed */
141 : u_int8_t ref_cnt; /* # of procs using device */
142 : u_int8_t address; /* device address */
143 : u_int8_t config; /* current configuration # */
144 : u_int8_t depth; /* distance from root hub */
145 : u_int8_t speed; /* low/full/high speed */
146 : u_int8_t self_powered; /* flag for self powered */
147 : u_int16_t power; /* mA the device uses */
148 : int16_t langid; /* language for strings */
149 : #define USBD_NOLANG (-1)
150 : struct usbd_port *powersrc; /* upstream hub port, or 0 */
151 : struct usbd_device *myhub; /* upstream hub */
152 : struct usbd_port *myhsport; /* closest high speed port */
153 : struct usbd_endpoint def_ep; /* for pipe 0 */
154 : usb_endpoint_descriptor_t def_ep_desc; /* for pipe 0 */
155 : struct usbd_interface *ifaces; /* array of all interfaces */
156 : usb_device_descriptor_t ddesc; /* device descriptor */
157 : usb_config_descriptor_t *cdesc; /* full config descr */
158 : const struct usbd_quirks *quirks; /* device quirks, always set */
159 : struct usbd_hub *hub; /* only if this is a hub */
160 : struct device **subdevs; /* sub-devices, 0 terminated */
161 : int ndevs; /* # of subdevs */
162 :
163 : char *serial; /* serial number, can be NULL */
164 : char *vendor; /* vendor string, can be NULL */
165 : char *product; /* product string, can be NULL */
166 : };
167 :
168 : struct usbd_interface {
169 : struct usbd_device *device;
170 : usb_interface_descriptor_t *idesc;
171 : int index;
172 : int altindex;
173 : struct usbd_endpoint *endpoints;
174 : void *priv;
175 : LIST_HEAD(, usbd_pipe) pipes;
176 : u_int8_t claimed;
177 : };
178 :
179 : struct usbd_pipe {
180 : struct usbd_interface *iface;
181 : struct usbd_device *device;
182 : struct usbd_endpoint *endpoint;
183 : size_t pipe_size;
184 : char running;
185 : char aborting;
186 : SIMPLEQ_HEAD(, usbd_xfer) queue;
187 : LIST_ENTRY(usbd_pipe) next;
188 :
189 : struct usbd_xfer *intrxfer; /* used for repeating requests */
190 : char repeat;
191 : int interval;
192 :
193 : /* Filled by HC driver. */
194 : struct usbd_pipe_methods *methods;
195 : };
196 :
197 : struct usbd_xfer {
198 : struct usbd_pipe *pipe;
199 : void *priv;
200 : char *buffer;
201 : u_int32_t length;
202 : u_int32_t actlen;
203 : u_int16_t flags;
204 : u_int32_t timeout;
205 : usbd_status status;
206 : usbd_callback callback;
207 : volatile char done;
208 : #ifdef DIAGNOSTIC
209 : u_int32_t busy_free;
210 : #define XFER_FREE 0x42555359
211 : #define XFER_ONQU 0x4f4e5155
212 : #endif
213 :
214 : /* For control pipe */
215 : usb_device_request_t request;
216 :
217 : /* For isoc */
218 : u_int16_t *frlengths;
219 : int nframes;
220 :
221 : /* For memory allocation */
222 : struct usbd_device *device;
223 : struct usb_dma dmabuf;
224 :
225 : int rqflags;
226 : #define URQ_REQUEST 0x01
227 : #define URQ_AUTO_DMABUF 0x10
228 : #define URQ_DEV_DMABUF 0x20
229 :
230 : SIMPLEQ_ENTRY(usbd_xfer) next;
231 :
232 : void *hcpriv; /* private use by the HC driver */
233 :
234 : struct usb_task abort_task;
235 : struct timeout timeout_handle;
236 : };
237 :
238 : void usbd_dump_iface(struct usbd_interface *);
239 : void usbd_dump_device(struct usbd_device *);
240 : void usbd_dump_endpoint(struct usbd_endpoint *);
241 : void usbd_dump_queue(struct usbd_pipe *);
242 : void usbd_dump_pipe(struct usbd_pipe *);
243 :
244 : /* Routines from usb_subr.c */
245 : int usbctlprint(void *, const char *);
246 : void usb_delay_ms(struct usbd_bus *, u_int);
247 : usbd_status usbd_port_disown_to_1_1(struct usbd_device *, int);
248 : int usbd_reset_port(struct usbd_device *, int);
249 : usbd_status usbd_setup_pipe(struct usbd_device *,
250 : struct usbd_interface *, struct usbd_endpoint *, int,
251 : struct usbd_pipe **);
252 : int usbd_set_address(struct usbd_device *, int);
253 : usbd_status usbd_new_device(struct device *, struct usbd_bus *,
254 : int, int, int, struct usbd_port *);
255 : usbd_status usbd_fill_iface_data(struct usbd_device *, int, int);
256 :
257 : usbd_status usb_insert_transfer(struct usbd_xfer *);
258 : void usb_transfer_complete(struct usbd_xfer *);
259 : int usbd_detach(struct usbd_device *, struct device *);
260 :
261 : /* Routines from usb.c */
262 : void usb_needs_explore(struct usbd_device *, int);
263 : void usb_needs_reattach(struct usbd_device *);
264 : void usb_schedsoftintr(struct usbd_bus *);
265 : void usb_tap(struct usbd_bus *, struct usbd_xfer *, uint8_t);
266 :
267 : #define USBTAP_DIR_OUT 0
268 : #define USBTAP_DIR_IN 1
269 :
270 : #define UHUB_UNK_CONFIGURATION -1
271 : #define UHUB_UNK_INTERFACE -1
272 :
273 : static inline int
274 0 : usbd_xfer_isread(struct usbd_xfer *xfer)
275 : {
276 0 : if (xfer->rqflags & URQ_REQUEST)
277 0 : return (xfer->request.bmRequestType & UT_READ);
278 :
279 0 : return (xfer->pipe->endpoint->edesc->bEndpointAddress & UE_DIR_IN);
280 0 : }
281 :
282 : #endif /* _USBDIVAR_H_ */
|