1/* $FreeBSD$ */
2/*-
3 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
4 *
5 * Copyright (c) 2006-2008 Hans Petter Selasky. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 *
29 * usb_dev.c - An abstraction layer for creating devices under /dev/...
30 */
31
32#ifdef USB_GLOBAL_INCLUDE_FILE
33#include USB_GLOBAL_INCLUDE_FILE
34#else
35#include <sys/stdint.h>
36#include <sys/stddef.h>
37#include <sys/param.h>
38#include <sys/queue.h>
39#include <sys/types.h>
40#include <sys/systm.h>
41#include <sys/kernel.h>
42#include <sys/bus.h>
43#include <sys/module.h>
44#include <sys/lock.h>
45#include <sys/mutex.h>
46#include <sys/condvar.h>
47#include <sys/sysctl.h>
48#include <sys/sx.h>
49#include <sys/unistd.h>
50#include <sys/callout.h>
51#include <sys/malloc.h>
52#include <sys/priv.h>
53#include <sys/vnode.h>
54#include <sys/conf.h>
55#include <sys/fcntl.h>
56
57#include <dev/usb/usb.h>
58#include <dev/usb/usb_ioctl.h>
59#include <dev/usb/usbdi.h>
60#include <dev/usb/usbdi_util.h>
61
62#define	USB_DEBUG_VAR usb_fifo_debug
63
64#include <dev/usb/usb_core.h>
65#include <dev/usb/usb_dev.h>
66#include <dev/usb/usb_mbuf.h>
67#include <dev/usb/usb_process.h>
68#include <dev/usb/usb_device.h>
69#include <dev/usb/usb_debug.h>
70#include <dev/usb/usb_busdma.h>
71#include <dev/usb/usb_generic.h>
72#include <dev/usb/usb_dynamic.h>
73#include <dev/usb/usb_util.h>
74
75#include <dev/usb/usb_controller.h>
76#include <dev/usb/usb_bus.h>
77
78#include <sys/filio.h>
79#include <sys/ttycom.h>
80#include <sys/syscallsubr.h>
81
82#include <machine/stdarg.h>
83#endif			/* USB_GLOBAL_INCLUDE_FILE */
84
85#if USB_HAVE_UGEN
86
87#ifdef USB_DEBUG
88static int usb_fifo_debug = 0;
89
90static SYSCTL_NODE(_hw_usb, OID_AUTO, dev, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
91    "USB device");
92SYSCTL_INT(_hw_usb_dev, OID_AUTO, debug, CTLFLAG_RWTUN,
93    &usb_fifo_debug, 0, "Debug Level");
94#endif
95
96#if ((__FreeBSD_version >= 700001) || (__FreeBSD_version == 0) || \
97     ((__FreeBSD_version >= 600034) && (__FreeBSD_version < 700000)))
98#define	USB_UCRED struct ucred *ucred,
99#else
100#define	USB_UCRED
101#endif
102
103/* prototypes */
104
105static int	usb_fifo_open(struct usb_cdev_privdata *,
106		    struct usb_fifo *, int);
107static void	usb_fifo_close(struct usb_fifo *, int);
108static void	usb_dev_init(void *);
109static void	usb_dev_init_post(void *);
110static void	usb_dev_uninit(void *);
111static int	usb_fifo_uiomove(struct usb_fifo *, void *, int,
112		    struct uio *);
113static void	usb_fifo_check_methods(struct usb_fifo_methods *);
114static struct	usb_fifo *usb_fifo_alloc(struct mtx *);
115static struct	usb_endpoint *usb_dev_get_ep(struct usb_device *, uint8_t,
116		    uint8_t);
117static void	usb_loc_fill(struct usb_fs_privdata *,
118		    struct usb_cdev_privdata *);
119static void	usb_close(void *);
120static usb_error_t usb_ref_device(struct usb_cdev_privdata *, struct usb_cdev_refdata *, int);
121static usb_error_t usb_usb_ref_device(struct usb_cdev_privdata *, struct usb_cdev_refdata *);
122static void	usb_unref_device(struct usb_cdev_privdata *, struct usb_cdev_refdata *);
123
124static d_open_t usb_open;
125static d_ioctl_t usb_ioctl;
126static d_read_t usb_read;
127static d_write_t usb_write;
128static d_poll_t usb_poll;
129static d_kqfilter_t usb_kqfilter;
130
131static d_ioctl_t usb_static_ioctl;
132
133static usb_fifo_open_t usb_fifo_dummy_open;
134static usb_fifo_close_t usb_fifo_dummy_close;
135static usb_fifo_ioctl_t usb_fifo_dummy_ioctl;
136static usb_fifo_cmd_t usb_fifo_dummy_cmd;
137
138/* character device structure used for devices (/dev/ugenX.Y and /dev/uXXX) */
139struct cdevsw usb_devsw = {
140	.d_version = D_VERSION,
141	.d_open = usb_open,
142	.d_ioctl = usb_ioctl,
143	.d_name = "usbdev",
144	.d_flags = D_TRACKCLOSE,
145	.d_read = usb_read,
146	.d_write = usb_write,
147	.d_poll = usb_poll,
148	.d_kqfilter = usb_kqfilter,
149};
150
151static struct cdev* usb_dev = NULL;
152
153/* character device structure used for /dev/usb */
154static struct cdevsw usb_static_devsw = {
155	.d_version = D_VERSION,
156	.d_ioctl = usb_static_ioctl,
157	.d_name = "usb"
158};
159
160static TAILQ_HEAD(, usb_symlink) usb_sym_head;
161static struct sx usb_sym_lock;
162
163struct mtx usb_ref_lock;
164
165/*------------------------------------------------------------------------*
166 *	usb_loc_fill
167 *
168 * This is used to fill out a usb_cdev_privdata structure based on the
169 * device's address as contained in usb_fs_privdata.
170 *------------------------------------------------------------------------*/
171static void
172usb_loc_fill(struct usb_fs_privdata* pd, struct usb_cdev_privdata *cpd)
173{
174	cpd->bus_index = pd->bus_index;
175	cpd->dev_index = pd->dev_index;
176	cpd->ep_addr = pd->ep_addr;
177	cpd->fifo_index = pd->fifo_index;
178}
179
180/*------------------------------------------------------------------------*
181 *	usb_ref_device
182 *
183 * This function is used to atomically refer an USB device by its
184 * device location. If this function returns success the USB device
185 * will not disappear until the USB device is unreferenced.
186 *
187 * Return values:
188 *  0: Success, refcount incremented on the given USB device.
189 *  Else: Failure.
190 *------------------------------------------------------------------------*/
191static usb_error_t
192usb_ref_device(struct usb_cdev_privdata *cpd,
193    struct usb_cdev_refdata *crd, int need_uref)
194{
195	struct usb_fifo **ppf;
196	struct usb_fifo *f;
197
198	DPRINTFN(2, "cpd=%p need uref=%d\n", cpd, need_uref);
199
200	/* clear all refs */
201	memset(crd, 0, sizeof(*crd));
202
203	mtx_lock(&usb_ref_lock);
204	cpd->bus = devclass_get_softc(usb_devclass_ptr, cpd->bus_index);
205	if (cpd->bus == NULL) {
206		DPRINTFN(2, "no bus at %u\n", cpd->bus_index);
207		goto error;
208	}
209	cpd->udev = cpd->bus->devices[cpd->dev_index];
210	if (cpd->udev == NULL) {
211		DPRINTFN(2, "no device at %u\n", cpd->dev_index);
212		goto error;
213	}
214	if (cpd->udev->state == USB_STATE_DETACHED &&
215	    (need_uref != 2)) {
216		DPRINTFN(2, "device is detached\n");
217		goto error;
218	}
219	if (need_uref) {
220		DPRINTFN(2, "ref udev - needed\n");
221
222		if (cpd->udev->refcount == USB_DEV_REF_MAX) {
223			DPRINTFN(2, "no dev ref\n");
224			goto error;
225		}
226		cpd->udev->refcount++;
227
228		mtx_unlock(&usb_ref_lock);
229
230		/*
231		 * We need to grab the enumeration SX-lock before
232		 * grabbing the FIFO refs to avoid deadlock at detach!
233		 */
234		crd->do_unlock = usbd_enum_lock_sig(cpd->udev);
235
236		mtx_lock(&usb_ref_lock);
237
238		/*
239		 * Set "is_uref" after grabbing the default SX lock
240		 */
241		crd->is_uref = 1;
242
243		/* check for signal */
244		if (crd->do_unlock > 1) {
245			crd->do_unlock = 0;
246			goto error;
247		}
248	}
249
250	/* check if we are doing an open */
251	if (cpd->fflags == 0) {
252		/* use zero defaults */
253	} else {
254		/* check for write */
255		if (cpd->fflags & FWRITE) {
256			ppf = cpd->udev->fifo;
257			f = ppf[cpd->fifo_index + USB_FIFO_TX];
258			crd->txfifo = f;
259			crd->is_write = 1;	/* ref */
260			if (f == NULL || f->refcount == USB_FIFO_REF_MAX)
261				goto error;
262			if (f->curr_cpd != cpd)
263				goto error;
264			/* check if USB-FS is active */
265			if (f->fs_ep_max != 0) {
266				crd->is_usbfs = 1;
267			}
268		}
269
270		/* check for read */
271		if (cpd->fflags & FREAD) {
272			ppf = cpd->udev->fifo;
273			f = ppf[cpd->fifo_index + USB_FIFO_RX];
274			crd->rxfifo = f;
275			crd->is_read = 1;	/* ref */
276			if (f == NULL || f->refcount == USB_FIFO_REF_MAX)
277				goto error;
278			if (f->curr_cpd != cpd)
279				goto error;
280			/* check if USB-FS is active */
281			if (f->fs_ep_max != 0) {
282				crd->is_usbfs = 1;
283			}
284		}
285	}
286
287	/* when everything is OK we increment the refcounts */
288	if (crd->is_write) {
289		DPRINTFN(2, "ref write\n");
290		crd->txfifo->refcount++;
291	}
292	if (crd->is_read) {
293		DPRINTFN(2, "ref read\n");
294		crd->rxfifo->refcount++;
295	}
296	mtx_unlock(&usb_ref_lock);
297
298	return (0);
299
300error:
301	if (crd->do_unlock)
302		usbd_enum_unlock(cpd->udev);
303
304	if (crd->is_uref) {
305		if (--(cpd->udev->refcount) == 0)
306			cv_broadcast(&cpd->udev->ref_cv);
307	}
308	mtx_unlock(&usb_ref_lock);
309	DPRINTFN(2, "fail\n");
310
311	/* clear all refs */
312	memset(crd, 0, sizeof(*crd));
313
314	return (USB_ERR_INVAL);
315}
316
317/*------------------------------------------------------------------------*
318 *	usb_usb_ref_device
319 *
320 * This function is used to upgrade an USB reference to include the
321 * USB device reference on a USB location.
322 *
323 * Return values:
324 *  0: Success, refcount incremented on the given USB device.
325 *  Else: Failure.
326 *------------------------------------------------------------------------*/
327static usb_error_t
328usb_usb_ref_device(struct usb_cdev_privdata *cpd,
329    struct usb_cdev_refdata *crd)
330{
331	/*
332	 * Check if we already got an USB reference on this location:
333	 */
334	if (crd->is_uref)
335		return (0);		/* success */
336
337	/*
338	 * To avoid deadlock at detach we need to drop the FIFO ref
339	 * and re-acquire a new ref!
340	 */
341	usb_unref_device(cpd, crd);
342
343	return (usb_ref_device(cpd, crd, 1 /* need uref */));
344}
345
346/*------------------------------------------------------------------------*
347 *	usb_unref_device
348 *
349 * This function will release the reference count by one unit for the
350 * given USB device.
351 *------------------------------------------------------------------------*/
352static void
353usb_unref_device(struct usb_cdev_privdata *cpd,
354    struct usb_cdev_refdata *crd)
355{
356
357	DPRINTFN(2, "cpd=%p is_uref=%d\n", cpd, crd->is_uref);
358
359	if (crd->do_unlock)
360		usbd_enum_unlock(cpd->udev);
361
362	mtx_lock(&usb_ref_lock);
363	if (crd->is_read) {
364		if (--(crd->rxfifo->refcount) == 0) {
365			cv_signal(&crd->rxfifo->cv_drain);
366		}
367		crd->is_read = 0;
368	}
369	if (crd->is_write) {
370		if (--(crd->txfifo->refcount) == 0) {
371			cv_signal(&crd->txfifo->cv_drain);
372		}
373		crd->is_write = 0;
374	}
375	if (crd->is_uref) {
376		crd->is_uref = 0;
377		if (--(cpd->udev->refcount) == 0)
378			cv_broadcast(&cpd->udev->ref_cv);
379	}
380	mtx_unlock(&usb_ref_lock);
381}
382
383static struct usb_fifo *
384usb_fifo_alloc(struct mtx *mtx)
385{
386	struct usb_fifo *f;
387
388	f = malloc(sizeof(*f), M_USBDEV, M_WAITOK | M_ZERO);
389	cv_init(&f->cv_io, "FIFO-IO");
390	cv_init(&f->cv_drain, "FIFO-DRAIN");
391	f->priv_mtx = mtx;
392	f->refcount = 1;
393	knlist_init_mtx(&f->selinfo.si_note, mtx);
394	return (f);
395}
396
397/*------------------------------------------------------------------------*
398 *	usb_fifo_create
399 *------------------------------------------------------------------------*/
400static int
401usb_fifo_create(struct usb_cdev_privdata *cpd,
402    struct usb_cdev_refdata *crd)
403{
404	struct usb_device *udev = cpd->udev;
405	struct usb_fifo *f;
406	struct usb_endpoint *ep;
407	uint8_t n;
408	uint8_t is_tx;
409	uint8_t is_rx;
410	uint8_t no_null;
411	uint8_t is_busy;
412	int e = cpd->ep_addr;
413
414	is_tx = (cpd->fflags & FWRITE) ? 1 : 0;
415	is_rx = (cpd->fflags & FREAD) ? 1 : 0;
416	no_null = 1;
417	is_busy = 0;
418
419	/* Preallocated FIFO */
420	if (e < 0) {
421		DPRINTFN(5, "Preallocated FIFO\n");
422		if (is_tx) {
423			f = udev->fifo[cpd->fifo_index + USB_FIFO_TX];
424			if (f == NULL)
425				return (EINVAL);
426			crd->txfifo = f;
427		}
428		if (is_rx) {
429			f = udev->fifo[cpd->fifo_index + USB_FIFO_RX];
430			if (f == NULL)
431				return (EINVAL);
432			crd->rxfifo = f;
433		}
434		return (0);
435	}
436
437	KASSERT(e >= 0 && e <= 15, ("endpoint %d out of range", e));
438
439	/* search for a free FIFO slot */
440	DPRINTFN(5, "Endpoint device, searching for 0x%02x\n", e);
441	for (n = 0;; n += 2) {
442		if (n == USB_FIFO_MAX) {
443			if (no_null) {
444				no_null = 0;
445				n = 0;
446			} else {
447				/* end of FIFOs reached */
448				DPRINTFN(5, "out of FIFOs\n");
449				return (ENOMEM);
450			}
451		}
452		/* Check for TX FIFO */
453		if (is_tx) {
454			f = udev->fifo[n + USB_FIFO_TX];
455			if (f != NULL) {
456				if (f->dev_ep_index != e) {
457					/* wrong endpoint index */
458					continue;
459				}
460				if (f->curr_cpd != NULL) {
461					/* FIFO is opened */
462					is_busy = 1;
463					continue;
464				}
465			} else if (no_null) {
466				continue;
467			}
468		}
469		/* Check for RX FIFO */
470		if (is_rx) {
471			f = udev->fifo[n + USB_FIFO_RX];
472			if (f != NULL) {
473				if (f->dev_ep_index != e) {
474					/* wrong endpoint index */
475					continue;
476				}
477				if (f->curr_cpd != NULL) {
478					/* FIFO is opened */
479					is_busy = 1;
480					continue;
481				}
482			} else if (no_null) {
483				continue;
484			}
485		}
486		break;
487	}
488
489	if (no_null == 0) {
490		if (e >= (USB_EP_MAX / 2)) {
491			/* we don't create any endpoints in this range */
492			DPRINTFN(5, "ep out of range\n");
493			return (is_busy ? EBUSY : EINVAL);
494		}
495	}
496
497	if ((e != 0) && is_busy) {
498		/*
499		 * Only the default control endpoint is allowed to be
500		 * opened multiple times!
501		 */
502		DPRINTFN(5, "busy\n");
503		return (EBUSY);
504	}
505
506	/* Check TX FIFO */
507	if (is_tx &&
508	    (udev->fifo[n + USB_FIFO_TX] == NULL)) {
509		ep = usb_dev_get_ep(udev, e, USB_FIFO_TX);
510		DPRINTFN(5, "dev_get_endpoint(%d, 0x%x)\n", e, USB_FIFO_TX);
511		if (ep == NULL) {
512			DPRINTFN(5, "dev_get_endpoint returned NULL\n");
513			return (EINVAL);
514		}
515		f = usb_fifo_alloc(&udev->device_mtx);
516		if (f == NULL) {
517			DPRINTFN(5, "could not alloc tx fifo\n");
518			return (ENOMEM);
519		}
520		/* update some fields */
521		f->fifo_index = n + USB_FIFO_TX;
522		f->dev_ep_index = e;
523		f->priv_sc0 = ep;
524		f->methods = &usb_ugen_methods;
525		f->iface_index = ep->iface_index;
526		f->udev = udev;
527		mtx_lock(&usb_ref_lock);
528		udev->fifo[n + USB_FIFO_TX] = f;
529		mtx_unlock(&usb_ref_lock);
530	}
531	/* Check RX FIFO */
532	if (is_rx &&
533	    (udev->fifo[n + USB_FIFO_RX] == NULL)) {
534		ep = usb_dev_get_ep(udev, e, USB_FIFO_RX);
535		DPRINTFN(5, "dev_get_endpoint(%d, 0x%x)\n", e, USB_FIFO_RX);
536		if (ep == NULL) {
537			DPRINTFN(5, "dev_get_endpoint returned NULL\n");
538			return (EINVAL);
539		}
540		f = usb_fifo_alloc(&udev->device_mtx);
541		if (f == NULL) {
542			DPRINTFN(5, "could not alloc rx fifo\n");
543			return (ENOMEM);
544		}
545		/* update some fields */
546		f->fifo_index = n + USB_FIFO_RX;
547		f->dev_ep_index = e;
548		f->priv_sc0 = ep;
549		f->methods = &usb_ugen_methods;
550		f->iface_index = ep->iface_index;
551		f->udev = udev;
552		mtx_lock(&usb_ref_lock);
553		udev->fifo[n + USB_FIFO_RX] = f;
554		mtx_unlock(&usb_ref_lock);
555	}
556	if (is_tx) {
557		crd->txfifo = udev->fifo[n + USB_FIFO_TX];
558	}
559	if (is_rx) {
560		crd->rxfifo = udev->fifo[n + USB_FIFO_RX];
561	}
562	/* fill out fifo index */
563	DPRINTFN(5, "fifo index = %d\n", n);
564	cpd->fifo_index = n;
565
566	/* complete */
567
568	return (0);
569}
570
571void
572usb_fifo_free(struct usb_fifo *f)
573{
574	uint8_t n;
575
576	if (f == NULL) {
577		/* be NULL safe */
578		return;
579	}
580	/* destroy symlink devices, if any */
581	for (n = 0; n != 2; n++) {
582		if (f->symlink[n]) {
583			usb_free_symlink(f->symlink[n]);
584			f->symlink[n] = NULL;
585		}
586	}
587	mtx_lock(&usb_ref_lock);
588
589	/* delink ourselves to stop calls from userland */
590	if ((f->fifo_index < USB_FIFO_MAX) &&
591	    (f->udev != NULL) &&
592	    (f->udev->fifo[f->fifo_index] == f)) {
593		f->udev->fifo[f->fifo_index] = NULL;
594	} else {
595		DPRINTFN(0, "USB FIFO %p has not been linked\n", f);
596	}
597
598	/* decrease refcount */
599	f->refcount--;
600	/* need to wait until all callers have exited */
601	while (f->refcount != 0) {
602		mtx_unlock(&usb_ref_lock);	/* avoid LOR */
603		mtx_lock(f->priv_mtx);
604		/* prevent write flush, if any */
605		f->flag_iserror = 1;
606		/* get I/O thread out of any sleep state */
607		if (f->flag_sleeping) {
608			f->flag_sleeping = 0;
609			cv_broadcast(&f->cv_io);
610		}
611		mtx_unlock(f->priv_mtx);
612		mtx_lock(&usb_ref_lock);
613
614		/*
615		 * Check if the "f->refcount" variable reached zero
616		 * during the unlocked time before entering wait:
617		 */
618		if (f->refcount == 0)
619			break;
620
621		/* wait for sync */
622		cv_wait(&f->cv_drain, &usb_ref_lock);
623	}
624	mtx_unlock(&usb_ref_lock);
625
626	/* take care of closing the device here, if any */
627	usb_fifo_close(f, 0);
628
629	cv_destroy(&f->cv_io);
630	cv_destroy(&f->cv_drain);
631
632	knlist_clear(&f->selinfo.si_note, 0);
633	seldrain(&f->selinfo);
634	knlist_destroy(&f->selinfo.si_note);
635
636	free(f, M_USBDEV);
637}
638
639static struct usb_endpoint *
640usb_dev_get_ep(struct usb_device *udev, uint8_t ep_index, uint8_t dir)
641{
642	struct usb_endpoint *ep;
643	uint8_t ep_dir;
644
645	if (ep_index == 0) {
646		ep = &udev->ctrl_ep;
647	} else {
648		if (dir == USB_FIFO_RX) {
649			if (udev->flags.usb_mode == USB_MODE_HOST) {
650				ep_dir = UE_DIR_IN;
651			} else {
652				ep_dir = UE_DIR_OUT;
653			}
654		} else {
655			if (udev->flags.usb_mode == USB_MODE_HOST) {
656				ep_dir = UE_DIR_OUT;
657			} else {
658				ep_dir = UE_DIR_IN;
659			}
660		}
661		ep = usbd_get_ep_by_addr(udev, ep_index | ep_dir);
662	}
663
664	if (ep == NULL) {
665		/* if the endpoint does not exist then return */
666		return (NULL);
667	}
668	if (ep->edesc == NULL) {
669		/* invalid endpoint */
670		return (NULL);
671	}
672	return (ep);			/* success */
673}
674
675/*------------------------------------------------------------------------*
676 *	usb_fifo_open
677 *
678 * Returns:
679 * 0: Success
680 * Else: Failure
681 *------------------------------------------------------------------------*/
682static int
683usb_fifo_open(struct usb_cdev_privdata *cpd,
684    struct usb_fifo *f, int fflags)
685{
686	int err;
687
688	if (f == NULL) {
689		/* no FIFO there */
690		DPRINTFN(2, "no FIFO\n");
691		return (ENXIO);
692	}
693	/* remove FWRITE and FREAD flags */
694	fflags &= ~(FWRITE | FREAD);
695
696	/* set correct file flags */
697	if ((f->fifo_index & 1) == USB_FIFO_TX) {
698		fflags |= FWRITE;
699	} else {
700		fflags |= FREAD;
701	}
702
703	/* check if we are already opened */
704	/* we don't need any locks when checking this variable */
705	if (f->curr_cpd != NULL) {
706		err = EBUSY;
707		goto done;
708	}
709
710	/* reset short flag before open */
711	f->flag_short = 0;
712
713	/* call open method */
714	err = (f->methods->f_open) (f, fflags);
715	if (err) {
716		goto done;
717	}
718	mtx_lock(f->priv_mtx);
719
720	/* reset sleep flag */
721	f->flag_sleeping = 0;
722
723	/* reset error flag */
724	f->flag_iserror = 0;
725
726	/* reset complete flag */
727	f->flag_iscomplete = 0;
728
729	/* reset select flag */
730	f->flag_isselect = 0;
731
732	/* reset flushing flag */
733	f->flag_flushing = 0;
734
735	/* reset ASYNC proc flag */
736	f->async_p = NULL;
737
738	mtx_lock(&usb_ref_lock);
739	/* flag the fifo as opened to prevent others */
740	f->curr_cpd = cpd;
741	mtx_unlock(&usb_ref_lock);
742
743	/* reset queue */
744	usb_fifo_reset(f);
745
746	mtx_unlock(f->priv_mtx);
747done:
748	return (err);
749}
750
751/*------------------------------------------------------------------------*
752 *	usb_fifo_reset
753 *------------------------------------------------------------------------*/
754void
755usb_fifo_reset(struct usb_fifo *f)
756{
757	struct usb_mbuf *m;
758
759	if (f == NULL) {
760		return;
761	}
762	while (1) {
763		USB_IF_DEQUEUE(&f->used_q, m);
764		if (m) {
765			USB_IF_ENQUEUE(&f->free_q, m);
766		} else {
767			break;
768		}
769	}
770	/* reset have fragment flag */
771	f->flag_have_fragment = 0;
772}
773
774/*------------------------------------------------------------------------*
775 *	usb_fifo_close
776 *------------------------------------------------------------------------*/
777static void
778usb_fifo_close(struct usb_fifo *f, int fflags)
779{
780	int err;
781
782	/* check if we are not opened */
783	if (f->curr_cpd == NULL) {
784		/* nothing to do - already closed */
785		return;
786	}
787	mtx_lock(f->priv_mtx);
788
789	/* clear current cdev private data pointer */
790	mtx_lock(&usb_ref_lock);
791	f->curr_cpd = NULL;
792	mtx_unlock(&usb_ref_lock);
793
794	/* check if we are watched by kevent */
795	KNOTE_LOCKED(&f->selinfo.si_note, 0);
796
797	/* check if we are selected */
798	if (f->flag_isselect) {
799		selwakeup(&f->selinfo);
800		f->flag_isselect = 0;
801	}
802	/* check if a thread wants SIGIO */
803	if (f->async_p != NULL) {
804		PROC_LOCK(f->async_p);
805		kern_psignal(f->async_p, SIGIO);
806		PROC_UNLOCK(f->async_p);
807		f->async_p = NULL;
808	}
809	/* remove FWRITE and FREAD flags */
810	fflags &= ~(FWRITE | FREAD);
811
812	/* flush written data, if any */
813	if ((f->fifo_index & 1) == USB_FIFO_TX) {
814		if (!f->flag_iserror) {
815			/* set flushing flag */
816			f->flag_flushing = 1;
817
818			/* get the last packet in */
819			if (f->flag_have_fragment) {
820				struct usb_mbuf *m;
821				f->flag_have_fragment = 0;
822				USB_IF_DEQUEUE(&f->free_q, m);
823				if (m) {
824					USB_IF_ENQUEUE(&f->used_q, m);
825				}
826			}
827
828			/* start write transfer, if not already started */
829			(f->methods->f_start_write) (f);
830
831			/* check if flushed already */
832			while (f->flag_flushing &&
833			    (!f->flag_iserror)) {
834				/* wait until all data has been written */
835				f->flag_sleeping = 1;
836				err = cv_timedwait_sig(&f->cv_io, f->priv_mtx,
837				    USB_MS_TO_TICKS(USB_DEFAULT_TIMEOUT));
838				if (err) {
839					DPRINTF("signal received\n");
840					break;
841				}
842			}
843		}
844		fflags |= FWRITE;
845
846		/* stop write transfer, if not already stopped */
847		(f->methods->f_stop_write) (f);
848	} else {
849		fflags |= FREAD;
850
851		/* stop write transfer, if not already stopped */
852		(f->methods->f_stop_read) (f);
853	}
854
855	/* check if we are sleeping */
856	if (f->flag_sleeping) {
857		DPRINTFN(2, "Sleeping at close!\n");
858	}
859	mtx_unlock(f->priv_mtx);
860
861	/* call close method */
862	(f->methods->f_close) (f, fflags);
863
864	DPRINTF("closed\n");
865}
866
867/*------------------------------------------------------------------------*
868 *	usb_open - cdev callback
869 *------------------------------------------------------------------------*/
870static int
871usb_open(struct cdev *dev, int fflags, int devtype, struct thread *td)
872{
873	struct usb_fs_privdata* pd = (struct usb_fs_privdata*)dev->si_drv1;
874	struct usb_cdev_refdata refs;
875	struct usb_cdev_privdata *cpd;
876	int err;
877
878	DPRINTFN(2, "%s fflags=0x%08x\n", devtoname(dev), fflags);
879
880	KASSERT(fflags & (FREAD|FWRITE), ("invalid open flags"));
881	if (((fflags & FREAD) && !(pd->mode & FREAD)) ||
882	    ((fflags & FWRITE) && !(pd->mode & FWRITE))) {
883		DPRINTFN(2, "access mode not supported\n");
884		return (EPERM);
885	}
886
887	cpd = malloc(sizeof(*cpd), M_USBDEV, M_WAITOK | M_ZERO);
888
889	usb_loc_fill(pd, cpd);
890	err = usb_ref_device(cpd, &refs, 1);
891	if (err) {
892		DPRINTFN(2, "cannot ref device\n");
893		free(cpd, M_USBDEV);
894		return (ENXIO);
895	}
896	cpd->fflags = fflags;	/* access mode for open lifetime */
897
898	/* create FIFOs, if any */
899	err = usb_fifo_create(cpd, &refs);
900	/* check for error */
901	if (err) {
902		DPRINTFN(2, "cannot create fifo\n");
903		usb_unref_device(cpd, &refs);
904		free(cpd, M_USBDEV);
905		return (err);
906	}
907	if (fflags & FREAD) {
908		err = usb_fifo_open(cpd, refs.rxfifo, fflags);
909		if (err) {
910			DPRINTFN(2, "read open failed\n");
911			usb_unref_device(cpd, &refs);
912			free(cpd, M_USBDEV);
913			return (err);
914		}
915	}
916	if (fflags & FWRITE) {
917		err = usb_fifo_open(cpd, refs.txfifo, fflags);
918		if (err) {
919			DPRINTFN(2, "write open failed\n");
920			if (fflags & FREAD) {
921				usb_fifo_close(refs.rxfifo, fflags);
922			}
923			usb_unref_device(cpd, &refs);
924			free(cpd, M_USBDEV);
925			return (err);
926		}
927	}
928	usb_unref_device(cpd, &refs);
929	devfs_set_cdevpriv(cpd, usb_close);
930
931	return (0);
932}
933
934/*------------------------------------------------------------------------*
935 *	usb_close - cdev callback
936 *------------------------------------------------------------------------*/
937static void
938usb_close(void *arg)
939{
940	struct usb_cdev_refdata refs;
941	struct usb_cdev_privdata *cpd = arg;
942	int err;
943
944	DPRINTFN(2, "cpd=%p\n", cpd);
945
946	err = usb_ref_device(cpd, &refs,
947	    2 /* uref and allow detached state */);
948	if (err) {
949		DPRINTFN(2, "Cannot grab USB reference when "
950		    "closing USB file handle\n");
951		goto done;
952	}
953	if (cpd->fflags & FREAD) {
954		usb_fifo_close(refs.rxfifo, cpd->fflags);
955	}
956	if (cpd->fflags & FWRITE) {
957		usb_fifo_close(refs.txfifo, cpd->fflags);
958	}
959	usb_unref_device(cpd, &refs);
960done:
961	free(cpd, M_USBDEV);
962}
963
964static void
965usb_dev_init(void *arg)
966{
967	mtx_init(&usb_ref_lock, "USB ref mutex", NULL, MTX_DEF);
968	sx_init(&usb_sym_lock, "USB sym mutex");
969	TAILQ_INIT(&usb_sym_head);
970
971	/* check the UGEN methods */
972	usb_fifo_check_methods(&usb_ugen_methods);
973}
974
975SYSINIT(usb_dev_init, SI_SUB_KLD, SI_ORDER_FIRST, usb_dev_init, NULL);
976
977static void
978usb_dev_init_post(void *arg)
979{
980	/*
981	 * Create /dev/usb - this is needed for usbconfig(8), which
982	 * needs a well-known device name to access.
983	 */
984	usb_dev = make_dev(&usb_static_devsw, 0, UID_ROOT, GID_OPERATOR,
985	    0644, USB_DEVICE_NAME);
986	if (usb_dev == NULL) {
987		DPRINTFN(0, "Could not create usb bus device\n");
988	}
989}
990
991SYSINIT(usb_dev_init_post, SI_SUB_KICK_SCHEDULER, SI_ORDER_FIRST, usb_dev_init_post, NULL);
992
993static void
994usb_dev_uninit(void *arg)
995{
996	if (usb_dev != NULL) {
997		destroy_dev(usb_dev);
998		usb_dev = NULL;
999	}
1000	mtx_destroy(&usb_ref_lock);
1001	sx_destroy(&usb_sym_lock);
1002}
1003
1004SYSUNINIT(usb_dev_uninit, SI_SUB_KICK_SCHEDULER, SI_ORDER_ANY, usb_dev_uninit, NULL);
1005
1006static int
1007usb_ioctl_f_sub(struct usb_fifo *f, u_long cmd, void *addr,
1008    struct thread *td)
1009{
1010	int error = 0;
1011
1012	switch (cmd) {
1013	case FIODTYPE:
1014		*(int *)addr = 0;	/* character device */
1015		break;
1016
1017	case FIONBIO:
1018		/* handled by upper FS layer */
1019		break;
1020
1021	case FIOASYNC:
1022		if (*(int *)addr) {
1023			if (f->async_p != NULL) {
1024				error = EBUSY;
1025				break;
1026			}
1027			f->async_p = USB_TD_GET_PROC(td);
1028		} else {
1029			f->async_p = NULL;
1030		}
1031		break;
1032
1033		/* XXX this is not the most general solution */
1034	case TIOCSPGRP:
1035		if (f->async_p == NULL) {
1036			error = EINVAL;
1037			break;
1038		}
1039		if (*(int *)addr != USB_PROC_GET_GID(f->async_p)) {
1040			error = EPERM;
1041			break;
1042		}
1043		break;
1044	default:
1045		return (ENOIOCTL);
1046	}
1047	DPRINTFN(3, "cmd 0x%lx = %d\n", cmd, error);
1048	return (error);
1049}
1050
1051/*------------------------------------------------------------------------*
1052 *	usb_ioctl - cdev callback
1053 *------------------------------------------------------------------------*/
1054static int
1055usb_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int fflag, struct thread* td)
1056{
1057	struct usb_cdev_refdata refs;
1058	struct usb_cdev_privdata* cpd;
1059	struct usb_fifo *f;
1060	int fflags;
1061	int err;
1062
1063	DPRINTFN(2, "cmd=0x%lx\n", cmd);
1064
1065	err = devfs_get_cdevpriv((void **)&cpd);
1066	if (err != 0)
1067		return (err);
1068
1069	/*
1070	 * Performance optimisation: We try to check for IOCTL's that
1071	 * don't need the USB reference first. Then we grab the USB
1072	 * reference if we need it!
1073	 */
1074	err = usb_ref_device(cpd, &refs, 0 /* no uref */ );
1075	if (err)
1076		return (ENXIO);
1077
1078	fflags = cpd->fflags;
1079
1080	f = NULL;			/* set default value */
1081	err = ENOIOCTL;			/* set default value */
1082
1083	if (fflags & FWRITE) {
1084		f = refs.txfifo;
1085		err = usb_ioctl_f_sub(f, cmd, addr, td);
1086	}
1087	if (fflags & FREAD) {
1088		f = refs.rxfifo;
1089		err = usb_ioctl_f_sub(f, cmd, addr, td);
1090	}
1091	KASSERT(f != NULL, ("fifo not found"));
1092	if (err != ENOIOCTL)
1093		goto done;
1094
1095	err = (f->methods->f_ioctl) (f, cmd, addr, fflags);
1096
1097	DPRINTFN(2, "f_ioctl cmd 0x%lx = %d\n", cmd, err);
1098
1099	if (err != ENOIOCTL)
1100		goto done;
1101
1102	if (usb_usb_ref_device(cpd, &refs)) {
1103		/* we lost the reference */
1104		return (ENXIO);
1105	}
1106
1107	err = (f->methods->f_ioctl_post) (f, cmd, addr, fflags);
1108
1109	DPRINTFN(2, "f_ioctl_post cmd 0x%lx = %d\n", cmd, err);
1110
1111	if (err == ENOIOCTL)
1112		err = ENOTTY;
1113
1114	if (err)
1115		goto done;
1116
1117	/* Wait for re-enumeration, if any */
1118
1119	while (f->udev->re_enumerate_wait != USB_RE_ENUM_DONE) {
1120		usb_unref_device(cpd, &refs);
1121
1122		usb_pause_mtx(NULL, hz / 128);
1123
1124		while (usb_ref_device(cpd, &refs, 1 /* need uref */)) {
1125			if (usb_ref_device(cpd, &refs, 0)) {
1126				/* device no longer exists */
1127				return (ENXIO);
1128			}
1129			usb_unref_device(cpd, &refs);
1130			usb_pause_mtx(NULL, hz / 128);
1131		}
1132	}
1133
1134done:
1135	usb_unref_device(cpd, &refs);
1136	return (err);
1137}
1138
1139static void
1140usb_filter_detach(struct knote *kn)
1141{
1142	struct usb_fifo *f = kn->kn_hook;
1143	knlist_remove(&f->selinfo.si_note, kn, 0);
1144}
1145
1146static int
1147usb_filter_write(struct knote *kn, long hint)
1148{
1149	struct usb_cdev_privdata* cpd;
1150	struct usb_fifo *f;
1151	struct usb_mbuf *m;
1152
1153	DPRINTFN(2, "\n");
1154
1155	f = kn->kn_hook;
1156
1157	USB_MTX_ASSERT(f->priv_mtx, MA_OWNED);
1158
1159	cpd = f->curr_cpd;
1160	if (cpd == NULL) {
1161		m = (void *)1;
1162	} else if (f->fs_ep_max == 0) {
1163		if (f->flag_iserror) {
1164			/* we got an error */
1165			m = (void *)1;
1166		} else {
1167			if (f->queue_data == NULL) {
1168				/*
1169				 * start write transfer, if not
1170				 * already started
1171				 */
1172				(f->methods->f_start_write) (f);
1173			}
1174			/* check if any packets are available */
1175			USB_IF_POLL(&f->free_q, m);
1176		}
1177	} else {
1178		if (f->flag_iscomplete) {
1179			m = (void *)1;
1180		} else {
1181			m = NULL;
1182		}
1183	}
1184	return (m ? 1 : 0);
1185}
1186
1187static int
1188usb_filter_read(struct knote *kn, long hint)
1189{
1190	struct usb_cdev_privdata* cpd;
1191	struct usb_fifo *f;
1192	struct usb_mbuf *m;
1193
1194	DPRINTFN(2, "\n");
1195
1196	f = kn->kn_hook;
1197
1198	USB_MTX_ASSERT(f->priv_mtx, MA_OWNED);
1199
1200	cpd = f->curr_cpd;
1201	if (cpd == NULL) {
1202		m = (void *)1;
1203	} else if (f->fs_ep_max == 0) {
1204		if (f->flag_iserror) {
1205			/* we have an error */
1206			m = (void *)1;
1207		} else {
1208			if (f->queue_data == NULL) {
1209				/*
1210				 * start read transfer, if not
1211				 * already started
1212				 */
1213				(f->methods->f_start_read) (f);
1214			}
1215			/* check if any packets are available */
1216			USB_IF_POLL(&f->used_q, m);
1217
1218			/* start reading data, if any */
1219			if (m == NULL)
1220				(f->methods->f_start_read) (f);
1221		}
1222	} else {
1223		if (f->flag_iscomplete) {
1224			m = (void *)1;
1225		} else {
1226			m = NULL;
1227		}
1228	}
1229	return (m ? 1 : 0);
1230}
1231
1232static struct filterops usb_filtops_write = {
1233	.f_isfd = 1,
1234	.f_detach = usb_filter_detach,
1235	.f_event = usb_filter_write,
1236};
1237
1238static struct filterops usb_filtops_read = {
1239	.f_isfd = 1,
1240	.f_detach = usb_filter_detach,
1241	.f_event = usb_filter_read,
1242};
1243
1244/* ARGSUSED */
1245static int
1246usb_kqfilter(struct cdev* dev, struct knote *kn)
1247{
1248	struct usb_cdev_refdata refs;
1249	struct usb_cdev_privdata* cpd;
1250	struct usb_fifo *f;
1251	int fflags;
1252	int err = EINVAL;
1253
1254	DPRINTFN(2, "\n");
1255
1256	if (devfs_get_cdevpriv((void **)&cpd) != 0 ||
1257	    usb_ref_device(cpd, &refs, 0) != 0)
1258		return (ENXIO);
1259
1260	fflags = cpd->fflags;
1261
1262	/* Figure out who needs service */
1263	switch (kn->kn_filter) {
1264	case EVFILT_WRITE:
1265		if (fflags & FWRITE) {
1266			f = refs.txfifo;
1267			kn->kn_fop = &usb_filtops_write;
1268			err = 0;
1269		}
1270		break;
1271	case EVFILT_READ:
1272		if (fflags & FREAD) {
1273			f = refs.rxfifo;
1274			kn->kn_fop = &usb_filtops_read;
1275			err = 0;
1276		}
1277		break;
1278	default:
1279		err = EOPNOTSUPP;
1280		break;
1281	}
1282
1283	if (err == 0) {
1284		kn->kn_hook = f;
1285		mtx_lock(f->priv_mtx);
1286		knlist_add(&f->selinfo.si_note, kn, 1);
1287		mtx_unlock(f->priv_mtx);
1288	}
1289
1290	usb_unref_device(cpd, &refs);
1291	return (err);
1292}
1293
1294/* ARGSUSED */
1295static int
1296usb_poll(struct cdev* dev, int events, struct thread* td)
1297{
1298	struct usb_cdev_refdata refs;
1299	struct usb_cdev_privdata* cpd;
1300	struct usb_fifo *f;
1301	struct usb_mbuf *m;
1302	int fflags, revents;
1303
1304	if (devfs_get_cdevpriv((void **)&cpd) != 0 ||
1305	    usb_ref_device(cpd, &refs, 0) != 0)
1306		return (events &
1307		    (POLLHUP|POLLIN|POLLRDNORM|POLLOUT|POLLWRNORM));
1308
1309	fflags = cpd->fflags;
1310
1311	/* Figure out who needs service */
1312	revents = 0;
1313	if ((events & (POLLOUT | POLLWRNORM)) &&
1314	    (fflags & FWRITE)) {
1315		f = refs.txfifo;
1316
1317		mtx_lock(f->priv_mtx);
1318
1319		if (!refs.is_usbfs) {
1320			if (f->flag_iserror) {
1321				/* we got an error */
1322				m = (void *)1;
1323			} else {
1324				if (f->queue_data == NULL) {
1325					/*
1326					 * start write transfer, if not
1327					 * already started
1328					 */
1329					(f->methods->f_start_write) (f);
1330				}
1331				/* check if any packets are available */
1332				USB_IF_POLL(&f->free_q, m);
1333			}
1334		} else {
1335			if (f->flag_iscomplete) {
1336				m = (void *)1;
1337			} else {
1338				m = NULL;
1339			}
1340		}
1341
1342		if (m) {
1343			revents |= events & (POLLOUT | POLLWRNORM);
1344		} else {
1345			f->flag_isselect = 1;
1346			selrecord(td, &f->selinfo);
1347		}
1348
1349		mtx_unlock(f->priv_mtx);
1350	}
1351	if ((events & (POLLIN | POLLRDNORM)) &&
1352	    (fflags & FREAD)) {
1353		f = refs.rxfifo;
1354
1355		mtx_lock(f->priv_mtx);
1356
1357		if (!refs.is_usbfs) {
1358			if (f->flag_iserror) {
1359				/* we have an error */
1360				m = (void *)1;
1361			} else {
1362				if (f->queue_data == NULL) {
1363					/*
1364					 * start read transfer, if not
1365					 * already started
1366					 */
1367					(f->methods->f_start_read) (f);
1368				}
1369				/* check if any packets are available */
1370				USB_IF_POLL(&f->used_q, m);
1371			}
1372		} else {
1373			if (f->flag_iscomplete) {
1374				m = (void *)1;
1375			} else {
1376				m = NULL;
1377			}
1378		}
1379
1380		if (m) {
1381			revents |= events & (POLLIN | POLLRDNORM);
1382		} else {
1383			f->flag_isselect = 1;
1384			selrecord(td, &f->selinfo);
1385
1386			if (!refs.is_usbfs) {
1387				/* start reading data */
1388				(f->methods->f_start_read) (f);
1389			}
1390		}
1391
1392		mtx_unlock(f->priv_mtx);
1393	}
1394	usb_unref_device(cpd, &refs);
1395	return (revents);
1396}
1397
1398static int
1399usb_read(struct cdev *dev, struct uio *uio, int ioflag)
1400{
1401	struct usb_cdev_refdata refs;
1402	struct usb_cdev_privdata* cpd;
1403	struct usb_fifo *f;
1404	struct usb_mbuf *m;
1405	int io_len;
1406	int err;
1407	uint8_t tr_data = 0;
1408
1409	err = devfs_get_cdevpriv((void **)&cpd);
1410	if (err != 0)
1411		return (err);
1412
1413	err = usb_ref_device(cpd, &refs, 0 /* no uref */ );
1414	if (err)
1415		return (ENXIO);
1416
1417	f = refs.rxfifo;
1418	if (f == NULL) {
1419		/* should not happen */
1420		usb_unref_device(cpd, &refs);
1421		return (EPERM);
1422	}
1423
1424	mtx_lock(f->priv_mtx);
1425
1426	/* check for permanent read error */
1427	if (f->flag_iserror) {
1428		err = EIO;
1429		goto done;
1430	}
1431	/* check if USB-FS interface is active */
1432	if (refs.is_usbfs) {
1433		/*
1434		 * The queue is used for events that should be
1435		 * retrieved using the "USB_FS_COMPLETE" ioctl.
1436		 */
1437		err = EINVAL;
1438		goto done;
1439	}
1440	while (uio->uio_resid > 0) {
1441		USB_IF_DEQUEUE(&f->used_q, m);
1442
1443		if (m == NULL) {
1444			/* start read transfer, if not already started */
1445
1446			(f->methods->f_start_read) (f);
1447
1448			if (ioflag & IO_NDELAY) {
1449				if (tr_data) {
1450					/* return length before error */
1451					break;
1452				}
1453				err = EWOULDBLOCK;
1454				break;
1455			}
1456			DPRINTF("sleeping\n");
1457
1458			err = usb_fifo_wait(f);
1459			if (err) {
1460				break;
1461			}
1462			continue;
1463		}
1464		if (f->methods->f_filter_read) {
1465			/*
1466			 * Sometimes it is convenient to process data at the
1467			 * expense of a userland process instead of a kernel
1468			 * process.
1469			 */
1470			(f->methods->f_filter_read) (f, m);
1471		}
1472		tr_data = 1;
1473
1474		io_len = MIN(m->cur_data_len, uio->uio_resid);
1475
1476		DPRINTFN(2, "transfer %d bytes from %p\n",
1477		    io_len, m->cur_data_ptr);
1478
1479		err = usb_fifo_uiomove(f,
1480		    m->cur_data_ptr, io_len, uio);
1481
1482		m->cur_data_len -= io_len;
1483		m->cur_data_ptr += io_len;
1484
1485		if (m->cur_data_len == 0) {
1486			uint8_t last_packet;
1487
1488			last_packet = m->last_packet;
1489
1490			USB_IF_ENQUEUE(&f->free_q, m);
1491
1492			if (last_packet) {
1493				/* keep framing */
1494				break;
1495			}
1496		} else {
1497			USB_IF_PREPEND(&f->used_q, m);
1498		}
1499
1500		if (err) {
1501			break;
1502		}
1503	}
1504done:
1505	mtx_unlock(f->priv_mtx);
1506
1507	usb_unref_device(cpd, &refs);
1508
1509	return (err);
1510}
1511
1512static int
1513usb_write(struct cdev *dev, struct uio *uio, int ioflag)
1514{
1515	struct usb_cdev_refdata refs;
1516	struct usb_cdev_privdata* cpd;
1517	struct usb_fifo *f;
1518	struct usb_mbuf *m;
1519	uint8_t *pdata;
1520	int io_len;
1521	int err;
1522	uint8_t tr_data = 0;
1523
1524	DPRINTFN(2, "\n");
1525
1526	err = devfs_get_cdevpriv((void **)&cpd);
1527	if (err != 0)
1528		return (err);
1529
1530	err = usb_ref_device(cpd, &refs, 0 /* no uref */ );
1531	if (err)
1532		return (ENXIO);
1533
1534	f = refs.txfifo;
1535	if (f == NULL) {
1536		/* should not happen */
1537		usb_unref_device(cpd, &refs);
1538		return (EPERM);
1539	}
1540
1541	mtx_lock(f->priv_mtx);
1542
1543	/* check for permanent write error */
1544	if (f->flag_iserror) {
1545		err = EIO;
1546		goto done;
1547	}
1548	/* check if USB-FS interface is active */
1549	if (refs.is_usbfs) {
1550		/*
1551		 * The queue is used for events that should be
1552		 * retrieved using the "USB_FS_COMPLETE" ioctl.
1553		 */
1554		err = EINVAL;
1555		goto done;
1556	}
1557	if (f->queue_data == NULL) {
1558		/* start write transfer, if not already started */
1559		(f->methods->f_start_write) (f);
1560	}
1561	/* we allow writing zero length data */
1562	do {
1563		USB_IF_DEQUEUE(&f->free_q, m);
1564
1565		if (m == NULL) {
1566			if (ioflag & IO_NDELAY) {
1567				if (tr_data) {
1568					/* return length before error */
1569					break;
1570				}
1571				err = EWOULDBLOCK;
1572				break;
1573			}
1574			DPRINTF("sleeping\n");
1575
1576			err = usb_fifo_wait(f);
1577			if (err) {
1578				break;
1579			}
1580			continue;
1581		}
1582		tr_data = 1;
1583
1584		if (f->flag_have_fragment == 0) {
1585			USB_MBUF_RESET(m);
1586			io_len = m->cur_data_len;
1587			pdata = m->cur_data_ptr;
1588			if (io_len > uio->uio_resid)
1589				io_len = uio->uio_resid;
1590			m->cur_data_len = io_len;
1591		} else {
1592			io_len = m->max_data_len - m->cur_data_len;
1593			pdata = m->cur_data_ptr + m->cur_data_len;
1594			if (io_len > uio->uio_resid)
1595				io_len = uio->uio_resid;
1596			m->cur_data_len += io_len;
1597		}
1598
1599		DPRINTFN(2, "transfer %d bytes to %p\n",
1600		    io_len, pdata);
1601
1602		err = usb_fifo_uiomove(f, pdata, io_len, uio);
1603
1604		if (err) {
1605			f->flag_have_fragment = 0;
1606			USB_IF_ENQUEUE(&f->free_q, m);
1607			break;
1608		}
1609
1610		/* check if the buffer is ready to be transmitted */
1611
1612		if ((f->flag_write_defrag == 0) ||
1613		    (m->cur_data_len == m->max_data_len)) {
1614			f->flag_have_fragment = 0;
1615
1616			/*
1617			 * Check for write filter:
1618			 *
1619			 * Sometimes it is convenient to process data
1620			 * at the expense of a userland process
1621			 * instead of a kernel process.
1622			 */
1623			if (f->methods->f_filter_write) {
1624				(f->methods->f_filter_write) (f, m);
1625			}
1626
1627			/* Put USB mbuf in the used queue */
1628			USB_IF_ENQUEUE(&f->used_q, m);
1629
1630			/* Start writing data, if not already started */
1631			(f->methods->f_start_write) (f);
1632		} else {
1633			/* Wait for more data or close */
1634			f->flag_have_fragment = 1;
1635			USB_IF_PREPEND(&f->free_q, m);
1636		}
1637
1638	} while (uio->uio_resid > 0);
1639done:
1640	mtx_unlock(f->priv_mtx);
1641
1642	usb_unref_device(cpd, &refs);
1643
1644	return (err);
1645}
1646
1647int
1648usb_static_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag,
1649    struct thread *td)
1650{
1651	union {
1652		struct usb_read_dir *urd;
1653		void* data;
1654	} u;
1655	int err;
1656
1657	u.data = data;
1658	switch (cmd) {
1659		case USB_READ_DIR:
1660			err = usb_read_symlink(u.urd->urd_data,
1661			    u.urd->urd_startentry, u.urd->urd_maxlen);
1662			break;
1663		case USB_DEV_QUIRK_GET:
1664		case USB_QUIRK_NAME_GET:
1665		case USB_DEV_QUIRK_ADD:
1666		case USB_DEV_QUIRK_REMOVE:
1667			err = usb_quirk_ioctl_p(cmd, data, fflag, td);
1668			break;
1669		case USB_GET_TEMPLATE:
1670			*(int *)data = usb_template;
1671			err = 0;
1672			break;
1673		case USB_SET_TEMPLATE:
1674			err = priv_check(curthread, PRIV_DRIVER);
1675			if (err)
1676				break;
1677			usb_template = *(int *)data;
1678			break;
1679		default:
1680			err = ENOTTY;
1681			break;
1682	}
1683	return (err);
1684}
1685
1686static int
1687usb_fifo_uiomove(struct usb_fifo *f, void *cp,
1688    int n, struct uio *uio)
1689{
1690	int error;
1691
1692	mtx_unlock(f->priv_mtx);
1693
1694	/*
1695	 * "uiomove()" can sleep so one needs to make a wrapper,
1696	 * exiting the mutex and checking things:
1697	 */
1698	error = uiomove(cp, n, uio);
1699
1700	mtx_lock(f->priv_mtx);
1701
1702	return (error);
1703}
1704
1705int
1706usb_fifo_wait(struct usb_fifo *f)
1707{
1708	int err;
1709
1710	USB_MTX_ASSERT(f->priv_mtx, MA_OWNED);
1711
1712	if (f->flag_iserror) {
1713		/* we are gone */
1714		return (EIO);
1715	}
1716	f->flag_sleeping = 1;
1717
1718	err = cv_wait_sig(&f->cv_io, f->priv_mtx);
1719
1720	if (f->flag_iserror) {
1721		/* we are gone */
1722		err = EIO;
1723	}
1724	return (err);
1725}
1726
1727void
1728usb_fifo_signal(struct usb_fifo *f)
1729{
1730	if (f->flag_sleeping) {
1731		f->flag_sleeping = 0;
1732		cv_broadcast(&f->cv_io);
1733	}
1734}
1735
1736void
1737usb_fifo_wakeup(struct usb_fifo *f)
1738{
1739	usb_fifo_signal(f);
1740
1741	KNOTE_LOCKED(&f->selinfo.si_note, 0);
1742
1743	if (f->flag_isselect) {
1744		selwakeup(&f->selinfo);
1745		f->flag_isselect = 0;
1746	}
1747	if (f->async_p != NULL) {
1748		PROC_LOCK(f->async_p);
1749		kern_psignal(f->async_p, SIGIO);
1750		PROC_UNLOCK(f->async_p);
1751	}
1752}
1753
1754static int
1755usb_fifo_dummy_open(struct usb_fifo *fifo, int fflags)
1756{
1757	return (0);
1758}
1759
1760static void
1761usb_fifo_dummy_close(struct usb_fifo *fifo, int fflags)
1762{
1763	return;
1764}
1765
1766static int
1767usb_fifo_dummy_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, int fflags)
1768{
1769	return (ENOIOCTL);
1770}
1771
1772static void
1773usb_fifo_dummy_cmd(struct usb_fifo *fifo)
1774{
1775	fifo->flag_flushing = 0;	/* not flushing */
1776}
1777
1778static void
1779usb_fifo_check_methods(struct usb_fifo_methods *pm)
1780{
1781	/* check that all callback functions are OK */
1782
1783	if (pm->f_open == NULL)
1784		pm->f_open = &usb_fifo_dummy_open;
1785
1786	if (pm->f_close == NULL)
1787		pm->f_close = &usb_fifo_dummy_close;
1788
1789	if (pm->f_ioctl == NULL)
1790		pm->f_ioctl = &usb_fifo_dummy_ioctl;
1791
1792	if (pm->f_ioctl_post == NULL)
1793		pm->f_ioctl_post = &usb_fifo_dummy_ioctl;
1794
1795	if (pm->f_start_read == NULL)
1796		pm->f_start_read = &usb_fifo_dummy_cmd;
1797
1798	if (pm->f_stop_read == NULL)
1799		pm->f_stop_read = &usb_fifo_dummy_cmd;
1800
1801	if (pm->f_start_write == NULL)
1802		pm->f_start_write = &usb_fifo_dummy_cmd;
1803
1804	if (pm->f_stop_write == NULL)
1805		pm->f_stop_write = &usb_fifo_dummy_cmd;
1806}
1807
1808/*------------------------------------------------------------------------*
1809 *	usb_fifo_attach
1810 *
1811 * The following function will create a duplex FIFO.
1812 *
1813 * Return values:
1814 * 0: Success.
1815 * Else: Failure.
1816 *------------------------------------------------------------------------*/
1817int
1818usb_fifo_attach(struct usb_device *udev, void *priv_sc,
1819    struct mtx *priv_mtx, struct usb_fifo_methods *pm,
1820    struct usb_fifo_sc *f_sc, uint16_t unit, int16_t subunit,
1821    uint8_t iface_index, uid_t uid, gid_t gid, int mode)
1822{
1823	struct usb_fifo *f_tx;
1824	struct usb_fifo *f_rx;
1825	char devname[32];
1826	uint8_t n;
1827
1828	f_sc->fp[USB_FIFO_TX] = NULL;
1829	f_sc->fp[USB_FIFO_RX] = NULL;
1830
1831	if (pm == NULL)
1832		return (EINVAL);
1833
1834	/* check the methods */
1835	usb_fifo_check_methods(pm);
1836
1837	if (priv_mtx == NULL)
1838		priv_mtx = &Giant;
1839
1840	/* search for a free FIFO slot */
1841	for (n = 0;; n += 2) {
1842		if (n == USB_FIFO_MAX) {
1843			/* end of FIFOs reached */
1844			return (ENOMEM);
1845		}
1846		/* Check for TX FIFO */
1847		if (udev->fifo[n + USB_FIFO_TX] != NULL) {
1848			continue;
1849		}
1850		/* Check for RX FIFO */
1851		if (udev->fifo[n + USB_FIFO_RX] != NULL) {
1852			continue;
1853		}
1854		break;
1855	}
1856
1857	f_tx = usb_fifo_alloc(priv_mtx);
1858	f_rx = usb_fifo_alloc(priv_mtx);
1859
1860	if ((f_tx == NULL) || (f_rx == NULL)) {
1861		usb_fifo_free(f_tx);
1862		usb_fifo_free(f_rx);
1863		return (ENOMEM);
1864	}
1865	/* initialise FIFO structures */
1866
1867	f_tx->fifo_index = n + USB_FIFO_TX;
1868	f_tx->dev_ep_index = -1;
1869	f_tx->priv_sc0 = priv_sc;
1870	f_tx->methods = pm;
1871	f_tx->iface_index = iface_index;
1872	f_tx->udev = udev;
1873
1874	f_rx->fifo_index = n + USB_FIFO_RX;
1875	f_rx->dev_ep_index = -1;
1876	f_rx->priv_sc0 = priv_sc;
1877	f_rx->methods = pm;
1878	f_rx->iface_index = iface_index;
1879	f_rx->udev = udev;
1880
1881	f_sc->fp[USB_FIFO_TX] = f_tx;
1882	f_sc->fp[USB_FIFO_RX] = f_rx;
1883
1884	mtx_lock(&usb_ref_lock);
1885	udev->fifo[f_tx->fifo_index] = f_tx;
1886	udev->fifo[f_rx->fifo_index] = f_rx;
1887	mtx_unlock(&usb_ref_lock);
1888
1889	for (n = 0; n != 4; n++) {
1890		if (pm->basename[n] == NULL) {
1891			continue;
1892		}
1893		if (subunit < 0) {
1894			if (snprintf(devname, sizeof(devname),
1895			    "%s%u%s", pm->basename[n],
1896			    unit, pm->postfix[n] ?
1897			    pm->postfix[n] : "")) {
1898				/* ignore */
1899			}
1900		} else {
1901			if (snprintf(devname, sizeof(devname),
1902			    "%s%u.%d%s", pm->basename[n],
1903			    unit, subunit, pm->postfix[n] ?
1904			    pm->postfix[n] : "")) {
1905				/* ignore */
1906			}
1907		}
1908
1909		/*
1910		 * Distribute the symbolic links into two FIFO structures:
1911		 */
1912		if (n & 1) {
1913			f_rx->symlink[n / 2] =
1914			    usb_alloc_symlink(devname);
1915		} else {
1916			f_tx->symlink[n / 2] =
1917			    usb_alloc_symlink(devname);
1918		}
1919
1920		/* Create the device */
1921		f_sc->dev = usb_make_dev(udev, devname, -1,
1922		    f_tx->fifo_index & f_rx->fifo_index,
1923		    FREAD|FWRITE, uid, gid, mode);
1924	}
1925
1926	DPRINTFN(2, "attached %p/%p\n", f_tx, f_rx);
1927	return (0);
1928}
1929
1930/*------------------------------------------------------------------------*
1931 *	usb_fifo_alloc_buffer
1932 *
1933 * Return values:
1934 * 0: Success
1935 * Else failure
1936 *------------------------------------------------------------------------*/
1937int
1938usb_fifo_alloc_buffer(struct usb_fifo *f, usb_size_t bufsize,
1939    uint16_t nbuf)
1940{
1941	usb_fifo_free_buffer(f);
1942
1943	/* allocate an endpoint */
1944	f->free_q.ifq_maxlen = nbuf;
1945	f->used_q.ifq_maxlen = nbuf;
1946
1947	f->queue_data = usb_alloc_mbufs(
1948	    M_USBDEV, &f->free_q, bufsize, nbuf);
1949
1950	if ((f->queue_data == NULL) && bufsize && nbuf) {
1951		return (ENOMEM);
1952	}
1953	return (0);			/* success */
1954}
1955
1956/*------------------------------------------------------------------------*
1957 *	usb_fifo_free_buffer
1958 *
1959 * This function will free the buffers associated with a FIFO. This
1960 * function can be called multiple times in a row.
1961 *------------------------------------------------------------------------*/
1962void
1963usb_fifo_free_buffer(struct usb_fifo *f)
1964{
1965	if (f->queue_data) {
1966		/* free old buffer */
1967		free(f->queue_data, M_USBDEV);
1968		f->queue_data = NULL;
1969	}
1970	/* reset queues */
1971
1972	memset(&f->free_q, 0, sizeof(f->free_q));
1973	memset(&f->used_q, 0, sizeof(f->used_q));
1974}
1975
1976void
1977usb_fifo_detach(struct usb_fifo_sc *f_sc)
1978{
1979	if (f_sc == NULL) {
1980		return;
1981	}
1982	usb_fifo_free(f_sc->fp[USB_FIFO_TX]);
1983	usb_fifo_free(f_sc->fp[USB_FIFO_RX]);
1984
1985	f_sc->fp[USB_FIFO_TX] = NULL;
1986	f_sc->fp[USB_FIFO_RX] = NULL;
1987
1988	usb_destroy_dev(f_sc->dev);
1989
1990	f_sc->dev = NULL;
1991
1992	DPRINTFN(2, "detached %p\n", f_sc);
1993}
1994
1995usb_size_t
1996usb_fifo_put_bytes_max(struct usb_fifo *f)
1997{
1998	struct usb_mbuf *m;
1999	usb_size_t len;
2000
2001	USB_IF_POLL(&f->free_q, m);
2002
2003	if (m) {
2004		len = m->max_data_len;
2005	} else {
2006		len = 0;
2007	}
2008	return (len);
2009}
2010
2011/*------------------------------------------------------------------------*
2012 *	usb_fifo_put_data
2013 *
2014 * what:
2015 *  0 - normal operation
2016 *  1 - set last packet flag to enforce framing
2017 *------------------------------------------------------------------------*/
2018void
2019usb_fifo_put_data(struct usb_fifo *f, struct usb_page_cache *pc,
2020    usb_frlength_t offset, usb_frlength_t len, uint8_t what)
2021{
2022	struct usb_mbuf *m;
2023	usb_frlength_t io_len;
2024
2025	while (len || (what == 1)) {
2026		USB_IF_DEQUEUE(&f->free_q, m);
2027
2028		if (m) {
2029			USB_MBUF_RESET(m);
2030
2031			io_len = MIN(len, m->cur_data_len);
2032
2033			usbd_copy_out(pc, offset, m->cur_data_ptr, io_len);
2034
2035			m->cur_data_len = io_len;
2036			offset += io_len;
2037			len -= io_len;
2038
2039			if ((len == 0) && (what == 1)) {
2040				m->last_packet = 1;
2041			}
2042			USB_IF_ENQUEUE(&f->used_q, m);
2043
2044			usb_fifo_wakeup(f);
2045
2046			if ((len == 0) || (what == 1)) {
2047				break;
2048			}
2049		} else {
2050			break;
2051		}
2052	}
2053}
2054
2055void
2056usb_fifo_put_data_linear(struct usb_fifo *f, void *ptr,
2057    usb_size_t len, uint8_t what)
2058{
2059	struct usb_mbuf *m;
2060	usb_size_t io_len;
2061
2062	while (len || (what == 1)) {
2063		USB_IF_DEQUEUE(&f->free_q, m);
2064
2065		if (m) {
2066			USB_MBUF_RESET(m);
2067
2068			io_len = MIN(len, m->cur_data_len);
2069
2070			memcpy(m->cur_data_ptr, ptr, io_len);
2071
2072			m->cur_data_len = io_len;
2073			ptr = USB_ADD_BYTES(ptr, io_len);
2074			len -= io_len;
2075
2076			if ((len == 0) && (what == 1)) {
2077				m->last_packet = 1;
2078			}
2079			USB_IF_ENQUEUE(&f->used_q, m);
2080
2081			usb_fifo_wakeup(f);
2082
2083			if ((len == 0) || (what == 1)) {
2084				break;
2085			}
2086		} else {
2087			break;
2088		}
2089	}
2090}
2091
2092uint8_t
2093usb_fifo_put_data_buffer(struct usb_fifo *f, void *ptr, usb_size_t len)
2094{
2095	struct usb_mbuf *m;
2096
2097	USB_IF_DEQUEUE(&f->free_q, m);
2098
2099	if (m) {
2100		m->cur_data_len = len;
2101		m->cur_data_ptr = ptr;
2102		USB_IF_ENQUEUE(&f->used_q, m);
2103		usb_fifo_wakeup(f);
2104		return (1);
2105	}
2106	return (0);
2107}
2108
2109void
2110usb_fifo_put_data_error(struct usb_fifo *f)
2111{
2112	f->flag_iserror = 1;
2113	usb_fifo_wakeup(f);
2114}
2115
2116/*------------------------------------------------------------------------*
2117 *	usb_fifo_get_data
2118 *
2119 * what:
2120 *  0 - normal operation
2121 *  1 - only get one "usb_mbuf"
2122 *
2123 * returns:
2124 *  0 - no more data
2125 *  1 - data in buffer
2126 *------------------------------------------------------------------------*/
2127uint8_t
2128usb_fifo_get_data(struct usb_fifo *f, struct usb_page_cache *pc,
2129    usb_frlength_t offset, usb_frlength_t len, usb_frlength_t *actlen,
2130    uint8_t what)
2131{
2132	struct usb_mbuf *m;
2133	usb_frlength_t io_len;
2134	uint8_t tr_data = 0;
2135
2136	actlen[0] = 0;
2137
2138	while (1) {
2139		USB_IF_DEQUEUE(&f->used_q, m);
2140
2141		if (m) {
2142			tr_data = 1;
2143
2144			io_len = MIN(len, m->cur_data_len);
2145
2146			usbd_copy_in(pc, offset, m->cur_data_ptr, io_len);
2147
2148			len -= io_len;
2149			offset += io_len;
2150			actlen[0] += io_len;
2151			m->cur_data_ptr += io_len;
2152			m->cur_data_len -= io_len;
2153
2154			if ((m->cur_data_len == 0) || (what == 1)) {
2155				USB_IF_ENQUEUE(&f->free_q, m);
2156
2157				usb_fifo_wakeup(f);
2158
2159				if (what == 1) {
2160					break;
2161				}
2162			} else {
2163				USB_IF_PREPEND(&f->used_q, m);
2164			}
2165		} else {
2166			if (tr_data) {
2167				/* wait for data to be written out */
2168				break;
2169			}
2170			if (f->flag_flushing) {
2171				/* check if we should send a short packet */
2172				if (f->flag_short != 0) {
2173					f->flag_short = 0;
2174					tr_data = 1;
2175					break;
2176				}
2177				/* flushing complete */
2178				f->flag_flushing = 0;
2179				usb_fifo_wakeup(f);
2180			}
2181			break;
2182		}
2183		if (len == 0) {
2184			break;
2185		}
2186	}
2187	return (tr_data);
2188}
2189
2190uint8_t
2191usb_fifo_get_data_linear(struct usb_fifo *f, void *ptr,
2192    usb_size_t len, usb_size_t *actlen, uint8_t what)
2193{
2194	struct usb_mbuf *m;
2195	usb_size_t io_len;
2196	uint8_t tr_data = 0;
2197
2198	actlen[0] = 0;
2199
2200	while (1) {
2201		USB_IF_DEQUEUE(&f->used_q, m);
2202
2203		if (m) {
2204			tr_data = 1;
2205
2206			io_len = MIN(len, m->cur_data_len);
2207
2208			memcpy(ptr, m->cur_data_ptr, io_len);
2209
2210			len -= io_len;
2211			ptr = USB_ADD_BYTES(ptr, io_len);
2212			actlen[0] += io_len;
2213			m->cur_data_ptr += io_len;
2214			m->cur_data_len -= io_len;
2215
2216			if ((m->cur_data_len == 0) || (what == 1)) {
2217				USB_IF_ENQUEUE(&f->free_q, m);
2218
2219				usb_fifo_wakeup(f);
2220
2221				if (what == 1) {
2222					break;
2223				}
2224			} else {
2225				USB_IF_PREPEND(&f->used_q, m);
2226			}
2227		} else {
2228			if (tr_data) {
2229				/* wait for data to be written out */
2230				break;
2231			}
2232			if (f->flag_flushing) {
2233				/* check if we should send a short packet */
2234				if (f->flag_short != 0) {
2235					f->flag_short = 0;
2236					tr_data = 1;
2237					break;
2238				}
2239				/* flushing complete */
2240				f->flag_flushing = 0;
2241				usb_fifo_wakeup(f);
2242			}
2243			break;
2244		}
2245		if (len == 0) {
2246			break;
2247		}
2248	}
2249	return (tr_data);
2250}
2251
2252uint8_t
2253usb_fifo_get_data_buffer(struct usb_fifo *f, void **pptr, usb_size_t *plen)
2254{
2255	struct usb_mbuf *m;
2256
2257	USB_IF_POLL(&f->used_q, m);
2258
2259	if (m) {
2260		*plen = m->cur_data_len;
2261		*pptr = m->cur_data_ptr;
2262
2263		return (1);
2264	}
2265	return (0);
2266}
2267
2268void
2269usb_fifo_get_data_error(struct usb_fifo *f)
2270{
2271	f->flag_iserror = 1;
2272	usb_fifo_wakeup(f);
2273}
2274
2275/*------------------------------------------------------------------------*
2276 *	usb_alloc_symlink
2277 *
2278 * Return values:
2279 * NULL: Failure
2280 * Else: Pointer to symlink entry
2281 *------------------------------------------------------------------------*/
2282struct usb_symlink *
2283usb_alloc_symlink(const char *target)
2284{
2285	struct usb_symlink *ps;
2286
2287	ps = malloc(sizeof(*ps), M_USBDEV, M_WAITOK);
2288	/* XXX no longer needed */
2289	strlcpy(ps->src_path, target, sizeof(ps->src_path));
2290	ps->src_len = strlen(ps->src_path);
2291	strlcpy(ps->dst_path, target, sizeof(ps->dst_path));
2292	ps->dst_len = strlen(ps->dst_path);
2293
2294	sx_xlock(&usb_sym_lock);
2295	TAILQ_INSERT_TAIL(&usb_sym_head, ps, sym_entry);
2296	sx_unlock(&usb_sym_lock);
2297	return (ps);
2298}
2299
2300/*------------------------------------------------------------------------*
2301 *	usb_free_symlink
2302 *------------------------------------------------------------------------*/
2303void
2304usb_free_symlink(struct usb_symlink *ps)
2305{
2306	if (ps == NULL) {
2307		return;
2308	}
2309	sx_xlock(&usb_sym_lock);
2310	TAILQ_REMOVE(&usb_sym_head, ps, sym_entry);
2311	sx_unlock(&usb_sym_lock);
2312
2313	free(ps, M_USBDEV);
2314}
2315
2316/*------------------------------------------------------------------------*
2317 *	usb_read_symlink
2318 *
2319 * Return value:
2320 * 0: Success
2321 * Else: Failure
2322 *------------------------------------------------------------------------*/
2323int
2324usb_read_symlink(uint8_t *user_ptr, uint32_t startentry, uint32_t user_len)
2325{
2326	struct usb_symlink *ps;
2327	uint32_t temp;
2328	uint32_t delta = 0;
2329	uint8_t len;
2330	int error = 0;
2331
2332	sx_xlock(&usb_sym_lock);
2333
2334	TAILQ_FOREACH(ps, &usb_sym_head, sym_entry) {
2335		/*
2336		 * Compute total length of source and destination symlink
2337		 * strings pluss one length byte and two NUL bytes:
2338		 */
2339		temp = ps->src_len + ps->dst_len + 3;
2340
2341		if (temp > 255) {
2342			/*
2343			 * Skip entry because this length cannot fit
2344			 * into one byte:
2345			 */
2346			continue;
2347		}
2348		if (startentry != 0) {
2349			/* decrement read offset */
2350			startentry--;
2351			continue;
2352		}
2353		if (temp > user_len) {
2354			/* out of buffer space */
2355			break;
2356		}
2357		len = temp;
2358
2359		/* copy out total length */
2360
2361		error = copyout(&len,
2362		    USB_ADD_BYTES(user_ptr, delta), 1);
2363		if (error) {
2364			break;
2365		}
2366		delta += 1;
2367
2368		/* copy out source string */
2369
2370		error = copyout(ps->src_path,
2371		    USB_ADD_BYTES(user_ptr, delta), ps->src_len);
2372		if (error) {
2373			break;
2374		}
2375		len = 0;
2376		delta += ps->src_len;
2377		error = copyout(&len,
2378		    USB_ADD_BYTES(user_ptr, delta), 1);
2379		if (error) {
2380			break;
2381		}
2382		delta += 1;
2383
2384		/* copy out destination string */
2385
2386		error = copyout(ps->dst_path,
2387		    USB_ADD_BYTES(user_ptr, delta), ps->dst_len);
2388		if (error) {
2389			break;
2390		}
2391		len = 0;
2392		delta += ps->dst_len;
2393		error = copyout(&len,
2394		    USB_ADD_BYTES(user_ptr, delta), 1);
2395		if (error) {
2396			break;
2397		}
2398		delta += 1;
2399
2400		user_len -= temp;
2401	}
2402
2403	/* a zero length entry indicates the end */
2404
2405	if ((user_len != 0) && (error == 0)) {
2406		len = 0;
2407
2408		error = copyout(&len,
2409		    USB_ADD_BYTES(user_ptr, delta), 1);
2410	}
2411	sx_unlock(&usb_sym_lock);
2412	return (error);
2413}
2414
2415void
2416usb_fifo_set_close_zlp(struct usb_fifo *f, uint8_t onoff)
2417{
2418	if (f == NULL)
2419		return;
2420
2421	/* send a Zero Length Packet, ZLP, before close */
2422	f->flag_short = onoff;
2423}
2424
2425void
2426usb_fifo_set_write_defrag(struct usb_fifo *f, uint8_t onoff)
2427{
2428	if (f == NULL)
2429		return;
2430
2431	/* defrag written data */
2432	f->flag_write_defrag = onoff;
2433	/* reset defrag state */
2434	f->flag_have_fragment = 0;
2435}
2436
2437void *
2438usb_fifo_softc(struct usb_fifo *f)
2439{
2440	return (f->priv_sc0);
2441}
2442#endif	/* USB_HAVE_UGEN */
2443