xref: /freebsd/sys/dev/usb/usb_generic.c (revision b3aaa0cc21c63d388230c7ef2a80abd631ff20d5)
1 /* $FreeBSD$ */
2 /*-
3  * Copyright (c) 2008 Hans Petter Selasky. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #include <dev/usb/usb_defs.h>
28 #include <dev/usb/usb_mfunc.h>
29 #include <dev/usb/usb.h>
30 #include <dev/usb/usb_ioctl.h>
31 #include <dev/usb/usb_error.h>
32 
33 #define	USB_DEBUG_VAR ugen_debug
34 
35 #include <dev/usb/usb_core.h>
36 #include <dev/usb/usb_mbuf.h>
37 #include <dev/usb/usb_dev.h>
38 #include <dev/usb/usb_process.h>
39 #include <dev/usb/usb_device.h>
40 #include <dev/usb/usb_debug.h>
41 #include <dev/usb/usb_request.h>
42 #include <dev/usb/usb_busdma.h>
43 #include <dev/usb/usb_util.h>
44 #include <dev/usb/usb_hub.h>
45 #include <dev/usb/usb_generic.h>
46 #include <dev/usb/usb_transfer.h>
47 
48 #include <dev/usb/usb_controller.h>
49 #include <dev/usb/usb_bus.h>
50 
51 /* defines */
52 
53 #define	UGEN_BULK_FS_BUFFER_SIZE	(64*32)	/* bytes */
54 #define	UGEN_BULK_HS_BUFFER_SIZE	(1024*32)	/* bytes */
55 #define	UGEN_HW_FRAMES	50		/* number of milliseconds per transfer */
56 
57 /* function prototypes */
58 
59 static usb2_callback_t ugen_read_clear_stall_callback;
60 static usb2_callback_t ugen_write_clear_stall_callback;
61 static usb2_callback_t ugen_default_read_callback;
62 static usb2_callback_t ugen_default_write_callback;
63 static usb2_callback_t ugen_isoc_read_callback;
64 static usb2_callback_t ugen_isoc_write_callback;
65 static usb2_callback_t ugen_default_fs_callback;
66 
67 static usb2_fifo_open_t ugen_open;
68 static usb2_fifo_close_t ugen_close;
69 static usb2_fifo_ioctl_t ugen_ioctl;
70 static usb2_fifo_ioctl_t ugen_ioctl_post;
71 static usb2_fifo_cmd_t ugen_start_read;
72 static usb2_fifo_cmd_t ugen_start_write;
73 static usb2_fifo_cmd_t ugen_stop_io;
74 
75 static int	ugen_transfer_setup(struct usb2_fifo *,
76 		     const struct usb2_config *, uint8_t);
77 static int	ugen_open_pipe_write(struct usb2_fifo *);
78 static int	ugen_open_pipe_read(struct usb2_fifo *);
79 static int	ugen_set_config(struct usb2_fifo *, uint8_t);
80 static int	ugen_set_interface(struct usb2_fifo *, uint8_t, uint8_t);
81 static int	ugen_get_cdesc(struct usb2_fifo *, struct usb2_gen_descriptor *);
82 static int	ugen_get_sdesc(struct usb2_fifo *, struct usb2_gen_descriptor *);
83 static int	ugen_get_iface_driver(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd);
84 static int	usb2_gen_fill_deviceinfo(struct usb2_fifo *,
85 		    struct usb2_device_info *);
86 static int	ugen_re_enumerate(struct usb2_fifo *);
87 static int	ugen_iface_ioctl(struct usb2_fifo *, u_long, void *, int);
88 static uint8_t	ugen_fs_get_complete(struct usb2_fifo *, uint8_t *);
89 static int ugen_fs_uninit(struct usb2_fifo *f);
90 
91 /* structures */
92 
93 struct usb2_fifo_methods usb2_ugen_methods = {
94 	.f_open = &ugen_open,
95 	.f_close = &ugen_close,
96 	.f_ioctl = &ugen_ioctl,
97 	.f_ioctl_post = &ugen_ioctl_post,
98 	.f_start_read = &ugen_start_read,
99 	.f_stop_read = &ugen_stop_io,
100 	.f_start_write = &ugen_start_write,
101 	.f_stop_write = &ugen_stop_io,
102 };
103 
104 #if USB_DEBUG
105 static int ugen_debug = 0;
106 
107 SYSCTL_NODE(_hw_usb2, OID_AUTO, ugen, CTLFLAG_RW, 0, "USB generic");
108 SYSCTL_INT(_hw_usb2_ugen, OID_AUTO, debug, CTLFLAG_RW, &ugen_debug,
109     0, "Debug level");
110 #endif
111 
112 
113 /* prototypes */
114 
115 static int
116 ugen_transfer_setup(struct usb2_fifo *f,
117     const struct usb2_config *setup, uint8_t n_setup)
118 {
119 	struct usb2_pipe *pipe = f->priv_sc0;
120 	struct usb2_device *udev = f->udev;
121 	uint8_t iface_index = pipe->iface_index;
122 	int error;
123 
124 	mtx_unlock(f->priv_mtx);
125 
126 	/*
127 	 * "usb2_transfer_setup()" can sleep so one needs to make a wrapper,
128 	 * exiting the mutex and checking things
129 	 */
130 	error = usb2_transfer_setup(udev, &iface_index, f->xfer,
131 	    setup, n_setup, f, f->priv_mtx);
132 	if (error == 0) {
133 
134 		if (f->xfer[0]->nframes == 1) {
135 			error = usb2_fifo_alloc_buffer(f,
136 			    f->xfer[0]->max_data_length, 2);
137 		} else {
138 			error = usb2_fifo_alloc_buffer(f,
139 			    f->xfer[0]->max_frame_size,
140 			    2 * f->xfer[0]->nframes);
141 		}
142 		if (error) {
143 			usb2_transfer_unsetup(f->xfer, n_setup);
144 		}
145 	}
146 	mtx_lock(f->priv_mtx);
147 
148 	return (error);
149 }
150 
151 static int
152 ugen_open(struct usb2_fifo *f, int fflags, struct thread *td)
153 {
154 	struct usb2_pipe *pipe = f->priv_sc0;
155 	struct usb2_endpoint_descriptor *ed = pipe->edesc;
156 	uint8_t type;
157 
158 	DPRINTFN(6, "flag=0x%x\n", fflags);
159 
160 	mtx_lock(f->priv_mtx);
161 	switch (usb2_get_speed(f->udev)) {
162 	case USB_SPEED_LOW:
163 	case USB_SPEED_FULL:
164 		f->nframes = UGEN_HW_FRAMES;
165 		f->bufsize = UGEN_BULK_FS_BUFFER_SIZE;
166 		break;
167 	default:
168 		f->nframes = UGEN_HW_FRAMES * 8;
169 		f->bufsize = UGEN_BULK_HS_BUFFER_SIZE;
170 		break;
171 	}
172 
173 	type = ed->bmAttributes & UE_XFERTYPE;
174 	if (type == UE_INTERRUPT) {
175 		f->bufsize = 0;		/* use "wMaxPacketSize" */
176 	}
177 	f->timeout = USB_NO_TIMEOUT;
178 	f->flag_short = 0;
179 	f->fifo_zlp = 0;
180 	mtx_unlock(f->priv_mtx);
181 
182 	return (0);
183 }
184 
185 static void
186 ugen_close(struct usb2_fifo *f, int fflags, struct thread *td)
187 {
188 	DPRINTFN(6, "flag=0x%x\n", fflags);
189 
190 	/* cleanup */
191 
192 	mtx_lock(f->priv_mtx);
193 	usb2_transfer_stop(f->xfer[0]);
194 	usb2_transfer_stop(f->xfer[1]);
195 	mtx_unlock(f->priv_mtx);
196 
197 	usb2_transfer_unsetup(f->xfer, 2);
198 	usb2_fifo_free_buffer(f);
199 
200 	if (ugen_fs_uninit(f)) {
201 		/* ignore any errors - we are closing */
202 		DPRINTFN(6, "no FIFOs\n");
203 	}
204 }
205 
206 static int
207 ugen_open_pipe_write(struct usb2_fifo *f)
208 {
209 	struct usb2_config usb2_config[2];
210 	struct usb2_pipe *pipe = f->priv_sc0;
211 	struct usb2_endpoint_descriptor *ed = pipe->edesc;
212 
213 	mtx_assert(f->priv_mtx, MA_OWNED);
214 
215 	if (f->xfer[0] || f->xfer[1]) {
216 		/* transfers are already opened */
217 		return (0);
218 	}
219 	bzero(usb2_config, sizeof(usb2_config));
220 
221 	usb2_config[1].type = UE_CONTROL;
222 	usb2_config[1].endpoint = 0;
223 	usb2_config[1].direction = UE_DIR_ANY;
224 	usb2_config[1].mh.timeout = 1000;	/* 1 second */
225 	usb2_config[1].mh.interval = 50;/* 50 milliseconds */
226 	usb2_config[1].mh.bufsize = sizeof(struct usb2_device_request);
227 	usb2_config[1].mh.callback = &ugen_write_clear_stall_callback;
228 
229 	usb2_config[0].type = ed->bmAttributes & UE_XFERTYPE;
230 	usb2_config[0].endpoint = ed->bEndpointAddress & UE_ADDR;
231 	usb2_config[0].direction = ed->bEndpointAddress & (UE_DIR_OUT | UE_DIR_IN);
232 	usb2_config[0].mh.interval = USB_DEFAULT_INTERVAL;
233 	usb2_config[0].mh.flags.proxy_buffer = 1;
234 
235 	switch (ed->bmAttributes & UE_XFERTYPE) {
236 	case UE_INTERRUPT:
237 	case UE_BULK:
238 		if (f->flag_short) {
239 			usb2_config[0].mh.flags.force_short_xfer = 1;
240 		}
241 		usb2_config[0].mh.callback = &ugen_default_write_callback;
242 		usb2_config[0].mh.timeout = f->timeout;
243 		usb2_config[0].mh.frames = 1;
244 		usb2_config[0].mh.bufsize = f->bufsize;
245 		usb2_config[0].md = usb2_config[0].mh;	/* symmetric config */
246 		if (ugen_transfer_setup(f, usb2_config, 2)) {
247 			return (EIO);
248 		}
249 		/* first transfer does not clear stall */
250 		f->flag_stall = 0;
251 		break;
252 
253 	case UE_ISOCHRONOUS:
254 		usb2_config[0].mh.flags.short_xfer_ok = 1;
255 		usb2_config[0].mh.bufsize = 0;	/* use default */
256 		usb2_config[0].mh.frames = f->nframes;
257 		usb2_config[0].mh.callback = &ugen_isoc_write_callback;
258 		usb2_config[0].mh.timeout = 0;
259 		usb2_config[0].md = usb2_config[0].mh;	/* symmetric config */
260 
261 		/* clone configuration */
262 		usb2_config[1] = usb2_config[0];
263 
264 		if (ugen_transfer_setup(f, usb2_config, 2)) {
265 			return (EIO);
266 		}
267 		break;
268 	default:
269 		return (EINVAL);
270 	}
271 	return (0);
272 }
273 
274 static int
275 ugen_open_pipe_read(struct usb2_fifo *f)
276 {
277 	struct usb2_config usb2_config[2];
278 	struct usb2_pipe *pipe = f->priv_sc0;
279 	struct usb2_endpoint_descriptor *ed = pipe->edesc;
280 
281 	mtx_assert(f->priv_mtx, MA_OWNED);
282 
283 	if (f->xfer[0] || f->xfer[1]) {
284 		/* transfers are already opened */
285 		return (0);
286 	}
287 	bzero(usb2_config, sizeof(usb2_config));
288 
289 	usb2_config[1].type = UE_CONTROL;
290 	usb2_config[1].endpoint = 0;
291 	usb2_config[1].direction = UE_DIR_ANY;
292 	usb2_config[1].mh.timeout = 1000;	/* 1 second */
293 	usb2_config[1].mh.interval = 50;/* 50 milliseconds */
294 	usb2_config[1].mh.bufsize = sizeof(struct usb2_device_request);
295 	usb2_config[1].mh.callback = &ugen_read_clear_stall_callback;
296 
297 	usb2_config[0].type = ed->bmAttributes & UE_XFERTYPE;
298 	usb2_config[0].endpoint = ed->bEndpointAddress & UE_ADDR;
299 	usb2_config[0].direction = UE_DIR_IN;
300 	usb2_config[0].mh.interval = USB_DEFAULT_INTERVAL;
301 	usb2_config[0].mh.flags.proxy_buffer = 1;
302 
303 	switch (ed->bmAttributes & UE_XFERTYPE) {
304 	case UE_INTERRUPT:
305 	case UE_BULK:
306 		if (f->flag_short) {
307 			usb2_config[0].mh.flags.short_xfer_ok = 1;
308 		}
309 		usb2_config[0].mh.timeout = f->timeout;
310 		usb2_config[0].mh.frames = 1;
311 		usb2_config[0].mh.callback = &ugen_default_read_callback;
312 		usb2_config[0].mh.bufsize = f->bufsize;
313 		usb2_config[0].md = usb2_config[0].mh;	/* symmetric config */
314 
315 		if (ugen_transfer_setup(f, usb2_config, 2)) {
316 			return (EIO);
317 		}
318 		/* first transfer does not clear stall */
319 		f->flag_stall = 0;
320 		break;
321 
322 	case UE_ISOCHRONOUS:
323 		usb2_config[0].mh.flags.short_xfer_ok = 1;
324 		usb2_config[0].mh.bufsize = 0;	/* use default */
325 		usb2_config[0].mh.frames = f->nframes;
326 		usb2_config[0].mh.callback = &ugen_isoc_read_callback;
327 		usb2_config[0].mh.timeout = 0;
328 		usb2_config[0].md = usb2_config[0].mh;	/* symmetric config */
329 
330 		/* clone configuration */
331 		usb2_config[1] = usb2_config[0];
332 
333 		if (ugen_transfer_setup(f, usb2_config, 2)) {
334 			return (EIO);
335 		}
336 		break;
337 
338 	default:
339 		return (EINVAL);
340 	}
341 	return (0);
342 }
343 
344 static void
345 ugen_start_read(struct usb2_fifo *f)
346 {
347 	/* check that pipes are open */
348 	if (ugen_open_pipe_read(f)) {
349 		/* signal error */
350 		usb2_fifo_put_data_error(f);
351 	}
352 	/* start transfers */
353 	usb2_transfer_start(f->xfer[0]);
354 	usb2_transfer_start(f->xfer[1]);
355 }
356 
357 static void
358 ugen_start_write(struct usb2_fifo *f)
359 {
360 	/* check that pipes are open */
361 	if (ugen_open_pipe_write(f)) {
362 		/* signal error */
363 		usb2_fifo_get_data_error(f);
364 	}
365 	/* start transfers */
366 	usb2_transfer_start(f->xfer[0]);
367 	usb2_transfer_start(f->xfer[1]);
368 }
369 
370 static void
371 ugen_stop_io(struct usb2_fifo *f)
372 {
373 	/* stop transfers */
374 	usb2_transfer_stop(f->xfer[0]);
375 	usb2_transfer_stop(f->xfer[1]);
376 }
377 
378 static void
379 ugen_default_read_callback(struct usb2_xfer *xfer)
380 {
381 	struct usb2_fifo *f = xfer->priv_sc;
382 	struct usb2_mbuf *m;
383 
384 	DPRINTFN(4, "actlen=%u, aframes=%u\n", xfer->actlen, xfer->aframes);
385 
386 	switch (USB_GET_STATE(xfer)) {
387 	case USB_ST_TRANSFERRED:
388 		if (xfer->actlen == 0) {
389 			if (f->fifo_zlp != 4) {
390 				f->fifo_zlp++;
391 			} else {
392 				/*
393 				 * Throttle a little bit we have multiple ZLPs
394 				 * in a row!
395 				 */
396 				xfer->interval = 64;	/* ms */
397 			}
398 		} else {
399 			/* clear throttle */
400 			xfer->interval = 0;
401 			f->fifo_zlp = 0;
402 		}
403 		usb2_fifo_put_data(f, xfer->frbuffers, 0,
404 		    xfer->actlen, 1);
405 
406 	case USB_ST_SETUP:
407 		if (f->flag_stall) {
408 			usb2_transfer_start(f->xfer[1]);
409 			break;
410 		}
411 		USB_IF_POLL(&f->free_q, m);
412 		if (m) {
413 			xfer->frlengths[0] = xfer->max_data_length;
414 			usb2_start_hardware(xfer);
415 		}
416 		break;
417 
418 	default:			/* Error */
419 		if (xfer->error != USB_ERR_CANCELLED) {
420 			f->flag_stall = 1;
421 			f->fifo_zlp = 0;
422 			usb2_transfer_start(f->xfer[1]);
423 		}
424 		break;
425 	}
426 }
427 
428 static void
429 ugen_default_write_callback(struct usb2_xfer *xfer)
430 {
431 	struct usb2_fifo *f = xfer->priv_sc;
432 	uint32_t actlen;
433 
434 	DPRINTFN(4, "actlen=%u, aframes=%u\n", xfer->actlen, xfer->aframes);
435 
436 	switch (USB_GET_STATE(xfer)) {
437 	case USB_ST_SETUP:
438 	case USB_ST_TRANSFERRED:
439 		/*
440 		 * If writing is in stall, just jump to clear stall
441 		 * callback and solve the situation.
442 		 */
443 		if (f->flag_stall) {
444 			usb2_transfer_start(f->xfer[1]);
445 			break;
446 		}
447 		/*
448 		 * Write data, setup and perform hardware transfer.
449 		 */
450 		if (usb2_fifo_get_data(f, xfer->frbuffers, 0,
451 		    xfer->max_data_length, &actlen, 0)) {
452 			xfer->frlengths[0] = actlen;
453 			usb2_start_hardware(xfer);
454 		}
455 		break;
456 
457 	default:			/* Error */
458 		if (xfer->error != USB_ERR_CANCELLED) {
459 			f->flag_stall = 1;
460 			usb2_transfer_start(f->xfer[1]);
461 		}
462 		break;
463 	}
464 }
465 
466 static void
467 ugen_read_clear_stall_callback(struct usb2_xfer *xfer)
468 {
469 	struct usb2_fifo *f = xfer->priv_sc;
470 	struct usb2_xfer *xfer_other = f->xfer[0];
471 
472 	if (f->flag_stall == 0) {
473 		/* nothing to do */
474 		return;
475 	}
476 	if (usb2_clear_stall_callback(xfer, xfer_other)) {
477 		DPRINTFN(5, "f=%p: stall cleared\n", f);
478 		f->flag_stall = 0;
479 		usb2_transfer_start(xfer_other);
480 	}
481 }
482 
483 static void
484 ugen_write_clear_stall_callback(struct usb2_xfer *xfer)
485 {
486 	struct usb2_fifo *f = xfer->priv_sc;
487 	struct usb2_xfer *xfer_other = f->xfer[0];
488 
489 	if (f->flag_stall == 0) {
490 		/* nothing to do */
491 		return;
492 	}
493 	if (usb2_clear_stall_callback(xfer, xfer_other)) {
494 		DPRINTFN(5, "f=%p: stall cleared\n", f);
495 		f->flag_stall = 0;
496 		usb2_transfer_start(xfer_other);
497 	}
498 }
499 
500 static void
501 ugen_isoc_read_callback(struct usb2_xfer *xfer)
502 {
503 	struct usb2_fifo *f = xfer->priv_sc;
504 	uint32_t offset;
505 	uint16_t n;
506 
507 	DPRINTFN(4, "actlen=%u, aframes=%u\n", xfer->actlen, xfer->aframes);
508 
509 	switch (USB_GET_STATE(xfer)) {
510 	case USB_ST_TRANSFERRED:
511 
512 		DPRINTFN(6, "actlen=%d\n", xfer->actlen);
513 
514 		offset = 0;
515 
516 		for (n = 0; n != xfer->aframes; n++) {
517 			usb2_fifo_put_data(f, xfer->frbuffers, offset,
518 			    xfer->frlengths[n], 1);
519 			offset += xfer->max_frame_size;
520 		}
521 
522 	case USB_ST_SETUP:
523 tr_setup:
524 		for (n = 0; n != xfer->nframes; n++) {
525 			/* setup size for next transfer */
526 			xfer->frlengths[n] = xfer->max_frame_size;
527 		}
528 		usb2_start_hardware(xfer);
529 		break;
530 
531 	default:			/* Error */
532 		if (xfer->error == USB_ERR_CANCELLED) {
533 			break;
534 		}
535 		goto tr_setup;
536 	}
537 }
538 
539 static void
540 ugen_isoc_write_callback(struct usb2_xfer *xfer)
541 {
542 	struct usb2_fifo *f = xfer->priv_sc;
543 	uint32_t actlen;
544 	uint32_t offset;
545 	uint16_t n;
546 
547 	DPRINTFN(4, "actlen=%u, aframes=%u\n", xfer->actlen, xfer->aframes);
548 
549 	switch (USB_GET_STATE(xfer)) {
550 	case USB_ST_TRANSFERRED:
551 	case USB_ST_SETUP:
552 tr_setup:
553 		offset = 0;
554 		for (n = 0; n != xfer->nframes; n++) {
555 			if (usb2_fifo_get_data(f, xfer->frbuffers, offset,
556 			    xfer->max_frame_size, &actlen, 1)) {
557 				xfer->frlengths[n] = actlen;
558 				offset += actlen;
559 			} else {
560 				break;
561 			}
562 		}
563 
564 		for (; n != xfer->nframes; n++) {
565 			/* fill in zero frames */
566 			xfer->frlengths[n] = 0;
567 		}
568 		usb2_start_hardware(xfer);
569 		break;
570 
571 	default:			/* Error */
572 		if (xfer->error == USB_ERR_CANCELLED) {
573 			break;
574 		}
575 		goto tr_setup;
576 	}
577 }
578 
579 static int
580 ugen_set_config(struct usb2_fifo *f, uint8_t index)
581 {
582 	DPRINTFN(2, "index %u\n", index);
583 
584 	if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
585 		/* not possible in device side mode */
586 		return (ENOTTY);
587 	}
588 	if (f->udev->curr_config_index == index) {
589 		/* no change needed */
590 		return (0);
591 	}
592 	/* make sure all FIFO's are gone */
593 	/* else there can be a deadlock */
594 	if (ugen_fs_uninit(f)) {
595 		/* ignore any errors */
596 		DPRINTFN(6, "no FIFOs\n");
597 	}
598 	/* change setting - will free generic FIFOs, if any */
599 	if (usb2_set_config_index(f->udev, index)) {
600 		return (EIO);
601 	}
602 	/* probe and attach */
603 	if (usb2_probe_and_attach(f->udev, USB_IFACE_INDEX_ANY)) {
604 		return (EIO);
605 	}
606 	return (0);
607 }
608 
609 static int
610 ugen_set_interface(struct usb2_fifo *f,
611     uint8_t iface_index, uint8_t alt_index)
612 {
613 	DPRINTFN(2, "%u, %u\n", iface_index, alt_index);
614 
615 	if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
616 		/* not possible in device side mode */
617 		return (ENOTTY);
618 	}
619 	/* make sure all FIFO's are gone */
620 	/* else there can be a deadlock */
621 	if (ugen_fs_uninit(f)) {
622 		/* ignore any errors */
623 		DPRINTFN(6, "no FIFOs\n");
624 	}
625 	/* change setting - will free generic FIFOs, if any */
626 	if (usb2_set_alt_interface_index(f->udev, iface_index, alt_index)) {
627 		return (EIO);
628 	}
629 	/* probe and attach */
630 	if (usb2_probe_and_attach(f->udev, iface_index)) {
631 		return (EIO);
632 	}
633 	return (0);
634 }
635 
636 /*------------------------------------------------------------------------*
637  *	ugen_get_cdesc
638  *
639  * This function will retrieve the complete configuration descriptor
640  * at the given index.
641  *------------------------------------------------------------------------*/
642 static int
643 ugen_get_cdesc(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd)
644 {
645 	struct usb2_config_descriptor *cdesc;
646 	struct usb2_device *udev = f->udev;
647 	int error;
648 	uint16_t len;
649 	uint8_t free_data;
650 
651 	DPRINTFN(6, "\n");
652 
653 	if (ugd->ugd_data == NULL) {
654 		/* userland pointer should not be zero */
655 		return (EINVAL);
656 	}
657 	if ((ugd->ugd_config_index == USB_UNCONFIG_INDEX) ||
658 	    (ugd->ugd_config_index == udev->curr_config_index)) {
659 		cdesc = usb2_get_config_descriptor(udev);
660 		if (cdesc == NULL) {
661 			return (ENXIO);
662 		}
663 		free_data = 0;
664 
665 	} else {
666 		if (usb2_req_get_config_desc_full(udev,
667 		    NULL, &cdesc, M_USBDEV,
668 		    ugd->ugd_config_index)) {
669 			return (ENXIO);
670 		}
671 		free_data = 1;
672 	}
673 
674 	len = UGETW(cdesc->wTotalLength);
675 	if (len > ugd->ugd_maxlen) {
676 		len = ugd->ugd_maxlen;
677 	}
678 	DPRINTFN(6, "len=%u\n", len);
679 
680 	ugd->ugd_actlen = len;
681 	ugd->ugd_offset = 0;
682 
683 	error = copyout(cdesc, ugd->ugd_data, len);
684 
685 	if (free_data) {
686 		free(cdesc, M_USBDEV);
687 	}
688 	return (error);
689 }
690 
691 static int
692 ugen_get_sdesc(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd)
693 {
694 	void *ptr = f->udev->bus->scratch[0].data;
695 	uint16_t size = sizeof(f->udev->bus->scratch[0].data);
696 	int error;
697 
698 	if (usb2_req_get_string_desc(f->udev, NULL, ptr,
699 	    size, ugd->ugd_lang_id, ugd->ugd_string_index)) {
700 		error = EINVAL;
701 	} else {
702 
703 		if (size > ((uint8_t *)ptr)[0]) {
704 			size = ((uint8_t *)ptr)[0];
705 		}
706 		if (size > ugd->ugd_maxlen) {
707 			size = ugd->ugd_maxlen;
708 		}
709 		ugd->ugd_actlen = size;
710 		ugd->ugd_offset = 0;
711 
712 		error = copyout(ptr, ugd->ugd_data, size);
713 	}
714 	return (error);
715 }
716 
717 /*------------------------------------------------------------------------*
718  *	ugen_get_iface_driver
719  *
720  * This function generates an USB interface description for userland.
721  *
722  * Returns:
723  *    0: Success
724  * Else: Failure
725  *------------------------------------------------------------------------*/
726 static int
727 ugen_get_iface_driver(struct usb2_fifo *f, struct usb2_gen_descriptor *ugd)
728 {
729 	struct usb2_device *udev = f->udev;
730 	struct usb2_interface *iface;
731 	const char *ptr;
732 	const char *desc;
733 	unsigned int len;
734 	unsigned int maxlen;
735 	char buf[128];
736 	int error;
737 
738 	DPRINTFN(6, "\n");
739 
740 	if ((ugd->ugd_data == NULL) || (ugd->ugd_maxlen == 0)) {
741 		/* userland pointer should not be zero */
742 		return (EINVAL);
743 	}
744 
745 	iface = usb2_get_iface(udev, ugd->ugd_iface_index);
746 	if ((iface == NULL) || (iface->idesc == NULL)) {
747 		/* invalid interface index */
748 		return (EINVAL);
749 	}
750 
751 	/* read out device nameunit string, if any */
752 	if ((iface->subdev != NULL) &&
753 	    device_is_attached(iface->subdev) &&
754 	    (ptr = device_get_nameunit(iface->subdev)) &&
755 	    (desc = device_get_desc(iface->subdev))) {
756 
757 		/* print description */
758 		snprintf(buf, sizeof(buf), "%s: <%s>", ptr, desc);
759 
760 		/* range checks */
761 		maxlen = ugd->ugd_maxlen - 1;
762 		len = strlen(buf);
763 		if (len > maxlen)
764 			len = maxlen;
765 
766 		/* update actual length, including terminating zero */
767 		ugd->ugd_actlen = len + 1;
768 
769 		/* copy out interface description */
770 		error = copyout(buf, ugd->ugd_data, ugd->ugd_actlen);
771 	} else {
772 		/* zero length string is default */
773 		error = copyout("", ugd->ugd_data, 1);
774 	}
775 	return (error);
776 }
777 
778 /*------------------------------------------------------------------------*
779  *	usb2_gen_fill_deviceinfo
780  *
781  * This function dumps information about an USB device to the
782  * structure pointed to by the "di" argument.
783  *
784  * Returns:
785  *    0: Success
786  * Else: Failure
787  *------------------------------------------------------------------------*/
788 static int
789 usb2_gen_fill_deviceinfo(struct usb2_fifo *f, struct usb2_device_info *di)
790 {
791 	struct usb2_device *udev;
792 	struct usb2_device *hub;
793 
794 	udev = f->udev;
795 
796 	bzero(di, sizeof(di[0]));
797 
798 	di->udi_bus = device_get_unit(udev->bus->bdev);
799 	di->udi_addr = udev->address;
800 	di->udi_index = udev->device_index;
801 	strlcpy(di->udi_serial, udev->serial,
802 	    sizeof(di->udi_serial));
803 	strlcpy(di->udi_vendor, udev->manufacturer,
804 	    sizeof(di->udi_vendor));
805 	strlcpy(di->udi_product, udev->product,
806 	    sizeof(di->udi_product));
807 	usb2_printBCD(di->udi_release, sizeof(di->udi_release),
808 	    UGETW(udev->ddesc.bcdDevice));
809 	di->udi_vendorNo = UGETW(udev->ddesc.idVendor);
810 	di->udi_productNo = UGETW(udev->ddesc.idProduct);
811 	di->udi_releaseNo = UGETW(udev->ddesc.bcdDevice);
812 	di->udi_class = udev->ddesc.bDeviceClass;
813 	di->udi_subclass = udev->ddesc.bDeviceSubClass;
814 	di->udi_protocol = udev->ddesc.bDeviceProtocol;
815 	di->udi_config_no = udev->curr_config_no;
816 	di->udi_config_index = udev->curr_config_index;
817 	di->udi_power = udev->flags.self_powered ? 0 : udev->power;
818 	di->udi_speed = udev->speed;
819 	di->udi_mode = udev->flags.usb2_mode;
820 	di->udi_power_mode = udev->power_mode;
821 	if (udev->flags.suspended) {
822 		di->udi_suspended = 1;
823 	} else {
824 		di->udi_suspended = 0;
825 	}
826 
827 	hub = udev->parent_hub;
828 	if (hub) {
829 		di->udi_hubaddr = hub->address;
830 		di->udi_hubindex = hub->device_index;
831 		di->udi_hubport = udev->port_no;
832 	}
833 	return (0);
834 }
835 
836 /*------------------------------------------------------------------------*
837  *	ugen_check_request
838  *
839  * Return values:
840  * 0: Access allowed
841  * Else: No access
842  *------------------------------------------------------------------------*/
843 static int
844 ugen_check_request(struct usb2_device *udev, struct usb2_device_request *req)
845 {
846 	struct usb2_pipe *pipe;
847 	int error;
848 
849 	/*
850 	 * Avoid requests that would damage the bus integrity:
851 	 */
852 	if (((req->bmRequestType == UT_WRITE_DEVICE) &&
853 	    (req->bRequest == UR_SET_ADDRESS)) ||
854 	    ((req->bmRequestType == UT_WRITE_DEVICE) &&
855 	    (req->bRequest == UR_SET_CONFIG)) ||
856 	    ((req->bmRequestType == UT_WRITE_INTERFACE) &&
857 	    (req->bRequest == UR_SET_INTERFACE))) {
858 		/*
859 		 * These requests can be useful for testing USB drivers.
860 		 */
861 		error = priv_check(curthread, PRIV_DRIVER);
862 		if (error) {
863 			return (error);
864 		}
865 	}
866 	/*
867 	 * Special case - handle clearing of stall
868 	 */
869 	if (req->bmRequestType == UT_WRITE_ENDPOINT) {
870 
871 		pipe = usb2_get_pipe_by_addr(udev, req->wIndex[0]);
872 		if (pipe == NULL) {
873 			return (EINVAL);
874 		}
875 		if (usb2_check_thread_perm(udev, curthread, FREAD | FWRITE,
876 		    pipe->iface_index, req->wIndex[0] & UE_ADDR)) {
877 			return (EPERM);
878 		}
879 		if ((req->bRequest == UR_CLEAR_FEATURE) &&
880 		    (UGETW(req->wValue) == UF_ENDPOINT_HALT)) {
881 			usb2_clear_data_toggle(udev, pipe);
882 		}
883 	}
884 	/* TODO: add more checks to verify the interface index */
885 
886 	return (0);
887 }
888 
889 int
890 ugen_do_request(struct usb2_fifo *f, struct usb2_ctl_request *ur)
891 {
892 	int error;
893 	uint16_t len;
894 	uint16_t actlen;
895 
896 	if (ugen_check_request(f->udev, &ur->ucr_request)) {
897 		return (EPERM);
898 	}
899 	len = UGETW(ur->ucr_request.wLength);
900 
901 	/* check if "ucr_data" is valid */
902 	if (len != 0) {
903 		if (ur->ucr_data == NULL) {
904 			return (EFAULT);
905 		}
906 	}
907 	/* do the USB request */
908 	error = usb2_do_request_flags
909 	    (f->udev, NULL, &ur->ucr_request, ur->ucr_data,
910 	    (ur->ucr_flags & USB_SHORT_XFER_OK) |
911 	    USB_USER_DATA_PTR, &actlen,
912 	    USB_DEFAULT_TIMEOUT);
913 
914 	ur->ucr_actlen = actlen;
915 
916 	if (error) {
917 		error = EIO;
918 	}
919 	return (error);
920 }
921 
922 /*------------------------------------------------------------------------
923  *	ugen_re_enumerate
924  *------------------------------------------------------------------------*/
925 static int
926 ugen_re_enumerate(struct usb2_fifo *f)
927 {
928 	struct usb2_device *udev = f->udev;
929 	int error;
930 
931 	/*
932 	 * This request can be useful for testing USB drivers:
933 	 */
934 	error = priv_check(curthread, PRIV_DRIVER);
935 	if (error) {
936 		return (error);
937 	}
938 	/* get the device unconfigured */
939 	error = ugen_set_config(f, USB_UNCONFIG_INDEX);
940 	if (error) {
941 		return (error);
942 	}
943 	/* do a bus-reset */
944 	mtx_lock(f->priv_mtx);
945 	error = usb2_req_re_enumerate(udev, f->priv_mtx);
946 	mtx_unlock(f->priv_mtx);
947 
948 	if (error) {
949 		return (ENXIO);
950 	}
951 	/* restore configuration to index 0 */
952 	error = ugen_set_config(f, 0);
953 	if (error) {
954 		return (error);
955 	}
956 	return (0);
957 }
958 
959 int
960 ugen_fs_uninit(struct usb2_fifo *f)
961 {
962 	if (f->fs_xfer == NULL) {
963 		return (EINVAL);
964 	}
965 	usb2_transfer_unsetup(f->fs_xfer, f->fs_ep_max);
966 	free(f->fs_xfer, M_USB);
967 	f->fs_xfer = NULL;
968 	f->fs_ep_max = 0;
969 	f->fs_ep_ptr = NULL;
970 	f->flag_iscomplete = 0;
971 	usb2_fifo_free_buffer(f);
972 	return (0);
973 }
974 
975 static uint8_t
976 ugen_fs_get_complete(struct usb2_fifo *f, uint8_t *pindex)
977 {
978 	struct usb2_mbuf *m;
979 
980 	USB_IF_DEQUEUE(&f->used_q, m);
981 
982 	if (m) {
983 		*pindex = *((uint8_t *)(m->cur_data_ptr));
984 
985 		USB_IF_ENQUEUE(&f->free_q, m);
986 
987 		return (0);		/* success */
988 	} else {
989 
990 		*pindex = 0;		/* fix compiler warning */
991 
992 		f->flag_iscomplete = 0;
993 	}
994 	return (1);			/* failure */
995 }
996 
997 static void
998 ugen_fs_set_complete(struct usb2_fifo *f, uint8_t index)
999 {
1000 	struct usb2_mbuf *m;
1001 
1002 	USB_IF_DEQUEUE(&f->free_q, m);
1003 
1004 	if (m == NULL) {
1005 		/* can happen during close */
1006 		DPRINTF("out of buffers\n");
1007 		return;
1008 	}
1009 	USB_MBUF_RESET(m);
1010 
1011 	*((uint8_t *)(m->cur_data_ptr)) = index;
1012 
1013 	USB_IF_ENQUEUE(&f->used_q, m);
1014 
1015 	f->flag_iscomplete = 1;
1016 
1017 	usb2_fifo_wakeup(f);
1018 }
1019 
1020 static int
1021 ugen_fs_copy_in(struct usb2_fifo *f, uint8_t ep_index)
1022 {
1023 	struct usb2_device_request *req;
1024 	struct usb2_xfer *xfer;
1025 	struct usb2_fs_endpoint fs_ep;
1026 	void *uaddr;			/* userland pointer */
1027 	void *kaddr;
1028 	uint32_t offset;
1029 	uint32_t length;
1030 	uint32_t n;
1031 	uint32_t rem;
1032 	int error;
1033 	uint8_t isread;
1034 
1035 	if (ep_index >= f->fs_ep_max) {
1036 		return (EINVAL);
1037 	}
1038 	xfer = f->fs_xfer[ep_index];
1039 	if (xfer == NULL) {
1040 		return (EINVAL);
1041 	}
1042 	mtx_lock(f->priv_mtx);
1043 	if (usb2_transfer_pending(xfer)) {
1044 		mtx_unlock(f->priv_mtx);
1045 		return (EBUSY);		/* should not happen */
1046 	}
1047 	mtx_unlock(f->priv_mtx);
1048 
1049 	error = copyin(f->fs_ep_ptr +
1050 	    ep_index, &fs_ep, sizeof(fs_ep));
1051 	if (error) {
1052 		return (error);
1053 	}
1054 	/* security checks */
1055 
1056 	if (fs_ep.nFrames > xfer->max_frame_count) {
1057 		xfer->error = USB_ERR_INVAL;
1058 		goto complete;
1059 	}
1060 	if (fs_ep.nFrames == 0) {
1061 		xfer->error = USB_ERR_INVAL;
1062 		goto complete;
1063 	}
1064 	error = copyin(fs_ep.ppBuffer,
1065 	    &uaddr, sizeof(uaddr));
1066 	if (error) {
1067 		return (error);
1068 	}
1069 	/* reset first frame */
1070 	usb2_set_frame_offset(xfer, 0, 0);
1071 
1072 	if (xfer->flags_int.control_xfr) {
1073 
1074 		req = xfer->frbuffers[0].buffer;
1075 
1076 		error = copyin(fs_ep.pLength,
1077 		    &length, sizeof(length));
1078 		if (error) {
1079 			return (error);
1080 		}
1081 		if (length >= sizeof(*req)) {
1082 			xfer->error = USB_ERR_INVAL;
1083 			goto complete;
1084 		}
1085 		if (length != 0) {
1086 			error = copyin(uaddr, req, length);
1087 			if (error) {
1088 				return (error);
1089 			}
1090 		}
1091 		if (ugen_check_request(f->udev, req)) {
1092 			xfer->error = USB_ERR_INVAL;
1093 			goto complete;
1094 		}
1095 		xfer->frlengths[0] = length;
1096 
1097 		/* Host mode only ! */
1098 		if ((req->bmRequestType &
1099 		    (UT_READ | UT_WRITE)) == UT_READ) {
1100 			isread = 1;
1101 		} else {
1102 			isread = 0;
1103 		}
1104 		n = 1;
1105 		offset = sizeof(*req);
1106 
1107 	} else {
1108 		/* Device and Host mode */
1109 		if (USB_GET_DATA_ISREAD(xfer)) {
1110 			isread = 1;
1111 		} else {
1112 			isread = 0;
1113 		}
1114 		n = 0;
1115 		offset = 0;
1116 	}
1117 
1118 	rem = xfer->max_data_length;
1119 	xfer->nframes = fs_ep.nFrames;
1120 	xfer->timeout = fs_ep.timeout;
1121 	if (xfer->timeout > 65535) {
1122 		xfer->timeout = 65535;
1123 	}
1124 	if (fs_ep.flags & USB_FS_FLAG_SINGLE_SHORT_OK)
1125 		xfer->flags.short_xfer_ok = 1;
1126 	else
1127 		xfer->flags.short_xfer_ok = 0;
1128 
1129 	if (fs_ep.flags & USB_FS_FLAG_MULTI_SHORT_OK)
1130 		xfer->flags.short_frames_ok = 1;
1131 	else
1132 		xfer->flags.short_frames_ok = 0;
1133 
1134 	if (fs_ep.flags & USB_FS_FLAG_FORCE_SHORT)
1135 		xfer->flags.force_short_xfer = 1;
1136 	else
1137 		xfer->flags.force_short_xfer = 0;
1138 
1139 	if (fs_ep.flags & USB_FS_FLAG_CLEAR_STALL)
1140 		xfer->flags.stall_pipe = 1;
1141 	else
1142 		xfer->flags.stall_pipe = 0;
1143 
1144 	for (; n != xfer->nframes; n++) {
1145 
1146 		error = copyin(fs_ep.pLength + n,
1147 		    &length, sizeof(length));
1148 		if (error) {
1149 			break;
1150 		}
1151 		xfer->frlengths[n] = length;
1152 
1153 		if (length > rem) {
1154 			xfer->error = USB_ERR_INVAL;
1155 			goto complete;
1156 		}
1157 		rem -= length;
1158 
1159 		if (!isread) {
1160 
1161 			/* we need to know the source buffer */
1162 			error = copyin(fs_ep.ppBuffer + n,
1163 			    &uaddr, sizeof(uaddr));
1164 			if (error) {
1165 				break;
1166 			}
1167 			if (xfer->flags_int.isochronous_xfr) {
1168 				/* get kernel buffer address */
1169 				kaddr = xfer->frbuffers[0].buffer;
1170 				kaddr = USB_ADD_BYTES(kaddr, offset);
1171 			} else {
1172 				/* set current frame offset */
1173 				usb2_set_frame_offset(xfer, offset, n);
1174 
1175 				/* get kernel buffer address */
1176 				kaddr = xfer->frbuffers[n].buffer;
1177 			}
1178 
1179 			/* move data */
1180 			error = copyin(uaddr, kaddr, length);
1181 			if (error) {
1182 				break;
1183 			}
1184 		}
1185 		offset += length;
1186 	}
1187 	return (error);
1188 
1189 complete:
1190 	mtx_lock(f->priv_mtx);
1191 	ugen_fs_set_complete(f, ep_index);
1192 	mtx_unlock(f->priv_mtx);
1193 	return (0);
1194 }
1195 
1196 static int
1197 ugen_fs_copy_out(struct usb2_fifo *f, uint8_t ep_index)
1198 {
1199 	struct usb2_device_request *req;
1200 	struct usb2_xfer *xfer;
1201 	struct usb2_fs_endpoint fs_ep;
1202 	struct usb2_fs_endpoint *fs_ep_uptr;	/* userland ptr */
1203 	void *uaddr;			/* userland ptr */
1204 	void *kaddr;
1205 	uint32_t offset;
1206 	uint32_t length;
1207 	uint32_t temp;
1208 	uint32_t n;
1209 	uint32_t rem;
1210 	int error;
1211 	uint8_t isread;
1212 
1213 	if (ep_index >= f->fs_ep_max) {
1214 		return (EINVAL);
1215 	}
1216 	xfer = f->fs_xfer[ep_index];
1217 	if (xfer == NULL) {
1218 		return (EINVAL);
1219 	}
1220 	mtx_lock(f->priv_mtx);
1221 	if (usb2_transfer_pending(xfer)) {
1222 		mtx_unlock(f->priv_mtx);
1223 		return (EBUSY);		/* should not happen */
1224 	}
1225 	mtx_unlock(f->priv_mtx);
1226 
1227 	fs_ep_uptr = f->fs_ep_ptr + ep_index;
1228 	error = copyin(fs_ep_uptr, &fs_ep, sizeof(fs_ep));
1229 	if (error) {
1230 		return (error);
1231 	}
1232 	fs_ep.status = xfer->error;
1233 	fs_ep.aFrames = xfer->aframes;
1234 	fs_ep.isoc_time_complete = xfer->isoc_time_complete;
1235 	if (xfer->error) {
1236 		goto complete;
1237 	}
1238 	if (xfer->flags_int.control_xfr) {
1239 		req = xfer->frbuffers[0].buffer;
1240 
1241 		/* Host mode only ! */
1242 		if ((req->bmRequestType & (UT_READ | UT_WRITE)) == UT_READ) {
1243 			isread = 1;
1244 		} else {
1245 			isread = 0;
1246 		}
1247 		if (xfer->nframes == 0)
1248 			n = 0;		/* should never happen */
1249 		else
1250 			n = 1;
1251 	} else {
1252 		/* Device and Host mode */
1253 		if (USB_GET_DATA_ISREAD(xfer)) {
1254 			isread = 1;
1255 		} else {
1256 			isread = 0;
1257 		}
1258 		n = 0;
1259 	}
1260 
1261 	/* Update lengths and copy out data */
1262 
1263 	rem = xfer->max_data_length;
1264 	offset = 0;
1265 
1266 	for (; n != xfer->nframes; n++) {
1267 
1268 		/* get initial length into "temp" */
1269 		error = copyin(fs_ep.pLength + n,
1270 		    &temp, sizeof(temp));
1271 		if (error) {
1272 			return (error);
1273 		}
1274 		if (temp > rem) {
1275 			/* the userland length has been corrupted */
1276 			DPRINTF("corrupt userland length "
1277 			    "%u > %u\n", temp, rem);
1278 			fs_ep.status = USB_ERR_INVAL;
1279 			goto complete;
1280 		}
1281 		rem -= temp;
1282 
1283 		/* get actual transfer length */
1284 		length = xfer->frlengths[n];
1285 		if (length > temp) {
1286 			/* data overflow */
1287 			fs_ep.status = USB_ERR_INVAL;
1288 			DPRINTF("data overflow %u > %u\n",
1289 			    length, temp);
1290 			goto complete;
1291 		}
1292 		if (isread) {
1293 
1294 			/* we need to know the destination buffer */
1295 			error = copyin(fs_ep.ppBuffer + n,
1296 			    &uaddr, sizeof(uaddr));
1297 			if (error) {
1298 				return (error);
1299 			}
1300 			if (xfer->flags_int.isochronous_xfr) {
1301 				/* only one frame buffer */
1302 				kaddr = USB_ADD_BYTES(
1303 				    xfer->frbuffers[0].buffer, offset);
1304 			} else {
1305 				/* multiple frame buffers */
1306 				kaddr = xfer->frbuffers[n].buffer;
1307 			}
1308 
1309 			/* move data */
1310 			error = copyout(kaddr, uaddr, length);
1311 			if (error) {
1312 				return (error);
1313 			}
1314 		}
1315 		/*
1316 		 * Update offset according to initial length, which is
1317 		 * needed by isochronous transfers!
1318 		 */
1319 		offset += temp;
1320 
1321 		/* update length */
1322 		error = copyout(&length,
1323 		    fs_ep.pLength + n, sizeof(length));
1324 		if (error) {
1325 			return (error);
1326 		}
1327 	}
1328 
1329 complete:
1330 	/* update "aFrames" */
1331 	error = copyout(&fs_ep.aFrames, &fs_ep_uptr->aFrames,
1332 	    sizeof(fs_ep.aFrames));
1333 	if (error)
1334 		goto done;
1335 
1336 	/* update "isoc_time_complete" */
1337 	error = copyout(&fs_ep.isoc_time_complete,
1338 	    &fs_ep_uptr->isoc_time_complete,
1339 	    sizeof(fs_ep.isoc_time_complete));
1340 	if (error)
1341 		goto done;
1342 	/* update "status" */
1343 	error = copyout(&fs_ep.status, &fs_ep_uptr->status,
1344 	    sizeof(fs_ep.status));
1345 done:
1346 	return (error);
1347 }
1348 
1349 static uint8_t
1350 ugen_fifo_in_use(struct usb2_fifo *f, int fflags)
1351 {
1352 	struct usb2_fifo *f_rx;
1353 	struct usb2_fifo *f_tx;
1354 
1355 	f_rx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_RX];
1356 	f_tx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_TX];
1357 
1358 	if ((fflags & FREAD) && f_rx &&
1359 	    (f_rx->xfer[0] || f_rx->xfer[1])) {
1360 		return (1);		/* RX FIFO in use */
1361 	}
1362 	if ((fflags & FWRITE) && f_tx &&
1363 	    (f_tx->xfer[0] || f_tx->xfer[1])) {
1364 		return (1);		/* TX FIFO in use */
1365 	}
1366 	return (0);			/* not in use */
1367 }
1368 
1369 static int
1370 ugen_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags,
1371     struct thread *td)
1372 {
1373 	struct usb2_config usb2_config[1];
1374 	struct usb2_device_request req;
1375 	union {
1376 		struct usb2_fs_complete *pcomp;
1377 		struct usb2_fs_start *pstart;
1378 		struct usb2_fs_stop *pstop;
1379 		struct usb2_fs_open *popen;
1380 		struct usb2_fs_close *pclose;
1381 		struct usb2_fs_clear_stall_sync *pstall;
1382 		void   *addr;
1383 	}     u;
1384 	struct usb2_pipe *pipe;
1385 	struct usb2_endpoint_descriptor *ed;
1386 	int error = 0;
1387 	uint8_t iface_index;
1388 	uint8_t isread;
1389 	uint8_t ep_index;
1390 
1391 	u.addr = addr;
1392 
1393 	DPRINTFN(6, "cmd=0x%08lx\n", cmd);
1394 
1395 	switch (cmd) {
1396 	case USB_FS_COMPLETE:
1397 		mtx_lock(f->priv_mtx);
1398 		error = ugen_fs_get_complete(f, &ep_index);
1399 		mtx_unlock(f->priv_mtx);
1400 
1401 		if (error) {
1402 			error = EBUSY;
1403 			break;
1404 		}
1405 		u.pcomp->ep_index = ep_index;
1406 		error = ugen_fs_copy_out(f, u.pcomp->ep_index);
1407 		break;
1408 
1409 	case USB_FS_START:
1410 		error = ugen_fs_copy_in(f, u.pstart->ep_index);
1411 		if (error) {
1412 			break;
1413 		}
1414 		mtx_lock(f->priv_mtx);
1415 		usb2_transfer_start(f->fs_xfer[u.pstart->ep_index]);
1416 		mtx_unlock(f->priv_mtx);
1417 		break;
1418 
1419 	case USB_FS_STOP:
1420 		if (u.pstop->ep_index >= f->fs_ep_max) {
1421 			error = EINVAL;
1422 			break;
1423 		}
1424 		mtx_lock(f->priv_mtx);
1425 		usb2_transfer_stop(f->fs_xfer[u.pstop->ep_index]);
1426 		mtx_unlock(f->priv_mtx);
1427 		break;
1428 
1429 	case USB_FS_OPEN:
1430 		if (u.popen->ep_index >= f->fs_ep_max) {
1431 			error = EINVAL;
1432 			break;
1433 		}
1434 		if (f->fs_xfer[u.popen->ep_index] != NULL) {
1435 			error = EBUSY;
1436 			break;
1437 		}
1438 		if (u.popen->max_bufsize > USB_FS_MAX_BUFSIZE) {
1439 			u.popen->max_bufsize = USB_FS_MAX_BUFSIZE;
1440 		}
1441 		if (u.popen->max_frames > USB_FS_MAX_FRAMES) {
1442 			u.popen->max_frames = USB_FS_MAX_FRAMES;
1443 			break;
1444 		}
1445 		if (u.popen->max_frames == 0) {
1446 			error = EINVAL;
1447 			break;
1448 		}
1449 		pipe = usb2_get_pipe_by_addr(f->udev, u.popen->ep_no);
1450 		if (pipe == NULL) {
1451 			error = EINVAL;
1452 			break;
1453 		}
1454 		ed = pipe->edesc;
1455 		if (ed == NULL) {
1456 			error = ENXIO;
1457 			break;
1458 		}
1459 		iface_index = pipe->iface_index;
1460 
1461 		error = usb2_check_thread_perm(f->udev, curthread, fflags,
1462 		    iface_index, u.popen->ep_no);
1463 		if (error) {
1464 			break;
1465 		}
1466 		bzero(usb2_config, sizeof(usb2_config));
1467 
1468 		usb2_config[0].type = ed->bmAttributes & UE_XFERTYPE;
1469 		usb2_config[0].endpoint = ed->bEndpointAddress & UE_ADDR;
1470 		usb2_config[0].direction = ed->bEndpointAddress & (UE_DIR_OUT | UE_DIR_IN);
1471 		usb2_config[0].mh.interval = USB_DEFAULT_INTERVAL;
1472 		usb2_config[0].mh.flags.proxy_buffer = 1;
1473 		usb2_config[0].mh.callback = &ugen_default_fs_callback;
1474 		usb2_config[0].mh.timeout = 0;	/* no timeout */
1475 		usb2_config[0].mh.frames = u.popen->max_frames;
1476 		usb2_config[0].mh.bufsize = u.popen->max_bufsize;
1477 		usb2_config[0].md = usb2_config[0].mh;	/* symmetric config */
1478 
1479 		if (usb2_config[0].type == UE_CONTROL) {
1480 			if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
1481 				error = EINVAL;
1482 				break;
1483 			}
1484 		} else {
1485 
1486 			isread = ((usb2_config[0].endpoint &
1487 			    (UE_DIR_IN | UE_DIR_OUT)) == UE_DIR_IN);
1488 
1489 			if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
1490 				isread = !isread;
1491 			}
1492 			/* check permissions */
1493 			if (isread) {
1494 				if (!(fflags & FREAD)) {
1495 					error = EPERM;
1496 					break;
1497 				}
1498 			} else {
1499 				if (!(fflags & FWRITE)) {
1500 					error = EPERM;
1501 					break;
1502 				}
1503 			}
1504 		}
1505 		error = usb2_transfer_setup(f->udev, &iface_index,
1506 		    f->fs_xfer + u.popen->ep_index, usb2_config, 1,
1507 		    f, f->priv_mtx);
1508 		if (error == 0) {
1509 			/* update maximums */
1510 			u.popen->max_packet_length =
1511 			    f->fs_xfer[u.popen->ep_index]->max_frame_size;
1512 			u.popen->max_bufsize =
1513 			    f->fs_xfer[u.popen->ep_index]->max_data_length;
1514 			f->fs_xfer[u.popen->ep_index]->priv_fifo =
1515 			    ((uint8_t *)0) + u.popen->ep_index;
1516 		} else {
1517 			error = ENOMEM;
1518 		}
1519 		break;
1520 
1521 	case USB_FS_CLOSE:
1522 		if (u.pclose->ep_index >= f->fs_ep_max) {
1523 			error = EINVAL;
1524 			break;
1525 		}
1526 		if (f->fs_xfer[u.pclose->ep_index] == NULL) {
1527 			error = EINVAL;
1528 			break;
1529 		}
1530 		usb2_transfer_unsetup(f->fs_xfer + u.pclose->ep_index, 1);
1531 		break;
1532 
1533 	case USB_FS_CLEAR_STALL_SYNC:
1534 		if (u.pstall->ep_index >= f->fs_ep_max) {
1535 			error = EINVAL;
1536 			break;
1537 		}
1538 		if (f->fs_xfer[u.pstall->ep_index] == NULL) {
1539 			error = EINVAL;
1540 			break;
1541 		}
1542 		if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
1543 			error = EINVAL;
1544 			break;
1545 		}
1546 		mtx_lock(f->priv_mtx);
1547 		error = usb2_transfer_pending(f->fs_xfer[u.pstall->ep_index]);
1548 		mtx_unlock(f->priv_mtx);
1549 
1550 		if (error) {
1551 			return (EBUSY);
1552 		}
1553 		pipe = f->fs_xfer[u.pstall->ep_index]->pipe;
1554 
1555 		/* setup a clear-stall packet */
1556 		req.bmRequestType = UT_WRITE_ENDPOINT;
1557 		req.bRequest = UR_CLEAR_FEATURE;
1558 		USETW(req.wValue, UF_ENDPOINT_HALT);
1559 		req.wIndex[0] = pipe->edesc->bEndpointAddress;
1560 		req.wIndex[1] = 0;
1561 		USETW(req.wLength, 0);
1562 
1563 		error = usb2_do_request(f->udev, NULL, &req, NULL);
1564 		if (error == 0) {
1565 			usb2_clear_data_toggle(f->udev, pipe);
1566 		} else {
1567 			error = ENXIO;
1568 		}
1569 		break;
1570 
1571 	default:
1572 		error = ENOIOCTL;
1573 		break;
1574 	}
1575 
1576 	DPRINTFN(6, "error=%d\n", error);
1577 
1578 	return (error);
1579 }
1580 
1581 static int
1582 ugen_set_short_xfer(struct usb2_fifo *f, void *addr)
1583 {
1584 	uint8_t t;
1585 
1586 	if (*(int *)addr)
1587 		t = 1;
1588 	else
1589 		t = 0;
1590 
1591 	if (f->flag_short == t) {
1592 		/* same value like before - accept */
1593 		return (0);
1594 	}
1595 	if (f->xfer[0] || f->xfer[1]) {
1596 		/* cannot change this during transfer */
1597 		return (EBUSY);
1598 	}
1599 	f->flag_short = t;
1600 	return (0);
1601 }
1602 
1603 static int
1604 ugen_set_timeout(struct usb2_fifo *f, void *addr)
1605 {
1606 	f->timeout = *(int *)addr;
1607 	if (f->timeout > 65535) {
1608 		/* limit user input */
1609 		f->timeout = 65535;
1610 	}
1611 	return (0);
1612 }
1613 
1614 static int
1615 ugen_get_frame_size(struct usb2_fifo *f, void *addr)
1616 {
1617 	if (f->xfer[0]) {
1618 		*(int *)addr = f->xfer[0]->max_frame_size;
1619 	} else {
1620 		return (EINVAL);
1621 	}
1622 	return (0);
1623 }
1624 
1625 static int
1626 ugen_set_buffer_size(struct usb2_fifo *f, void *addr)
1627 {
1628 	uint32_t t;
1629 
1630 	if (*(int *)addr < 1024)
1631 		t = 1024;
1632 	else if (*(int *)addr < (256 * 1024))
1633 		t = *(int *)addr;
1634 	else
1635 		t = 256 * 1024;
1636 
1637 	if (f->bufsize == t) {
1638 		/* same value like before - accept */
1639 		return (0);
1640 	}
1641 	if (f->xfer[0] || f->xfer[1]) {
1642 		/* cannot change this during transfer */
1643 		return (EBUSY);
1644 	}
1645 	f->bufsize = t;
1646 	return (0);
1647 }
1648 
1649 static int
1650 ugen_get_buffer_size(struct usb2_fifo *f, void *addr)
1651 {
1652 	*(int *)addr = f->bufsize;
1653 	return (0);
1654 }
1655 
1656 static int
1657 ugen_get_iface_desc(struct usb2_fifo *f,
1658     struct usb2_interface_descriptor *idesc)
1659 {
1660 	struct usb2_interface *iface;
1661 
1662 	iface = usb2_get_iface(f->udev, f->iface_index);
1663 	if (iface && iface->idesc) {
1664 		*idesc = *(iface->idesc);
1665 	} else {
1666 		return (EIO);
1667 	}
1668 	return (0);
1669 }
1670 
1671 static int
1672 ugen_get_endpoint_desc(struct usb2_fifo *f,
1673     struct usb2_endpoint_descriptor *ed)
1674 {
1675 	struct usb2_pipe *pipe;
1676 
1677 	pipe = f->priv_sc0;
1678 
1679 	if (pipe && pipe->edesc) {
1680 		*ed = *pipe->edesc;
1681 	} else {
1682 		return (EINVAL);
1683 	}
1684 	return (0);
1685 }
1686 
1687 static int
1688 ugen_set_power_mode(struct usb2_fifo *f, int mode)
1689 {
1690 	struct usb2_device *udev = f->udev;
1691 	int err;
1692 	uint8_t old_mode;
1693 
1694 	if ((udev == NULL) ||
1695 	    (udev->parent_hub == NULL)) {
1696 		return (EINVAL);
1697 	}
1698 	err = priv_check(curthread, PRIV_ROOT);
1699 	if (err)
1700 		return (err);
1701 
1702 	/* get old power mode */
1703 	old_mode = udev->power_mode;
1704 
1705 	/* if no change, then just return */
1706 	if (old_mode == mode)
1707 		return (0);
1708 
1709 	switch (mode) {
1710 	case USB_POWER_MODE_OFF:
1711 		/* get the device unconfigured */
1712 		err = ugen_set_config(f, USB_UNCONFIG_INDEX);
1713 		if (err) {
1714 			DPRINTFN(0, "Could not unconfigure "
1715 			    "device (ignored)\n");
1716 		}
1717 
1718 		/* clear port enable */
1719 		err = usb2_req_clear_port_feature(udev->parent_hub,
1720 		    NULL, udev->port_no, UHF_PORT_ENABLE);
1721 		break;
1722 
1723 	case USB_POWER_MODE_ON:
1724 	case USB_POWER_MODE_SAVE:
1725 		break;
1726 
1727 	case USB_POWER_MODE_RESUME:
1728 		err = usb2_req_clear_port_feature(udev->parent_hub,
1729 		    NULL, udev->port_no, UHF_PORT_SUSPEND);
1730 		mode = USB_POWER_MODE_SAVE;
1731 		break;
1732 
1733 	case USB_POWER_MODE_SUSPEND:
1734 		err = usb2_req_set_port_feature(udev->parent_hub,
1735 		    NULL, udev->port_no, UHF_PORT_SUSPEND);
1736 		mode = USB_POWER_MODE_SAVE;
1737 		break;
1738 
1739 	default:
1740 		return (EINVAL);
1741 	}
1742 
1743 	if (err)
1744 		return (ENXIO);		/* I/O failure */
1745 
1746 	/* if we are powered off we need to re-enumerate first */
1747 	if (old_mode == USB_POWER_MODE_OFF) {
1748 		err = ugen_re_enumerate(f);
1749 		if (err)
1750 			return (err);
1751 	}
1752 
1753 	/* set new power mode */
1754 	usb2_set_power_mode(udev, mode);
1755 
1756 	return (0);			/* success */
1757 }
1758 
1759 static int
1760 ugen_get_power_mode(struct usb2_fifo *f)
1761 {
1762 	struct usb2_device *udev = f->udev;
1763 
1764 	if ((udev == NULL) ||
1765 	    (udev->parent_hub == NULL)) {
1766 		return (USB_POWER_MODE_ON);
1767 	}
1768 	return (udev->power_mode);
1769 }
1770 
1771 static int
1772 ugen_do_port_feature(struct usb2_fifo *f, uint8_t port_no,
1773     uint8_t set, uint16_t feature)
1774 {
1775 	struct usb2_device *udev = f->udev;
1776 	struct usb2_hub *hub;
1777 	int err;
1778 
1779 	err = priv_check(curthread, PRIV_ROOT);
1780 	if (err) {
1781 		return (err);
1782 	}
1783 	if (port_no == 0) {
1784 		return (EINVAL);
1785 	}
1786 	if ((udev == NULL) ||
1787 	    (udev->hub == NULL)) {
1788 		return (EINVAL);
1789 	}
1790 	hub = udev->hub;
1791 
1792 	if (port_no > hub->nports) {
1793 		return (EINVAL);
1794 	}
1795 	if (set)
1796 		err = usb2_req_set_port_feature(udev,
1797 		    NULL, port_no, feature);
1798 	else
1799 		err = usb2_req_clear_port_feature(udev,
1800 		    NULL, port_no, feature);
1801 
1802 	if (err)
1803 		return (ENXIO);		/* failure */
1804 
1805 	return (0);			/* success */
1806 }
1807 
1808 static int
1809 ugen_iface_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags)
1810 {
1811 	struct usb2_fifo *f_rx;
1812 	struct usb2_fifo *f_tx;
1813 	int error = 0;
1814 
1815 	f_rx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_RX];
1816 	f_tx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_TX];
1817 
1818 	switch (cmd) {
1819 	case USB_SET_RX_SHORT_XFER:
1820 		if (fflags & FREAD) {
1821 			error = ugen_set_short_xfer(f_rx, addr);
1822 		} else {
1823 			error = EINVAL;
1824 		}
1825 		break;
1826 
1827 	case USB_SET_TX_FORCE_SHORT:
1828 		if (fflags & FWRITE) {
1829 			error = ugen_set_short_xfer(f_tx, addr);
1830 		} else {
1831 			error = EINVAL;
1832 		}
1833 		break;
1834 
1835 	case USB_SET_RX_TIMEOUT:
1836 		if (fflags & FREAD) {
1837 			error = ugen_set_timeout(f_rx, addr);
1838 		} else {
1839 			error = EINVAL;
1840 		}
1841 		break;
1842 
1843 	case USB_SET_TX_TIMEOUT:
1844 		if (fflags & FWRITE) {
1845 			error = ugen_set_timeout(f_tx, addr);
1846 		} else {
1847 			error = EINVAL;
1848 		}
1849 		break;
1850 
1851 	case USB_GET_RX_FRAME_SIZE:
1852 		if (fflags & FREAD) {
1853 			error = ugen_get_frame_size(f_rx, addr);
1854 		} else {
1855 			error = EINVAL;
1856 		}
1857 		break;
1858 
1859 	case USB_GET_TX_FRAME_SIZE:
1860 		if (fflags & FWRITE) {
1861 			error = ugen_get_frame_size(f_tx, addr);
1862 		} else {
1863 			error = EINVAL;
1864 		}
1865 		break;
1866 
1867 	case USB_SET_RX_BUFFER_SIZE:
1868 		if (fflags & FREAD) {
1869 			error = ugen_set_buffer_size(f_rx, addr);
1870 		} else {
1871 			error = EINVAL;
1872 		}
1873 		break;
1874 
1875 	case USB_SET_TX_BUFFER_SIZE:
1876 		if (fflags & FWRITE) {
1877 			error = ugen_set_buffer_size(f_tx, addr);
1878 		} else {
1879 			error = EINVAL;
1880 		}
1881 		break;
1882 
1883 	case USB_GET_RX_BUFFER_SIZE:
1884 		if (fflags & FREAD) {
1885 			error = ugen_get_buffer_size(f_rx, addr);
1886 		} else {
1887 			error = EINVAL;
1888 		}
1889 		break;
1890 
1891 	case USB_GET_TX_BUFFER_SIZE:
1892 		if (fflags & FWRITE) {
1893 			error = ugen_get_buffer_size(f_tx, addr);
1894 		} else {
1895 			error = EINVAL;
1896 		}
1897 		break;
1898 
1899 	case USB_GET_RX_INTERFACE_DESC:
1900 		if (fflags & FREAD) {
1901 			error = ugen_get_iface_desc(f_rx, addr);
1902 		} else {
1903 			error = EINVAL;
1904 		}
1905 		break;
1906 
1907 	case USB_GET_TX_INTERFACE_DESC:
1908 		if (fflags & FWRITE) {
1909 			error = ugen_get_iface_desc(f_tx, addr);
1910 		} else {
1911 			error = EINVAL;
1912 		}
1913 		break;
1914 
1915 	case USB_GET_RX_ENDPOINT_DESC:
1916 		if (fflags & FREAD) {
1917 			error = ugen_get_endpoint_desc(f_rx, addr);
1918 		} else {
1919 			error = EINVAL;
1920 		}
1921 		break;
1922 
1923 	case USB_GET_TX_ENDPOINT_DESC:
1924 		if (fflags & FWRITE) {
1925 			error = ugen_get_endpoint_desc(f_tx, addr);
1926 		} else {
1927 			error = EINVAL;
1928 		}
1929 		break;
1930 
1931 	case USB_SET_RX_STALL_FLAG:
1932 		if ((fflags & FREAD) && (*(int *)addr)) {
1933 			f_rx->flag_stall = 1;
1934 		}
1935 		break;
1936 
1937 	case USB_SET_TX_STALL_FLAG:
1938 		if ((fflags & FWRITE) && (*(int *)addr)) {
1939 			f_tx->flag_stall = 1;
1940 		}
1941 		break;
1942 
1943 	default:
1944 		error = ENOIOCTL;
1945 		break;
1946 	}
1947 	return (error);
1948 }
1949 
1950 static int
1951 ugen_ioctl_post(struct usb2_fifo *f, u_long cmd, void *addr, int fflags,
1952     struct thread *td)
1953 {
1954 	union {
1955 		struct usb2_interface_descriptor *idesc;
1956 		struct usb2_alt_interface *ai;
1957 		struct usb2_device_descriptor *ddesc;
1958 		struct usb2_config_descriptor *cdesc;
1959 		struct usb2_device_stats *stat;
1960 		struct usb2_fs_init *pinit;
1961 		struct usb2_fs_uninit *puninit;
1962 		uint32_t *ptime;
1963 		void   *addr;
1964 		int    *pint;
1965 	}     u;
1966 	struct usb2_device_descriptor *dtemp;
1967 	struct usb2_config_descriptor *ctemp;
1968 	struct usb2_interface *iface;
1969 	int error = 0;
1970 	uint8_t n;
1971 
1972 	u.addr = addr;
1973 
1974 	DPRINTFN(6, "cmd=0x%08lx\n", cmd);
1975 
1976 	switch (cmd) {
1977 	case USB_DISCOVER:
1978 		usb2_needs_explore_all();
1979 		break;
1980 
1981 	case USB_SETDEBUG:
1982 		if (!(fflags & FWRITE)) {
1983 			error = EPERM;
1984 			break;
1985 		}
1986 		usb2_debug = *(int *)addr;
1987 		break;
1988 
1989 	case USB_GET_CONFIG:
1990 		*(int *)addr = f->udev->curr_config_index;
1991 		break;
1992 
1993 	case USB_SET_CONFIG:
1994 		if (!(fflags & FWRITE)) {
1995 			error = EPERM;
1996 			break;
1997 		}
1998 		error = ugen_set_config(f, *(int *)addr);
1999 		break;
2000 
2001 	case USB_GET_ALTINTERFACE:
2002 		iface = usb2_get_iface(f->udev,
2003 		    u.ai->uai_interface_index);
2004 		if (iface && iface->idesc) {
2005 			u.ai->uai_alt_index = iface->alt_index;
2006 		} else {
2007 			error = EINVAL;
2008 		}
2009 		break;
2010 
2011 	case USB_SET_ALTINTERFACE:
2012 		if (!(fflags & FWRITE)) {
2013 			error = EPERM;
2014 			break;
2015 		}
2016 		error = ugen_set_interface(f,
2017 		    u.ai->uai_interface_index, u.ai->uai_alt_index);
2018 		break;
2019 
2020 	case USB_GET_DEVICE_DESC:
2021 		dtemp = usb2_get_device_descriptor(f->udev);
2022 		if (!dtemp) {
2023 			error = EIO;
2024 			break;
2025 		}
2026 		*u.ddesc = *dtemp;
2027 		break;
2028 
2029 	case USB_GET_CONFIG_DESC:
2030 		ctemp = usb2_get_config_descriptor(f->udev);
2031 		if (!ctemp) {
2032 			error = EIO;
2033 			break;
2034 		}
2035 		*u.cdesc = *ctemp;
2036 		break;
2037 
2038 	case USB_GET_FULL_DESC:
2039 		error = ugen_get_cdesc(f, addr);
2040 		break;
2041 
2042 	case USB_GET_STRING_DESC:
2043 		error = ugen_get_sdesc(f, addr);
2044 		break;
2045 
2046 	case USB_GET_IFACE_DRIVER:
2047 		error = ugen_get_iface_driver(f, addr);
2048 		break;
2049 
2050 	case USB_REQUEST:
2051 	case USB_DO_REQUEST:
2052 		if (!(fflags & FWRITE)) {
2053 			error = EPERM;
2054 			break;
2055 		}
2056 		error = ugen_do_request(f, addr);
2057 		break;
2058 
2059 	case USB_DEVICEINFO:
2060 	case USB_GET_DEVICEINFO:
2061 		error = usb2_gen_fill_deviceinfo(f, addr);
2062 		break;
2063 
2064 	case USB_DEVICESTATS:
2065 		for (n = 0; n != 4; n++) {
2066 
2067 			u.stat->uds_requests_fail[n] =
2068 			    f->udev->bus->stats_err.uds_requests[n];
2069 
2070 			u.stat->uds_requests_ok[n] =
2071 			    f->udev->bus->stats_ok.uds_requests[n];
2072 		}
2073 		break;
2074 
2075 	case USB_DEVICEENUMERATE:
2076 		error = ugen_re_enumerate(f);
2077 		break;
2078 
2079 	case USB_GET_PLUGTIME:
2080 		*u.ptime = f->udev->plugtime;
2081 		break;
2082 
2083 	case USB_CLAIM_INTERFACE:
2084 	case USB_RELEASE_INTERFACE:
2085 		/* TODO */
2086 		break;
2087 
2088 	case USB_IFACE_DRIVER_ACTIVE:
2089 		/* TODO */
2090 		*u.pint = 0;
2091 		break;
2092 
2093 	case USB_IFACE_DRIVER_DETACH:
2094 		/* TODO */
2095 		error = priv_check(curthread, PRIV_DRIVER);
2096 		if (error) {
2097 			break;
2098 		}
2099 		error = EINVAL;
2100 		break;
2101 
2102 	case USB_SET_POWER_MODE:
2103 		error = ugen_set_power_mode(f, *u.pint);
2104 		break;
2105 
2106 	case USB_GET_POWER_MODE:
2107 		*u.pint = ugen_get_power_mode(f);
2108 		break;
2109 
2110 	case USB_SET_PORT_ENABLE:
2111 		error = ugen_do_port_feature(f,
2112 		    *u.pint, 1, UHF_PORT_ENABLE);
2113 		break;
2114 
2115 	case USB_SET_PORT_DISABLE:
2116 		error = ugen_do_port_feature(f,
2117 		    *u.pint, 0, UHF_PORT_ENABLE);
2118 		break;
2119 
2120 	case USB_FS_INIT:
2121 		/* verify input parameters */
2122 		if (u.pinit->pEndpoints == NULL) {
2123 			error = EINVAL;
2124 			break;
2125 		}
2126 		if (u.pinit->ep_index_max > 127) {
2127 			error = EINVAL;
2128 			break;
2129 		}
2130 		if (u.pinit->ep_index_max == 0) {
2131 			error = EINVAL;
2132 			break;
2133 		}
2134 		if (f->fs_xfer != NULL) {
2135 			error = EBUSY;
2136 			break;
2137 		}
2138 		if (f->dev_ep_index != 0) {
2139 			error = EINVAL;
2140 			break;
2141 		}
2142 		if (ugen_fifo_in_use(f, fflags)) {
2143 			error = EBUSY;
2144 			break;
2145 		}
2146 		error = usb2_fifo_alloc_buffer(f, 1, u.pinit->ep_index_max);
2147 		if (error) {
2148 			break;
2149 		}
2150 		f->fs_xfer = malloc(sizeof(f->fs_xfer[0]) *
2151 		    u.pinit->ep_index_max, M_USB, M_WAITOK | M_ZERO);
2152 		if (f->fs_xfer == NULL) {
2153 			usb2_fifo_free_buffer(f);
2154 			error = ENOMEM;
2155 			break;
2156 		}
2157 		f->fs_ep_max = u.pinit->ep_index_max;
2158 		f->fs_ep_ptr = u.pinit->pEndpoints;
2159 		break;
2160 
2161 	case USB_FS_UNINIT:
2162 		if (u.puninit->dummy != 0) {
2163 			error = EINVAL;
2164 			break;
2165 		}
2166 		error = ugen_fs_uninit(f);
2167 		break;
2168 
2169 	default:
2170 		mtx_lock(f->priv_mtx);
2171 		error = ugen_iface_ioctl(f, cmd, addr, fflags);
2172 		mtx_unlock(f->priv_mtx);
2173 		break;
2174 	}
2175 	DPRINTFN(6, "error=%d\n", error);
2176 	return (error);
2177 }
2178 
2179 static void
2180 ugen_default_fs_callback(struct usb2_xfer *xfer)
2181 {
2182 	;				/* workaround for a bug in "indent" */
2183 
2184 	DPRINTF("st=%u alen=%u aframes=%u\n",
2185 	    USB_GET_STATE(xfer), xfer->actlen, xfer->aframes);
2186 
2187 	switch (USB_GET_STATE(xfer)) {
2188 	case USB_ST_SETUP:
2189 		usb2_start_hardware(xfer);
2190 		break;
2191 	default:
2192 		ugen_fs_set_complete(xfer->priv_sc, USB_P2U(xfer->priv_fifo));
2193 		break;
2194 	}
2195 }
2196