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