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