This source file includes following definitions.
- usb_dma_t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 struct usb_dma_block;
44 typedef struct {
45 struct usb_dma_block *block;
46 u_int offs;
47 } usb_dma_t;
48
49 struct usbd_xfer;
50 struct usbd_pipe;
51
52 struct usbd_endpoint {
53 usb_endpoint_descriptor_t *edesc;
54 int refcnt;
55 int savedtoggle;
56 };
57
58 struct usbd_bus_methods {
59 usbd_status (*open_pipe)(struct usbd_pipe *pipe);
60 void (*soft_intr)(void *);
61 void (*do_poll)(struct usbd_bus *);
62 usbd_status (*allocm)(struct usbd_bus *, usb_dma_t *,
63 u_int32_t bufsize);
64 void (*freem)(struct usbd_bus *, usb_dma_t *);
65 struct usbd_xfer * (*allocx)(struct usbd_bus *);
66 void (*freex)(struct usbd_bus *, struct usbd_xfer *);
67 };
68
69 struct usbd_pipe_methods {
70 usbd_status (*transfer)(usbd_xfer_handle xfer);
71 usbd_status (*start)(usbd_xfer_handle xfer);
72 void (*abort)(usbd_xfer_handle xfer);
73 void (*close)(usbd_pipe_handle pipe);
74 void (*cleartoggle)(usbd_pipe_handle pipe);
75 void (*done)(usbd_xfer_handle xfer);
76 };
77
78 struct usbd_tt {
79 struct usbd_hub *hub;
80 };
81
82 struct usbd_port {
83 usb_port_status_t status;
84 u_int16_t power;
85 u_int8_t portno;
86 u_int8_t restartcnt;
87 #define USBD_RESTART_MAX 5
88 u_int8_t reattach;
89 struct usbd_device *device;
90 struct usbd_device *parent;
91 struct usbd_tt *tt;
92 };
93
94 struct usbd_hub {
95 usbd_status (*explore)(usbd_device_handle hub);
96 void *hubsoftc;
97 usb_hub_descriptor_t hubdesc;
98 struct usbd_port ports[1];
99 };
100
101 struct usb_softc;
102
103
104
105 struct usbd_bus {
106
107 struct device bdev;
108 struct usbd_bus_methods *methods;
109 u_int32_t pipe_size;
110
111 struct usbd_device *root_hub;
112 usbd_device_handle devices[USB_MAX_DEVICES];
113 char needs_explore;
114 char use_polling;
115 struct usb_softc *usbctl;
116 struct usb_device_stats stats;
117 int intr_context;
118 u_int no_intrs;
119 int usbrev;
120 #define USBREV_UNKNOWN 0
121 #define USBREV_PRE_1_0 1
122 #define USBREV_1_0 2
123 #define USBREV_1_1 3
124 #define USBREV_2_0 4
125 #define USBREV_STR { "unknown", "pre 1.0", "1.0", "1.1", "2.0" }
126
127 #ifdef __HAVE_GENERIC_SOFT_INTERRUPTS
128 void *soft;
129 #endif
130 bus_dma_tag_t dmatag;
131 };
132
133 struct usbd_device {
134 struct usbd_bus *bus;
135 struct usbd_pipe *default_pipe;
136 u_int8_t address;
137 u_int8_t config;
138 u_int8_t depth;
139 u_int8_t speed;
140 u_int8_t self_powered;
141 u_int16_t power;
142 int16_t langid;
143 #define USBD_NOLANG (-1)
144 usb_event_cookie_t cookie;
145 struct usbd_port *powersrc;
146 struct usbd_device *myhub;
147 struct usbd_port *myhsport;
148 struct usbd_endpoint def_ep;
149 usb_endpoint_descriptor_t def_ep_desc;
150 struct usbd_interface *ifaces;
151 usb_device_descriptor_t ddesc;
152 usb_config_descriptor_t *cdesc;
153 const struct usbd_quirks *quirks;
154 struct usbd_hub *hub;
155 struct device **subdevs;
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;
179 char repeat;
180 int interval;
181
182
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
205 usb_device_request_t request;
206
207
208 u_int16_t *frlengths;
209 int nframes;
210
211
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;
223
224 struct timeout 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
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, struct usbd_endpoint *, int,
245 usbd_pipe_handle *pipe);
246 usbd_status usbd_new_device(struct device *parent, usbd_bus_handle bus,
247 int depth, int lowspeed, int port, struct usbd_port *);
248 void usbd_remove_device(usbd_device_handle, struct usbd_port *);
249 int usbd_printBCD(char *cp, size_t len, int bcd);
250 usbd_status usbd_fill_iface_data(usbd_device_handle dev, int i, int a);
251 void usb_free_device(usbd_device_handle);
252
253 usbd_status usb_insert_transfer(usbd_xfer_handle xfer);
254 void usb_transfer_complete(usbd_xfer_handle xfer);
255 void usb_disconnect_port(struct usbd_port *up, struct device *);
256
257
258 void usb_needs_explore(usbd_device_handle);
259 void usb_needs_reattach(usbd_device_handle);
260 void usb_schedsoftintr(struct usbd_bus *);
261
262
263
264
265 #if defined(DIAGNOSTIC) && 0
266 #define SPLUSBCHECK \
267 do { int _s = splusb(), _su = splusb(); \
268 if (!cold && _s != _su) printf("SPLUSBCHECK failed 0x%x!=0x%x, %s:%d\n", \
269 _s, _su, __FILE__, __LINE__); \
270 splx(_s); \
271 } while (0)
272 #else
273 #define SPLUSBCHECK
274 #endif
275
276
277
278
279
280
281
282
283 #define UHUBCF_PORT_DEFAULT -1
284 #define UHUBCF_CONFIGURATION_DEFAULT -1
285 #define UHUBCF_INTERFACE_DEFAULT -1
286 #define UHUBCF_VENDOR_DEFAULT -1
287 #define UHUBCF_PRODUCT_DEFAULT -1
288 #define UHUBCF_RELEASE_DEFAULT -1
289
290 #define UHUBCF_PORT 0
291 #define UHUBCF_CONFIGURATION 1
292 #define UHUBCF_INTERFACE 2
293 #define UHUBCF_VENDOR 3
294 #define UHUBCF_PRODUCT 4
295 #define UHUBCF_RELEASE 5
296
297 #define uhubcf_port cf_loc[UHUBCF_PORT]
298 #define uhubcf_configuration cf_loc[UHUBCF_CONFIGURATION]
299 #define uhubcf_interface cf_loc[UHUBCF_INTERFACE]
300 #define uhubcf_vendor cf_loc[UHUBCF_VENDOR]
301 #define uhubcf_product cf_loc[UHUBCF_PRODUCT]
302 #define uhubcf_release cf_loc[UHUBCF_RELEASE]
303 #define UHUB_UNK_PORT UHUBCF_PORT_DEFAULT
304 #define UHUB_UNK_CONFIGURATION UHUBCF_CONFIGURATION_DEFAULT
305 #define UHUB_UNK_INTERFACE UHUBCF_INTERFACE_DEFAULT
306 #define UHUB_UNK_VENDOR UHUBCF_VENDOR_DEFAULT
307 #define UHUB_UNK_PRODUCT UHUBCF_PRODUCT_DEFAULT
308 #define UHUB_UNK_RELEASE UHUBCF_RELEASE_DEFAULT