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