xref: /freebsd/sys/dev/usb/usb_generic.c (revision 0ca4746bcb3706a2addff90cd71ca9c0b22ad8ff)
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)
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)
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 ((req->bRequest == UR_CLEAR_FEATURE) &&
876 		    (UGETW(req->wValue) == UF_ENDPOINT_HALT)) {
877 			usb2_clear_data_toggle(udev, pipe);
878 		}
879 	}
880 	/* TODO: add more checks to verify the interface index */
881 
882 	return (0);
883 }
884 
885 int
886 ugen_do_request(struct usb2_fifo *f, struct usb2_ctl_request *ur)
887 {
888 	int error;
889 	uint16_t len;
890 	uint16_t actlen;
891 
892 	if (ugen_check_request(f->udev, &ur->ucr_request)) {
893 		return (EPERM);
894 	}
895 	len = UGETW(ur->ucr_request.wLength);
896 
897 	/* check if "ucr_data" is valid */
898 	if (len != 0) {
899 		if (ur->ucr_data == NULL) {
900 			return (EFAULT);
901 		}
902 	}
903 	/* do the USB request */
904 	error = usb2_do_request_flags
905 	    (f->udev, NULL, &ur->ucr_request, ur->ucr_data,
906 	    (ur->ucr_flags & USB_SHORT_XFER_OK) |
907 	    USB_USER_DATA_PTR, &actlen,
908 	    USB_DEFAULT_TIMEOUT);
909 
910 	ur->ucr_actlen = actlen;
911 
912 	if (error) {
913 		error = EIO;
914 	}
915 	return (error);
916 }
917 
918 /*------------------------------------------------------------------------
919  *	ugen_re_enumerate
920  *------------------------------------------------------------------------*/
921 static int
922 ugen_re_enumerate(struct usb2_fifo *f)
923 {
924 	struct usb2_device *udev = f->udev;
925 	int error;
926 
927 	/*
928 	 * This request can be useful for testing USB drivers:
929 	 */
930 	error = priv_check(curthread, PRIV_DRIVER);
931 	if (error) {
932 		return (error);
933 	}
934 	/* get the device unconfigured */
935 	error = ugen_set_config(f, USB_UNCONFIG_INDEX);
936 	if (error) {
937 		return (error);
938 	}
939 	/* do a bus-reset */
940 	mtx_lock(f->priv_mtx);
941 	error = usb2_req_re_enumerate(udev, f->priv_mtx);
942 	mtx_unlock(f->priv_mtx);
943 
944 	if (error) {
945 		return (ENXIO);
946 	}
947 	/* restore configuration to index 0 */
948 	error = ugen_set_config(f, 0);
949 	if (error) {
950 		return (error);
951 	}
952 	return (0);
953 }
954 
955 int
956 ugen_fs_uninit(struct usb2_fifo *f)
957 {
958 	if (f->fs_xfer == NULL) {
959 		return (EINVAL);
960 	}
961 	usb2_transfer_unsetup(f->fs_xfer, f->fs_ep_max);
962 	free(f->fs_xfer, M_USB);
963 	f->fs_xfer = NULL;
964 	f->fs_ep_max = 0;
965 	f->fs_ep_ptr = NULL;
966 	f->flag_iscomplete = 0;
967 	usb2_fifo_free_buffer(f);
968 	return (0);
969 }
970 
971 static uint8_t
972 ugen_fs_get_complete(struct usb2_fifo *f, uint8_t *pindex)
973 {
974 	struct usb2_mbuf *m;
975 
976 	USB_IF_DEQUEUE(&f->used_q, m);
977 
978 	if (m) {
979 		*pindex = *((uint8_t *)(m->cur_data_ptr));
980 
981 		USB_IF_ENQUEUE(&f->free_q, m);
982 
983 		return (0);		/* success */
984 	} else {
985 
986 		*pindex = 0;		/* fix compiler warning */
987 
988 		f->flag_iscomplete = 0;
989 	}
990 	return (1);			/* failure */
991 }
992 
993 static void
994 ugen_fs_set_complete(struct usb2_fifo *f, uint8_t index)
995 {
996 	struct usb2_mbuf *m;
997 
998 	USB_IF_DEQUEUE(&f->free_q, m);
999 
1000 	if (m == NULL) {
1001 		/* can happen during close */
1002 		DPRINTF("out of buffers\n");
1003 		return;
1004 	}
1005 	USB_MBUF_RESET(m);
1006 
1007 	*((uint8_t *)(m->cur_data_ptr)) = index;
1008 
1009 	USB_IF_ENQUEUE(&f->used_q, m);
1010 
1011 	f->flag_iscomplete = 1;
1012 
1013 	usb2_fifo_wakeup(f);
1014 }
1015 
1016 static int
1017 ugen_fs_copy_in(struct usb2_fifo *f, uint8_t ep_index)
1018 {
1019 	struct usb2_device_request *req;
1020 	struct usb2_xfer *xfer;
1021 	struct usb2_fs_endpoint fs_ep;
1022 	void *uaddr;			/* userland pointer */
1023 	void *kaddr;
1024 	uint32_t offset;
1025 	uint32_t length;
1026 	uint32_t n;
1027 	uint32_t rem;
1028 	int error;
1029 	uint8_t isread;
1030 
1031 	if (ep_index >= f->fs_ep_max) {
1032 		return (EINVAL);
1033 	}
1034 	xfer = f->fs_xfer[ep_index];
1035 	if (xfer == NULL) {
1036 		return (EINVAL);
1037 	}
1038 	mtx_lock(f->priv_mtx);
1039 	if (usb2_transfer_pending(xfer)) {
1040 		mtx_unlock(f->priv_mtx);
1041 		return (EBUSY);		/* should not happen */
1042 	}
1043 	mtx_unlock(f->priv_mtx);
1044 
1045 	error = copyin(f->fs_ep_ptr +
1046 	    ep_index, &fs_ep, sizeof(fs_ep));
1047 	if (error) {
1048 		return (error);
1049 	}
1050 	/* security checks */
1051 
1052 	if (fs_ep.nFrames > xfer->max_frame_count) {
1053 		xfer->error = USB_ERR_INVAL;
1054 		goto complete;
1055 	}
1056 	if (fs_ep.nFrames == 0) {
1057 		xfer->error = USB_ERR_INVAL;
1058 		goto complete;
1059 	}
1060 	error = copyin(fs_ep.ppBuffer,
1061 	    &uaddr, sizeof(uaddr));
1062 	if (error) {
1063 		return (error);
1064 	}
1065 	/* reset first frame */
1066 	usb2_set_frame_offset(xfer, 0, 0);
1067 
1068 	if (xfer->flags_int.control_xfr) {
1069 
1070 		req = xfer->frbuffers[0].buffer;
1071 
1072 		error = copyin(fs_ep.pLength,
1073 		    &length, sizeof(length));
1074 		if (error) {
1075 			return (error);
1076 		}
1077 		if (length >= sizeof(*req)) {
1078 			xfer->error = USB_ERR_INVAL;
1079 			goto complete;
1080 		}
1081 		if (length != 0) {
1082 			error = copyin(uaddr, req, length);
1083 			if (error) {
1084 				return (error);
1085 			}
1086 		}
1087 		if (ugen_check_request(f->udev, req)) {
1088 			xfer->error = USB_ERR_INVAL;
1089 			goto complete;
1090 		}
1091 		xfer->frlengths[0] = length;
1092 
1093 		/* Host mode only ! */
1094 		if ((req->bmRequestType &
1095 		    (UT_READ | UT_WRITE)) == UT_READ) {
1096 			isread = 1;
1097 		} else {
1098 			isread = 0;
1099 		}
1100 		n = 1;
1101 		offset = sizeof(*req);
1102 
1103 	} else {
1104 		/* Device and Host mode */
1105 		if (USB_GET_DATA_ISREAD(xfer)) {
1106 			isread = 1;
1107 		} else {
1108 			isread = 0;
1109 		}
1110 		n = 0;
1111 		offset = 0;
1112 	}
1113 
1114 	rem = xfer->max_data_length;
1115 	xfer->nframes = fs_ep.nFrames;
1116 	xfer->timeout = fs_ep.timeout;
1117 	if (xfer->timeout > 65535) {
1118 		xfer->timeout = 65535;
1119 	}
1120 	if (fs_ep.flags & USB_FS_FLAG_SINGLE_SHORT_OK)
1121 		xfer->flags.short_xfer_ok = 1;
1122 	else
1123 		xfer->flags.short_xfer_ok = 0;
1124 
1125 	if (fs_ep.flags & USB_FS_FLAG_MULTI_SHORT_OK)
1126 		xfer->flags.short_frames_ok = 1;
1127 	else
1128 		xfer->flags.short_frames_ok = 0;
1129 
1130 	if (fs_ep.flags & USB_FS_FLAG_FORCE_SHORT)
1131 		xfer->flags.force_short_xfer = 1;
1132 	else
1133 		xfer->flags.force_short_xfer = 0;
1134 
1135 	if (fs_ep.flags & USB_FS_FLAG_CLEAR_STALL)
1136 		xfer->flags.stall_pipe = 1;
1137 	else
1138 		xfer->flags.stall_pipe = 0;
1139 
1140 	for (; n != xfer->nframes; n++) {
1141 
1142 		error = copyin(fs_ep.pLength + n,
1143 		    &length, sizeof(length));
1144 		if (error) {
1145 			break;
1146 		}
1147 		xfer->frlengths[n] = length;
1148 
1149 		if (length > rem) {
1150 			xfer->error = USB_ERR_INVAL;
1151 			goto complete;
1152 		}
1153 		rem -= length;
1154 
1155 		if (!isread) {
1156 
1157 			/* we need to know the source buffer */
1158 			error = copyin(fs_ep.ppBuffer + n,
1159 			    &uaddr, sizeof(uaddr));
1160 			if (error) {
1161 				break;
1162 			}
1163 			if (xfer->flags_int.isochronous_xfr) {
1164 				/* get kernel buffer address */
1165 				kaddr = xfer->frbuffers[0].buffer;
1166 				kaddr = USB_ADD_BYTES(kaddr, offset);
1167 			} else {
1168 				/* set current frame offset */
1169 				usb2_set_frame_offset(xfer, offset, n);
1170 
1171 				/* get kernel buffer address */
1172 				kaddr = xfer->frbuffers[n].buffer;
1173 			}
1174 
1175 			/* move data */
1176 			error = copyin(uaddr, kaddr, length);
1177 			if (error) {
1178 				break;
1179 			}
1180 		}
1181 		offset += length;
1182 	}
1183 	return (error);
1184 
1185 complete:
1186 	mtx_lock(f->priv_mtx);
1187 	ugen_fs_set_complete(f, ep_index);
1188 	mtx_unlock(f->priv_mtx);
1189 	return (0);
1190 }
1191 
1192 static int
1193 ugen_fs_copy_out(struct usb2_fifo *f, uint8_t ep_index)
1194 {
1195 	struct usb2_device_request *req;
1196 	struct usb2_xfer *xfer;
1197 	struct usb2_fs_endpoint fs_ep;
1198 	struct usb2_fs_endpoint *fs_ep_uptr;	/* userland ptr */
1199 	void *uaddr;			/* userland ptr */
1200 	void *kaddr;
1201 	uint32_t offset;
1202 	uint32_t length;
1203 	uint32_t temp;
1204 	uint32_t n;
1205 	uint32_t rem;
1206 	int error;
1207 	uint8_t isread;
1208 
1209 	if (ep_index >= f->fs_ep_max) {
1210 		return (EINVAL);
1211 	}
1212 	xfer = f->fs_xfer[ep_index];
1213 	if (xfer == NULL) {
1214 		return (EINVAL);
1215 	}
1216 	mtx_lock(f->priv_mtx);
1217 	if (usb2_transfer_pending(xfer)) {
1218 		mtx_unlock(f->priv_mtx);
1219 		return (EBUSY);		/* should not happen */
1220 	}
1221 	mtx_unlock(f->priv_mtx);
1222 
1223 	fs_ep_uptr = f->fs_ep_ptr + ep_index;
1224 	error = copyin(fs_ep_uptr, &fs_ep, sizeof(fs_ep));
1225 	if (error) {
1226 		return (error);
1227 	}
1228 	fs_ep.status = xfer->error;
1229 	fs_ep.aFrames = xfer->aframes;
1230 	fs_ep.isoc_time_complete = xfer->isoc_time_complete;
1231 	if (xfer->error) {
1232 		goto complete;
1233 	}
1234 	if (xfer->flags_int.control_xfr) {
1235 		req = xfer->frbuffers[0].buffer;
1236 
1237 		/* Host mode only ! */
1238 		if ((req->bmRequestType & (UT_READ | UT_WRITE)) == UT_READ) {
1239 			isread = 1;
1240 		} else {
1241 			isread = 0;
1242 		}
1243 		if (xfer->nframes == 0)
1244 			n = 0;		/* should never happen */
1245 		else
1246 			n = 1;
1247 	} else {
1248 		/* Device and Host mode */
1249 		if (USB_GET_DATA_ISREAD(xfer)) {
1250 			isread = 1;
1251 		} else {
1252 			isread = 0;
1253 		}
1254 		n = 0;
1255 	}
1256 
1257 	/* Update lengths and copy out data */
1258 
1259 	rem = xfer->max_data_length;
1260 	offset = 0;
1261 
1262 	for (; n != xfer->nframes; n++) {
1263 
1264 		/* get initial length into "temp" */
1265 		error = copyin(fs_ep.pLength + n,
1266 		    &temp, sizeof(temp));
1267 		if (error) {
1268 			return (error);
1269 		}
1270 		if (temp > rem) {
1271 			/* the userland length has been corrupted */
1272 			DPRINTF("corrupt userland length "
1273 			    "%u > %u\n", temp, rem);
1274 			fs_ep.status = USB_ERR_INVAL;
1275 			goto complete;
1276 		}
1277 		rem -= temp;
1278 
1279 		/* get actual transfer length */
1280 		length = xfer->frlengths[n];
1281 		if (length > temp) {
1282 			/* data overflow */
1283 			fs_ep.status = USB_ERR_INVAL;
1284 			DPRINTF("data overflow %u > %u\n",
1285 			    length, temp);
1286 			goto complete;
1287 		}
1288 		if (isread) {
1289 
1290 			/* we need to know the destination buffer */
1291 			error = copyin(fs_ep.ppBuffer + n,
1292 			    &uaddr, sizeof(uaddr));
1293 			if (error) {
1294 				return (error);
1295 			}
1296 			if (xfer->flags_int.isochronous_xfr) {
1297 				/* only one frame buffer */
1298 				kaddr = USB_ADD_BYTES(
1299 				    xfer->frbuffers[0].buffer, offset);
1300 			} else {
1301 				/* multiple frame buffers */
1302 				kaddr = xfer->frbuffers[n].buffer;
1303 			}
1304 
1305 			/* move data */
1306 			error = copyout(kaddr, uaddr, length);
1307 			if (error) {
1308 				return (error);
1309 			}
1310 		}
1311 		/*
1312 		 * Update offset according to initial length, which is
1313 		 * needed by isochronous transfers!
1314 		 */
1315 		offset += temp;
1316 
1317 		/* update length */
1318 		error = copyout(&length,
1319 		    fs_ep.pLength + n, sizeof(length));
1320 		if (error) {
1321 			return (error);
1322 		}
1323 	}
1324 
1325 complete:
1326 	/* update "aFrames" */
1327 	error = copyout(&fs_ep.aFrames, &fs_ep_uptr->aFrames,
1328 	    sizeof(fs_ep.aFrames));
1329 	if (error)
1330 		goto done;
1331 
1332 	/* update "isoc_time_complete" */
1333 	error = copyout(&fs_ep.isoc_time_complete,
1334 	    &fs_ep_uptr->isoc_time_complete,
1335 	    sizeof(fs_ep.isoc_time_complete));
1336 	if (error)
1337 		goto done;
1338 	/* update "status" */
1339 	error = copyout(&fs_ep.status, &fs_ep_uptr->status,
1340 	    sizeof(fs_ep.status));
1341 done:
1342 	return (error);
1343 }
1344 
1345 static uint8_t
1346 ugen_fifo_in_use(struct usb2_fifo *f, int fflags)
1347 {
1348 	struct usb2_fifo *f_rx;
1349 	struct usb2_fifo *f_tx;
1350 
1351 	f_rx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_RX];
1352 	f_tx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_TX];
1353 
1354 	if ((fflags & FREAD) && f_rx &&
1355 	    (f_rx->xfer[0] || f_rx->xfer[1])) {
1356 		return (1);		/* RX FIFO in use */
1357 	}
1358 	if ((fflags & FWRITE) && f_tx &&
1359 	    (f_tx->xfer[0] || f_tx->xfer[1])) {
1360 		return (1);		/* TX FIFO in use */
1361 	}
1362 	return (0);			/* not in use */
1363 }
1364 
1365 static int
1366 ugen_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags)
1367 {
1368 	struct usb2_config usb2_config[1];
1369 	struct usb2_device_request req;
1370 	union {
1371 		struct usb2_fs_complete *pcomp;
1372 		struct usb2_fs_start *pstart;
1373 		struct usb2_fs_stop *pstop;
1374 		struct usb2_fs_open *popen;
1375 		struct usb2_fs_close *pclose;
1376 		struct usb2_fs_clear_stall_sync *pstall;
1377 		void   *addr;
1378 	}     u;
1379 	struct usb2_pipe *pipe;
1380 	struct usb2_endpoint_descriptor *ed;
1381 	int error = 0;
1382 	uint8_t iface_index;
1383 	uint8_t isread;
1384 	uint8_t ep_index;
1385 
1386 	u.addr = addr;
1387 
1388 	DPRINTFN(6, "cmd=0x%08lx\n", cmd);
1389 
1390 	switch (cmd) {
1391 	case USB_FS_COMPLETE:
1392 		mtx_lock(f->priv_mtx);
1393 		error = ugen_fs_get_complete(f, &ep_index);
1394 		mtx_unlock(f->priv_mtx);
1395 
1396 		if (error) {
1397 			error = EBUSY;
1398 			break;
1399 		}
1400 		u.pcomp->ep_index = ep_index;
1401 		error = ugen_fs_copy_out(f, u.pcomp->ep_index);
1402 		break;
1403 
1404 	case USB_FS_START:
1405 		error = ugen_fs_copy_in(f, u.pstart->ep_index);
1406 		if (error) {
1407 			break;
1408 		}
1409 		mtx_lock(f->priv_mtx);
1410 		usb2_transfer_start(f->fs_xfer[u.pstart->ep_index]);
1411 		mtx_unlock(f->priv_mtx);
1412 		break;
1413 
1414 	case USB_FS_STOP:
1415 		if (u.pstop->ep_index >= f->fs_ep_max) {
1416 			error = EINVAL;
1417 			break;
1418 		}
1419 		mtx_lock(f->priv_mtx);
1420 		usb2_transfer_stop(f->fs_xfer[u.pstop->ep_index]);
1421 		mtx_unlock(f->priv_mtx);
1422 		break;
1423 
1424 	case USB_FS_OPEN:
1425 		if (u.popen->ep_index >= f->fs_ep_max) {
1426 			error = EINVAL;
1427 			break;
1428 		}
1429 		if (f->fs_xfer[u.popen->ep_index] != NULL) {
1430 			error = EBUSY;
1431 			break;
1432 		}
1433 		if (u.popen->max_bufsize > USB_FS_MAX_BUFSIZE) {
1434 			u.popen->max_bufsize = USB_FS_MAX_BUFSIZE;
1435 		}
1436 		if (u.popen->max_frames > USB_FS_MAX_FRAMES) {
1437 			u.popen->max_frames = USB_FS_MAX_FRAMES;
1438 			break;
1439 		}
1440 		if (u.popen->max_frames == 0) {
1441 			error = EINVAL;
1442 			break;
1443 		}
1444 		pipe = usb2_get_pipe_by_addr(f->udev, u.popen->ep_no);
1445 		if (pipe == NULL) {
1446 			error = EINVAL;
1447 			break;
1448 		}
1449 		ed = pipe->edesc;
1450 		if (ed == NULL) {
1451 			error = ENXIO;
1452 			break;
1453 		}
1454 		iface_index = pipe->iface_index;
1455 
1456 		bzero(usb2_config, sizeof(usb2_config));
1457 
1458 		usb2_config[0].type = ed->bmAttributes & UE_XFERTYPE;
1459 		usb2_config[0].endpoint = ed->bEndpointAddress & UE_ADDR;
1460 		usb2_config[0].direction = ed->bEndpointAddress & (UE_DIR_OUT | UE_DIR_IN);
1461 		usb2_config[0].mh.interval = USB_DEFAULT_INTERVAL;
1462 		usb2_config[0].mh.flags.proxy_buffer = 1;
1463 		usb2_config[0].mh.callback = &ugen_default_fs_callback;
1464 		usb2_config[0].mh.timeout = 0;	/* no timeout */
1465 		usb2_config[0].mh.frames = u.popen->max_frames;
1466 		usb2_config[0].mh.bufsize = u.popen->max_bufsize;
1467 		usb2_config[0].md = usb2_config[0].mh;	/* symmetric config */
1468 
1469 		if (usb2_config[0].type == UE_CONTROL) {
1470 			if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
1471 				error = EINVAL;
1472 				break;
1473 			}
1474 		} else {
1475 
1476 			isread = ((usb2_config[0].endpoint &
1477 			    (UE_DIR_IN | UE_DIR_OUT)) == UE_DIR_IN);
1478 
1479 			if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
1480 				isread = !isread;
1481 			}
1482 			/* check permissions */
1483 			if (isread) {
1484 				if (!(fflags & FREAD)) {
1485 					error = EPERM;
1486 					break;
1487 				}
1488 			} else {
1489 				if (!(fflags & FWRITE)) {
1490 					error = EPERM;
1491 					break;
1492 				}
1493 			}
1494 		}
1495 		error = usb2_transfer_setup(f->udev, &iface_index,
1496 		    f->fs_xfer + u.popen->ep_index, usb2_config, 1,
1497 		    f, f->priv_mtx);
1498 		if (error == 0) {
1499 			/* update maximums */
1500 			u.popen->max_packet_length =
1501 			    f->fs_xfer[u.popen->ep_index]->max_frame_size;
1502 			u.popen->max_bufsize =
1503 			    f->fs_xfer[u.popen->ep_index]->max_data_length;
1504 			f->fs_xfer[u.popen->ep_index]->priv_fifo =
1505 			    ((uint8_t *)0) + u.popen->ep_index;
1506 		} else {
1507 			error = ENOMEM;
1508 		}
1509 		break;
1510 
1511 	case USB_FS_CLOSE:
1512 		if (u.pclose->ep_index >= f->fs_ep_max) {
1513 			error = EINVAL;
1514 			break;
1515 		}
1516 		if (f->fs_xfer[u.pclose->ep_index] == NULL) {
1517 			error = EINVAL;
1518 			break;
1519 		}
1520 		usb2_transfer_unsetup(f->fs_xfer + u.pclose->ep_index, 1);
1521 		break;
1522 
1523 	case USB_FS_CLEAR_STALL_SYNC:
1524 		if (u.pstall->ep_index >= f->fs_ep_max) {
1525 			error = EINVAL;
1526 			break;
1527 		}
1528 		if (f->fs_xfer[u.pstall->ep_index] == NULL) {
1529 			error = EINVAL;
1530 			break;
1531 		}
1532 		if (f->udev->flags.usb2_mode != USB_MODE_HOST) {
1533 			error = EINVAL;
1534 			break;
1535 		}
1536 		mtx_lock(f->priv_mtx);
1537 		error = usb2_transfer_pending(f->fs_xfer[u.pstall->ep_index]);
1538 		mtx_unlock(f->priv_mtx);
1539 
1540 		if (error) {
1541 			return (EBUSY);
1542 		}
1543 		pipe = f->fs_xfer[u.pstall->ep_index]->pipe;
1544 
1545 		/* setup a clear-stall packet */
1546 		req.bmRequestType = UT_WRITE_ENDPOINT;
1547 		req.bRequest = UR_CLEAR_FEATURE;
1548 		USETW(req.wValue, UF_ENDPOINT_HALT);
1549 		req.wIndex[0] = pipe->edesc->bEndpointAddress;
1550 		req.wIndex[1] = 0;
1551 		USETW(req.wLength, 0);
1552 
1553 		error = usb2_do_request(f->udev, NULL, &req, NULL);
1554 		if (error == 0) {
1555 			usb2_clear_data_toggle(f->udev, pipe);
1556 		} else {
1557 			error = ENXIO;
1558 		}
1559 		break;
1560 
1561 	default:
1562 		error = ENOIOCTL;
1563 		break;
1564 	}
1565 
1566 	DPRINTFN(6, "error=%d\n", error);
1567 
1568 	return (error);
1569 }
1570 
1571 static int
1572 ugen_set_short_xfer(struct usb2_fifo *f, void *addr)
1573 {
1574 	uint8_t t;
1575 
1576 	if (*(int *)addr)
1577 		t = 1;
1578 	else
1579 		t = 0;
1580 
1581 	if (f->flag_short == t) {
1582 		/* same value like before - accept */
1583 		return (0);
1584 	}
1585 	if (f->xfer[0] || f->xfer[1]) {
1586 		/* cannot change this during transfer */
1587 		return (EBUSY);
1588 	}
1589 	f->flag_short = t;
1590 	return (0);
1591 }
1592 
1593 static int
1594 ugen_set_timeout(struct usb2_fifo *f, void *addr)
1595 {
1596 	f->timeout = *(int *)addr;
1597 	if (f->timeout > 65535) {
1598 		/* limit user input */
1599 		f->timeout = 65535;
1600 	}
1601 	return (0);
1602 }
1603 
1604 static int
1605 ugen_get_frame_size(struct usb2_fifo *f, void *addr)
1606 {
1607 	if (f->xfer[0]) {
1608 		*(int *)addr = f->xfer[0]->max_frame_size;
1609 	} else {
1610 		return (EINVAL);
1611 	}
1612 	return (0);
1613 }
1614 
1615 static int
1616 ugen_set_buffer_size(struct usb2_fifo *f, void *addr)
1617 {
1618 	uint32_t t;
1619 
1620 	if (*(int *)addr < 1024)
1621 		t = 1024;
1622 	else if (*(int *)addr < (256 * 1024))
1623 		t = *(int *)addr;
1624 	else
1625 		t = 256 * 1024;
1626 
1627 	if (f->bufsize == t) {
1628 		/* same value like before - accept */
1629 		return (0);
1630 	}
1631 	if (f->xfer[0] || f->xfer[1]) {
1632 		/* cannot change this during transfer */
1633 		return (EBUSY);
1634 	}
1635 	f->bufsize = t;
1636 	return (0);
1637 }
1638 
1639 static int
1640 ugen_get_buffer_size(struct usb2_fifo *f, void *addr)
1641 {
1642 	*(int *)addr = f->bufsize;
1643 	return (0);
1644 }
1645 
1646 static int
1647 ugen_get_iface_desc(struct usb2_fifo *f,
1648     struct usb2_interface_descriptor *idesc)
1649 {
1650 	struct usb2_interface *iface;
1651 
1652 	iface = usb2_get_iface(f->udev, f->iface_index);
1653 	if (iface && iface->idesc) {
1654 		*idesc = *(iface->idesc);
1655 	} else {
1656 		return (EIO);
1657 	}
1658 	return (0);
1659 }
1660 
1661 static int
1662 ugen_get_endpoint_desc(struct usb2_fifo *f,
1663     struct usb2_endpoint_descriptor *ed)
1664 {
1665 	struct usb2_pipe *pipe;
1666 
1667 	pipe = f->priv_sc0;
1668 
1669 	if (pipe && pipe->edesc) {
1670 		*ed = *pipe->edesc;
1671 	} else {
1672 		return (EINVAL);
1673 	}
1674 	return (0);
1675 }
1676 
1677 static int
1678 ugen_set_power_mode(struct usb2_fifo *f, int mode)
1679 {
1680 	struct usb2_device *udev = f->udev;
1681 	int err;
1682 	uint8_t old_mode;
1683 
1684 	if ((udev == NULL) ||
1685 	    (udev->parent_hub == NULL)) {
1686 		return (EINVAL);
1687 	}
1688 	err = priv_check(curthread, PRIV_DRIVER);
1689 	if (err)
1690 		return (err);
1691 
1692 	/* get old power mode */
1693 	old_mode = udev->power_mode;
1694 
1695 	/* if no change, then just return */
1696 	if (old_mode == mode)
1697 		return (0);
1698 
1699 	switch (mode) {
1700 	case USB_POWER_MODE_OFF:
1701 		/* get the device unconfigured */
1702 		err = ugen_set_config(f, USB_UNCONFIG_INDEX);
1703 		if (err) {
1704 			DPRINTFN(0, "Could not unconfigure "
1705 			    "device (ignored)\n");
1706 		}
1707 
1708 		/* clear port enable */
1709 		err = usb2_req_clear_port_feature(udev->parent_hub,
1710 		    NULL, udev->port_no, UHF_PORT_ENABLE);
1711 		break;
1712 
1713 	case USB_POWER_MODE_ON:
1714 	case USB_POWER_MODE_SAVE:
1715 		break;
1716 
1717 	case USB_POWER_MODE_RESUME:
1718 		err = usb2_req_clear_port_feature(udev->parent_hub,
1719 		    NULL, udev->port_no, UHF_PORT_SUSPEND);
1720 		mode = USB_POWER_MODE_SAVE;
1721 		break;
1722 
1723 	case USB_POWER_MODE_SUSPEND:
1724 		err = usb2_req_set_port_feature(udev->parent_hub,
1725 		    NULL, udev->port_no, UHF_PORT_SUSPEND);
1726 		mode = USB_POWER_MODE_SAVE;
1727 		break;
1728 
1729 	default:
1730 		return (EINVAL);
1731 	}
1732 
1733 	if (err)
1734 		return (ENXIO);		/* I/O failure */
1735 
1736 	/* if we are powered off we need to re-enumerate first */
1737 	if (old_mode == USB_POWER_MODE_OFF) {
1738 		err = ugen_re_enumerate(f);
1739 		if (err)
1740 			return (err);
1741 	}
1742 
1743 	/* set new power mode */
1744 	usb2_set_power_mode(udev, mode);
1745 
1746 	return (0);			/* success */
1747 }
1748 
1749 static int
1750 ugen_get_power_mode(struct usb2_fifo *f)
1751 {
1752 	struct usb2_device *udev = f->udev;
1753 
1754 	if ((udev == NULL) ||
1755 	    (udev->parent_hub == NULL)) {
1756 		return (USB_POWER_MODE_ON);
1757 	}
1758 	return (udev->power_mode);
1759 }
1760 
1761 static int
1762 ugen_do_port_feature(struct usb2_fifo *f, uint8_t port_no,
1763     uint8_t set, uint16_t feature)
1764 {
1765 	struct usb2_device *udev = f->udev;
1766 	struct usb2_hub *hub;
1767 	int err;
1768 
1769 	err = priv_check(curthread, PRIV_DRIVER);
1770 	if (err) {
1771 		return (err);
1772 	}
1773 	if (port_no == 0) {
1774 		return (EINVAL);
1775 	}
1776 	if ((udev == NULL) ||
1777 	    (udev->hub == NULL)) {
1778 		return (EINVAL);
1779 	}
1780 	hub = udev->hub;
1781 
1782 	if (port_no > hub->nports) {
1783 		return (EINVAL);
1784 	}
1785 	if (set)
1786 		err = usb2_req_set_port_feature(udev,
1787 		    NULL, port_no, feature);
1788 	else
1789 		err = usb2_req_clear_port_feature(udev,
1790 		    NULL, port_no, feature);
1791 
1792 	if (err)
1793 		return (ENXIO);		/* failure */
1794 
1795 	return (0);			/* success */
1796 }
1797 
1798 static int
1799 ugen_iface_ioctl(struct usb2_fifo *f, u_long cmd, void *addr, int fflags)
1800 {
1801 	struct usb2_fifo *f_rx;
1802 	struct usb2_fifo *f_tx;
1803 	int error = 0;
1804 
1805 	f_rx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_RX];
1806 	f_tx = f->udev->fifo[(f->fifo_index & ~1) + USB_FIFO_TX];
1807 
1808 	switch (cmd) {
1809 	case USB_SET_RX_SHORT_XFER:
1810 		if (fflags & FREAD) {
1811 			error = ugen_set_short_xfer(f_rx, addr);
1812 		} else {
1813 			error = EINVAL;
1814 		}
1815 		break;
1816 
1817 	case USB_SET_TX_FORCE_SHORT:
1818 		if (fflags & FWRITE) {
1819 			error = ugen_set_short_xfer(f_tx, addr);
1820 		} else {
1821 			error = EINVAL;
1822 		}
1823 		break;
1824 
1825 	case USB_SET_RX_TIMEOUT:
1826 		if (fflags & FREAD) {
1827 			error = ugen_set_timeout(f_rx, addr);
1828 		} else {
1829 			error = EINVAL;
1830 		}
1831 		break;
1832 
1833 	case USB_SET_TX_TIMEOUT:
1834 		if (fflags & FWRITE) {
1835 			error = ugen_set_timeout(f_tx, addr);
1836 		} else {
1837 			error = EINVAL;
1838 		}
1839 		break;
1840 
1841 	case USB_GET_RX_FRAME_SIZE:
1842 		if (fflags & FREAD) {
1843 			error = ugen_get_frame_size(f_rx, addr);
1844 		} else {
1845 			error = EINVAL;
1846 		}
1847 		break;
1848 
1849 	case USB_GET_TX_FRAME_SIZE:
1850 		if (fflags & FWRITE) {
1851 			error = ugen_get_frame_size(f_tx, addr);
1852 		} else {
1853 			error = EINVAL;
1854 		}
1855 		break;
1856 
1857 	case USB_SET_RX_BUFFER_SIZE:
1858 		if (fflags & FREAD) {
1859 			error = ugen_set_buffer_size(f_rx, addr);
1860 		} else {
1861 			error = EINVAL;
1862 		}
1863 		break;
1864 
1865 	case USB_SET_TX_BUFFER_SIZE:
1866 		if (fflags & FWRITE) {
1867 			error = ugen_set_buffer_size(f_tx, addr);
1868 		} else {
1869 			error = EINVAL;
1870 		}
1871 		break;
1872 
1873 	case USB_GET_RX_BUFFER_SIZE:
1874 		if (fflags & FREAD) {
1875 			error = ugen_get_buffer_size(f_rx, addr);
1876 		} else {
1877 			error = EINVAL;
1878 		}
1879 		break;
1880 
1881 	case USB_GET_TX_BUFFER_SIZE:
1882 		if (fflags & FWRITE) {
1883 			error = ugen_get_buffer_size(f_tx, addr);
1884 		} else {
1885 			error = EINVAL;
1886 		}
1887 		break;
1888 
1889 	case USB_GET_RX_INTERFACE_DESC:
1890 		if (fflags & FREAD) {
1891 			error = ugen_get_iface_desc(f_rx, addr);
1892 		} else {
1893 			error = EINVAL;
1894 		}
1895 		break;
1896 
1897 	case USB_GET_TX_INTERFACE_DESC:
1898 		if (fflags & FWRITE) {
1899 			error = ugen_get_iface_desc(f_tx, addr);
1900 		} else {
1901 			error = EINVAL;
1902 		}
1903 		break;
1904 
1905 	case USB_GET_RX_ENDPOINT_DESC:
1906 		if (fflags & FREAD) {
1907 			error = ugen_get_endpoint_desc(f_rx, addr);
1908 		} else {
1909 			error = EINVAL;
1910 		}
1911 		break;
1912 
1913 	case USB_GET_TX_ENDPOINT_DESC:
1914 		if (fflags & FWRITE) {
1915 			error = ugen_get_endpoint_desc(f_tx, addr);
1916 		} else {
1917 			error = EINVAL;
1918 		}
1919 		break;
1920 
1921 	case USB_SET_RX_STALL_FLAG:
1922 		if ((fflags & FREAD) && (*(int *)addr)) {
1923 			f_rx->flag_stall = 1;
1924 		}
1925 		break;
1926 
1927 	case USB_SET_TX_STALL_FLAG:
1928 		if ((fflags & FWRITE) && (*(int *)addr)) {
1929 			f_tx->flag_stall = 1;
1930 		}
1931 		break;
1932 
1933 	default:
1934 		error = ENOIOCTL;
1935 		break;
1936 	}
1937 	return (error);
1938 }
1939 
1940 static int
1941 ugen_ioctl_post(struct usb2_fifo *f, u_long cmd, void *addr, int fflags)
1942 {
1943 	union {
1944 		struct usb2_interface_descriptor *idesc;
1945 		struct usb2_alt_interface *ai;
1946 		struct usb2_device_descriptor *ddesc;
1947 		struct usb2_config_descriptor *cdesc;
1948 		struct usb2_device_stats *stat;
1949 		struct usb2_fs_init *pinit;
1950 		struct usb2_fs_uninit *puninit;
1951 		uint32_t *ptime;
1952 		void   *addr;
1953 		int    *pint;
1954 	}     u;
1955 	struct usb2_device_descriptor *dtemp;
1956 	struct usb2_config_descriptor *ctemp;
1957 	struct usb2_interface *iface;
1958 	int error = 0;
1959 	uint8_t n;
1960 
1961 	u.addr = addr;
1962 
1963 	DPRINTFN(6, "cmd=0x%08lx\n", cmd);
1964 
1965 	switch (cmd) {
1966 	case USB_DISCOVER:
1967 		usb2_needs_explore_all();
1968 		break;
1969 
1970 	case USB_SETDEBUG:
1971 		if (!(fflags & FWRITE)) {
1972 			error = EPERM;
1973 			break;
1974 		}
1975 		usb2_debug = *(int *)addr;
1976 		break;
1977 
1978 	case USB_GET_CONFIG:
1979 		*(int *)addr = f->udev->curr_config_index;
1980 		break;
1981 
1982 	case USB_SET_CONFIG:
1983 		if (!(fflags & FWRITE)) {
1984 			error = EPERM;
1985 			break;
1986 		}
1987 		error = ugen_set_config(f, *(int *)addr);
1988 		break;
1989 
1990 	case USB_GET_ALTINTERFACE:
1991 		iface = usb2_get_iface(f->udev,
1992 		    u.ai->uai_interface_index);
1993 		if (iface && iface->idesc) {
1994 			u.ai->uai_alt_index = iface->alt_index;
1995 		} else {
1996 			error = EINVAL;
1997 		}
1998 		break;
1999 
2000 	case USB_SET_ALTINTERFACE:
2001 		if (!(fflags & FWRITE)) {
2002 			error = EPERM;
2003 			break;
2004 		}
2005 		error = ugen_set_interface(f,
2006 		    u.ai->uai_interface_index, u.ai->uai_alt_index);
2007 		break;
2008 
2009 	case USB_GET_DEVICE_DESC:
2010 		dtemp = usb2_get_device_descriptor(f->udev);
2011 		if (!dtemp) {
2012 			error = EIO;
2013 			break;
2014 		}
2015 		*u.ddesc = *dtemp;
2016 		break;
2017 
2018 	case USB_GET_CONFIG_DESC:
2019 		ctemp = usb2_get_config_descriptor(f->udev);
2020 		if (!ctemp) {
2021 			error = EIO;
2022 			break;
2023 		}
2024 		*u.cdesc = *ctemp;
2025 		break;
2026 
2027 	case USB_GET_FULL_DESC:
2028 		error = ugen_get_cdesc(f, addr);
2029 		break;
2030 
2031 	case USB_GET_STRING_DESC:
2032 		error = ugen_get_sdesc(f, addr);
2033 		break;
2034 
2035 	case USB_GET_IFACE_DRIVER:
2036 		error = ugen_get_iface_driver(f, addr);
2037 		break;
2038 
2039 	case USB_REQUEST:
2040 	case USB_DO_REQUEST:
2041 		if (!(fflags & FWRITE)) {
2042 			error = EPERM;
2043 			break;
2044 		}
2045 		error = ugen_do_request(f, addr);
2046 		break;
2047 
2048 	case USB_DEVICEINFO:
2049 	case USB_GET_DEVICEINFO:
2050 		error = usb2_gen_fill_deviceinfo(f, addr);
2051 		break;
2052 
2053 	case USB_DEVICESTATS:
2054 		for (n = 0; n != 4; n++) {
2055 
2056 			u.stat->uds_requests_fail[n] =
2057 			    f->udev->bus->stats_err.uds_requests[n];
2058 
2059 			u.stat->uds_requests_ok[n] =
2060 			    f->udev->bus->stats_ok.uds_requests[n];
2061 		}
2062 		break;
2063 
2064 	case USB_DEVICEENUMERATE:
2065 		error = ugen_re_enumerate(f);
2066 		break;
2067 
2068 	case USB_GET_PLUGTIME:
2069 		*u.ptime = f->udev->plugtime;
2070 		break;
2071 
2072 	case USB_CLAIM_INTERFACE:
2073 	case USB_RELEASE_INTERFACE:
2074 		/* TODO */
2075 		break;
2076 
2077 	case USB_IFACE_DRIVER_ACTIVE:
2078 		/* TODO */
2079 		*u.pint = 0;
2080 		break;
2081 
2082 	case USB_IFACE_DRIVER_DETACH:
2083 		/* TODO */
2084 		error = priv_check(curthread, PRIV_DRIVER);
2085 		if (error) {
2086 			break;
2087 		}
2088 		error = EINVAL;
2089 		break;
2090 
2091 	case USB_SET_POWER_MODE:
2092 		error = ugen_set_power_mode(f, *u.pint);
2093 		break;
2094 
2095 	case USB_GET_POWER_MODE:
2096 		*u.pint = ugen_get_power_mode(f);
2097 		break;
2098 
2099 	case USB_SET_PORT_ENABLE:
2100 		error = ugen_do_port_feature(f,
2101 		    *u.pint, 1, UHF_PORT_ENABLE);
2102 		break;
2103 
2104 	case USB_SET_PORT_DISABLE:
2105 		error = ugen_do_port_feature(f,
2106 		    *u.pint, 0, UHF_PORT_ENABLE);
2107 		break;
2108 
2109 	case USB_FS_INIT:
2110 		/* verify input parameters */
2111 		if (u.pinit->pEndpoints == NULL) {
2112 			error = EINVAL;
2113 			break;
2114 		}
2115 		if (u.pinit->ep_index_max > 127) {
2116 			error = EINVAL;
2117 			break;
2118 		}
2119 		if (u.pinit->ep_index_max == 0) {
2120 			error = EINVAL;
2121 			break;
2122 		}
2123 		if (f->fs_xfer != NULL) {
2124 			error = EBUSY;
2125 			break;
2126 		}
2127 		if (f->dev_ep_index != 0) {
2128 			error = EINVAL;
2129 			break;
2130 		}
2131 		if (ugen_fifo_in_use(f, fflags)) {
2132 			error = EBUSY;
2133 			break;
2134 		}
2135 		error = usb2_fifo_alloc_buffer(f, 1, u.pinit->ep_index_max);
2136 		if (error) {
2137 			break;
2138 		}
2139 		f->fs_xfer = malloc(sizeof(f->fs_xfer[0]) *
2140 		    u.pinit->ep_index_max, M_USB, M_WAITOK | M_ZERO);
2141 		if (f->fs_xfer == NULL) {
2142 			usb2_fifo_free_buffer(f);
2143 			error = ENOMEM;
2144 			break;
2145 		}
2146 		f->fs_ep_max = u.pinit->ep_index_max;
2147 		f->fs_ep_ptr = u.pinit->pEndpoints;
2148 		break;
2149 
2150 	case USB_FS_UNINIT:
2151 		if (u.puninit->dummy != 0) {
2152 			error = EINVAL;
2153 			break;
2154 		}
2155 		error = ugen_fs_uninit(f);
2156 		break;
2157 
2158 	default:
2159 		mtx_lock(f->priv_mtx);
2160 		error = ugen_iface_ioctl(f, cmd, addr, fflags);
2161 		mtx_unlock(f->priv_mtx);
2162 		break;
2163 	}
2164 	DPRINTFN(6, "error=%d\n", error);
2165 	return (error);
2166 }
2167 
2168 static void
2169 ugen_default_fs_callback(struct usb2_xfer *xfer)
2170 {
2171 	;				/* workaround for a bug in "indent" */
2172 
2173 	DPRINTF("st=%u alen=%u aframes=%u\n",
2174 	    USB_GET_STATE(xfer), xfer->actlen, xfer->aframes);
2175 
2176 	switch (USB_GET_STATE(xfer)) {
2177 	case USB_ST_SETUP:
2178 		usb2_start_hardware(xfer);
2179 		break;
2180 	default:
2181 		ugen_fs_set_complete(xfer->priv_sc, USB_P2U(xfer->priv_fifo));
2182 		break;
2183 	}
2184 }
2185