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