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