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