xref: /netbsd-src/sys/dev/usb/ugen.c (revision 7fa608457b817eca6e0977b37f758ae064f3c99c)
1 /*	$NetBSD: ugen.c,v 1.92 2007/03/04 06:02:49 christos Exp $	*/
2 
3 /*
4  * Copyright (c) 1998, 2004 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Lennart Augustsson (lennart@augustsson.net) at
9  * Carlstedt Research & Technology.
10  *
11  * Copyright (c) 2006 BBN Technologies Corp.  All rights reserved.
12  * Effort sponsored in part by the Defense Advanced Research Projects
13  * Agency (DARPA) and the Department of the Interior National Business
14  * Center under agreement number NBCHC050166.
15  *
16  * Redistribution and use in source and binary forms, with or without
17  * modification, are permitted provided that the following conditions
18  * are met:
19  * 1. Redistributions of source code must retain the above copyright
20  *    notice, this list of conditions and the following disclaimer.
21  * 2. Redistributions in binary form must reproduce the above copyright
22  *    notice, this list of conditions and the following disclaimer in the
23  *    documentation and/or other materials provided with the distribution.
24  * 3. All advertising materials mentioning features or use of this software
25  *    must display the following acknowledgement:
26  *	This product includes software developed by the NetBSD
27  *	Foundation, Inc. and its contributors.
28  * 4. Neither the name of The NetBSD Foundation nor the names of its
29  *    contributors may be used to endorse or promote products derived
30  *    from this software without specific prior written permission.
31  *
32  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
33  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
34  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
35  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
36  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
37  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
38  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
40  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42  * POSSIBILITY OF SUCH DAMAGE.
43  */
44 
45 
46 #include <sys/cdefs.h>
47 __KERNEL_RCSID(0, "$NetBSD: ugen.c,v 1.92 2007/03/04 06:02:49 christos Exp $");
48 
49 #include "opt_ugen_bulk_ra_wb.h"
50 #include "opt_compat_netbsd.h"
51 
52 #include <sys/param.h>
53 #include <sys/systm.h>
54 #include <sys/kernel.h>
55 #include <sys/malloc.h>
56 #if defined(__NetBSD__) || defined(__OpenBSD__)
57 #include <sys/device.h>
58 #include <sys/ioctl.h>
59 #elif defined(__FreeBSD__)
60 #include <sys/module.h>
61 #include <sys/bus.h>
62 #include <sys/ioccom.h>
63 #include <sys/conf.h>
64 #include <sys/fcntl.h>
65 #include <sys/filio.h>
66 #endif
67 #include <sys/conf.h>
68 #include <sys/tty.h>
69 #include <sys/file.h>
70 #include <sys/select.h>
71 #include <sys/proc.h>
72 #include <sys/vnode.h>
73 #include <sys/poll.h>
74 
75 #include <dev/usb/usb.h>
76 #include <dev/usb/usbdi.h>
77 #include <dev/usb/usbdi_util.h>
78 
79 #ifdef UGEN_DEBUG
80 #define DPRINTF(x)	if (ugendebug) logprintf x
81 #define DPRINTFN(n,x)	if (ugendebug>(n)) logprintf x
82 int	ugendebug = 0;
83 #else
84 #define DPRINTF(x)
85 #define DPRINTFN(n,x)
86 #endif
87 
88 #define	UGEN_CHUNK	128	/* chunk size for read */
89 #define	UGEN_IBSIZE	1020	/* buffer size */
90 #define	UGEN_BBSIZE	1024
91 
92 #define	UGEN_NISOFRAMES	500	/* 0.5 seconds worth */
93 #define UGEN_NISOREQS	6	/* number of outstanding xfer requests */
94 #define UGEN_NISORFRMS	4	/* number of frames (miliseconds) per req */
95 
96 #define UGEN_BULK_RA_WB_BUFSIZE	16384		/* default buffer size */
97 #define UGEN_BULK_RA_WB_BUFMAX	(1 << 20)	/* maximum allowed buffer */
98 
99 struct ugen_endpoint {
100 	struct ugen_softc *sc;
101 	usb_endpoint_descriptor_t *edesc;
102 	usbd_interface_handle iface;
103 	int state;
104 #define	UGEN_ASLP	0x02	/* waiting for data */
105 #define UGEN_SHORT_OK	0x04	/* short xfers are OK */
106 #define UGEN_BULK_RA	0x08	/* in bulk read-ahead mode */
107 #define UGEN_BULK_WB	0x10	/* in bulk write-behind mode */
108 #define UGEN_RA_WB_STOP	0x20	/* RA/WB xfer is stopped (buffer full/empty) */
109 	usbd_pipe_handle pipeh;
110 	struct clist q;
111 	struct selinfo rsel;
112 	u_char *ibuf;		/* start of buffer (circular for isoc) */
113 	u_char *fill;		/* location for input (isoc) */
114 	u_char *limit;		/* end of circular buffer (isoc) */
115 	u_char *cur;		/* current read location (isoc) */
116 	u_int32_t timeout;
117 #ifdef UGEN_BULK_RA_WB
118 	u_int32_t ra_wb_bufsize; /* requested size for RA/WB buffer */
119 	u_int32_t ra_wb_reqsize; /* requested xfer length for RA/WB */
120 	u_int32_t ra_wb_used;	 /* how much is in buffer */
121 	u_int32_t ra_wb_xferlen; /* current xfer length for RA/WB */
122 	usbd_xfer_handle ra_wb_xfer;
123 #endif
124 	struct isoreq {
125 		struct ugen_endpoint *sce;
126 		usbd_xfer_handle xfer;
127 		void *dmabuf;
128 		u_int16_t sizes[UGEN_NISORFRMS];
129 	} isoreqs[UGEN_NISOREQS];
130 };
131 
132 struct ugen_softc {
133 	USBBASEDEVICE sc_dev;		/* base device */
134 	usbd_device_handle sc_udev;
135 
136 	char sc_is_open[USB_MAX_ENDPOINTS];
137 	struct ugen_endpoint sc_endpoints[USB_MAX_ENDPOINTS][2];
138 #define OUT 0
139 #define IN  1
140 
141 	int sc_refcnt;
142 	char sc_buffer[UGEN_BBSIZE];
143 	u_char sc_dying;
144 };
145 
146 #if defined(__NetBSD__)
147 dev_type_open(ugenopen);
148 dev_type_close(ugenclose);
149 dev_type_read(ugenread);
150 dev_type_write(ugenwrite);
151 dev_type_ioctl(ugenioctl);
152 dev_type_poll(ugenpoll);
153 dev_type_kqfilter(ugenkqfilter);
154 
155 const struct cdevsw ugen_cdevsw = {
156 	ugenopen, ugenclose, ugenread, ugenwrite, ugenioctl,
157 	nostop, notty, ugenpoll, nommap, ugenkqfilter, D_OTHER,
158 };
159 #elif defined(__OpenBSD__)
160 cdev_decl(ugen);
161 #elif defined(__FreeBSD__)
162 d_open_t  ugenopen;
163 d_close_t ugenclose;
164 d_read_t  ugenread;
165 d_write_t ugenwrite;
166 d_ioctl_t ugenioctl;
167 d_poll_t  ugenpoll;
168 
169 #define UGEN_CDEV_MAJOR	114
170 
171 Static struct cdevsw ugen_cdevsw = {
172 	/* open */	ugenopen,
173 	/* close */	ugenclose,
174 	/* read */	ugenread,
175 	/* write */	ugenwrite,
176 	/* ioctl */	ugenioctl,
177 	/* poll */	ugenpoll,
178 	/* mmap */	nommap,
179 	/* strategy */	nostrategy,
180 	/* name */	"ugen",
181 	/* maj */	UGEN_CDEV_MAJOR,
182 	/* dump */	nodump,
183 	/* psize */	nopsize,
184 	/* flags */	0,
185 	/* bmaj */	-1
186 };
187 #endif
188 
189 Static void ugenintr(usbd_xfer_handle xfer, usbd_private_handle addr,
190 		     usbd_status status);
191 Static void ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr,
192 			    usbd_status status);
193 #ifdef UGEN_BULK_RA_WB
194 Static void ugen_bulkra_intr(usbd_xfer_handle xfer, usbd_private_handle addr,
195 			     usbd_status status);
196 Static void ugen_bulkwb_intr(usbd_xfer_handle xfer, usbd_private_handle addr,
197 			     usbd_status status);
198 #endif
199 Static int ugen_do_read(struct ugen_softc *, int, struct uio *, int);
200 Static int ugen_do_write(struct ugen_softc *, int, struct uio *, int);
201 Static int ugen_do_ioctl(struct ugen_softc *, int, u_long,
202 			 void *, int, struct lwp *);
203 Static int ugen_set_config(struct ugen_softc *sc, int configno);
204 Static usb_config_descriptor_t *ugen_get_cdesc(struct ugen_softc *sc,
205 					       int index, int *lenp);
206 Static usbd_status ugen_set_interface(struct ugen_softc *, int, int);
207 Static int ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx);
208 
209 #define UGENUNIT(n) ((minor(n) >> 4) & 0xf)
210 #define UGENENDPOINT(n) (minor(n) & 0xf)
211 #define UGENDEV(u, e) (makedev(0, ((u) << 4) | (e)))
212 
213 USB_DECLARE_DRIVER(ugen);
214 
215 USB_MATCH(ugen)
216 {
217 	USB_MATCH_START(ugen, uaa);
218 
219 	if (match->cf_flags & 1)
220 		return (UMATCH_HIGHEST);
221 	else if (uaa->usegeneric)
222 		return (UMATCH_GENERIC);
223 	else
224 		return (UMATCH_NONE);
225 }
226 
227 USB_ATTACH(ugen)
228 {
229 	USB_ATTACH_START(ugen, sc, uaa);
230 	usbd_device_handle udev;
231 	char *devinfop;
232 	usbd_status err;
233 	int conf;
234 
235 	devinfop = usbd_devinfo_alloc(uaa->device, 0);
236 	USB_ATTACH_SETUP;
237 	printf("%s: %s\n", USBDEVNAME(sc->sc_dev), devinfop);
238 	usbd_devinfo_free(devinfop);
239 
240 	sc->sc_udev = udev = uaa->device;
241 
242 	/* First set configuration index 0, the default one for ugen. */
243 	err = usbd_set_config_index(udev, 0, 0);
244 	if (err) {
245 		printf("%s: setting configuration index 0 failed\n",
246 		       USBDEVNAME(sc->sc_dev));
247 		sc->sc_dying = 1;
248 		USB_ATTACH_ERROR_RETURN;
249 	}
250 	conf = usbd_get_config_descriptor(udev)->bConfigurationValue;
251 
252 	/* Set up all the local state for this configuration. */
253 	err = ugen_set_config(sc, conf);
254 	if (err) {
255 		printf("%s: setting configuration %d failed\n",
256 		       USBDEVNAME(sc->sc_dev), conf);
257 		sc->sc_dying = 1;
258 		USB_ATTACH_ERROR_RETURN;
259 	}
260 
261 #ifdef __FreeBSD__
262 	{
263 		static int global_init_done = 0;
264 		if (!global_init_done) {
265 			cdevsw_add(&ugen_cdevsw);
266 			global_init_done = 1;
267 		}
268 	}
269 #endif
270 
271 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev,
272 			   USBDEV(sc->sc_dev));
273 
274 	USB_ATTACH_SUCCESS_RETURN;
275 }
276 
277 Static int
278 ugen_set_config(struct ugen_softc *sc, int configno)
279 {
280 	usbd_device_handle dev = sc->sc_udev;
281 	usbd_interface_handle iface;
282 	usb_endpoint_descriptor_t *ed;
283 	struct ugen_endpoint *sce;
284 	u_int8_t niface, nendpt;
285 	int ifaceno, endptno, endpt;
286 	usbd_status err;
287 	int dir;
288 
289 	DPRINTFN(1,("ugen_set_config: %s to configno %d, sc=%p\n",
290 		    USBDEVNAME(sc->sc_dev), configno, sc));
291 
292 	/*
293 	 * We start at 1, not 0, because we don't care whether the
294 	 * control endpoint is open or not. It is always present.
295 	 */
296 	for (endptno = 1; endptno < USB_MAX_ENDPOINTS; endptno++)
297 		if (sc->sc_is_open[endptno]) {
298 			DPRINTFN(1,
299 			     ("ugen_set_config: %s - endpoint %d is open\n",
300 			      USBDEVNAME(sc->sc_dev), endptno));
301 			return (USBD_IN_USE);
302 		}
303 
304 	/* Avoid setting the current value. */
305 	if (usbd_get_config_descriptor(dev)->bConfigurationValue != configno) {
306 		err = usbd_set_config_no(dev, configno, 1);
307 		if (err)
308 			return (err);
309 	}
310 
311 	err = usbd_interface_count(dev, &niface);
312 	if (err)
313 		return (err);
314 	memset(sc->sc_endpoints, 0, sizeof sc->sc_endpoints);
315 	for (ifaceno = 0; ifaceno < niface; ifaceno++) {
316 		DPRINTFN(1,("ugen_set_config: ifaceno %d\n", ifaceno));
317 		err = usbd_device2interface_handle(dev, ifaceno, &iface);
318 		if (err)
319 			return (err);
320 		err = usbd_endpoint_count(iface, &nendpt);
321 		if (err)
322 			return (err);
323 		for (endptno = 0; endptno < nendpt; endptno++) {
324 			ed = usbd_interface2endpoint_descriptor(iface,endptno);
325 			KASSERT(ed != NULL);
326 			endpt = ed->bEndpointAddress;
327 			dir = UE_GET_DIR(endpt) == UE_DIR_IN ? IN : OUT;
328 			sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir];
329 			DPRINTFN(1,("ugen_set_config: endptno %d, endpt=0x%02x"
330 				    "(%d,%d), sce=%p\n",
331 				    endptno, endpt, UE_GET_ADDR(endpt),
332 				    UE_GET_DIR(endpt), sce));
333 			sce->sc = sc;
334 			sce->edesc = ed;
335 			sce->iface = iface;
336 		}
337 	}
338 	return (USBD_NORMAL_COMPLETION);
339 }
340 
341 int
342 ugenopen(dev_t dev, int flag, int mode, struct lwp *l)
343 {
344 	struct ugen_softc *sc;
345 	int unit = UGENUNIT(dev);
346 	int endpt = UGENENDPOINT(dev);
347 	usb_endpoint_descriptor_t *edesc;
348 	struct ugen_endpoint *sce;
349 	int dir, isize;
350 	usbd_status err;
351 	usbd_xfer_handle xfer;
352 	void *tbuf;
353 	int i, j;
354 
355 	USB_GET_SC_OPEN(ugen, unit, sc);
356 
357 	DPRINTFN(5, ("ugenopen: flag=%d, mode=%d, unit=%d endpt=%d\n",
358 		     flag, mode, unit, endpt));
359 
360 	if (sc == NULL || sc->sc_dying)
361 		return (ENXIO);
362 
363 	/* The control endpoint allows multiple opens. */
364 	if (endpt == USB_CONTROL_ENDPOINT) {
365 		sc->sc_is_open[USB_CONTROL_ENDPOINT] = 1;
366 		return (0);
367 	}
368 
369 	if (sc->sc_is_open[endpt])
370 		return (EBUSY);
371 
372 	/* Make sure there are pipes for all directions. */
373 	for (dir = OUT; dir <= IN; dir++) {
374 		if (flag & (dir == OUT ? FWRITE : FREAD)) {
375 			sce = &sc->sc_endpoints[endpt][dir];
376 			if (sce == 0 || sce->edesc == 0)
377 				return (ENXIO);
378 		}
379 	}
380 
381 	/* Actually open the pipes. */
382 	/* XXX Should back out properly if it fails. */
383 	for (dir = OUT; dir <= IN; dir++) {
384 		if (!(flag & (dir == OUT ? FWRITE : FREAD)))
385 			continue;
386 		sce = &sc->sc_endpoints[endpt][dir];
387 		sce->state = 0;
388 		sce->timeout = USBD_NO_TIMEOUT;
389 		DPRINTFN(5, ("ugenopen: sc=%p, endpt=%d, dir=%d, sce=%p\n",
390 			     sc, endpt, dir, sce));
391 		edesc = sce->edesc;
392 		switch (edesc->bmAttributes & UE_XFERTYPE) {
393 		case UE_INTERRUPT:
394 			if (dir == OUT) {
395 				err = usbd_open_pipe(sce->iface,
396 				    edesc->bEndpointAddress, 0, &sce->pipeh);
397 				if (err)
398 					return (EIO);
399 				break;
400 			}
401 			isize = UGETW(edesc->wMaxPacketSize);
402 			if (isize == 0)	/* shouldn't happen */
403 				return (EINVAL);
404 			sce->ibuf = malloc(isize, M_USBDEV, M_WAITOK);
405 			DPRINTFN(5, ("ugenopen: intr endpt=%d,isize=%d\n",
406 				     endpt, isize));
407 			if (clalloc(&sce->q, UGEN_IBSIZE, 0) == -1)
408 				return (ENOMEM);
409 			err = usbd_open_pipe_intr(sce->iface,
410 				  edesc->bEndpointAddress,
411 				  USBD_SHORT_XFER_OK, &sce->pipeh, sce,
412 				  sce->ibuf, isize, ugenintr,
413 				  USBD_DEFAULT_INTERVAL);
414 			if (err) {
415 				free(sce->ibuf, M_USBDEV);
416 				clfree(&sce->q);
417 				return (EIO);
418 			}
419 			DPRINTFN(5, ("ugenopen: interrupt open done\n"));
420 			break;
421 		case UE_BULK:
422 			err = usbd_open_pipe(sce->iface,
423 				  edesc->bEndpointAddress, 0, &sce->pipeh);
424 			if (err)
425 				return (EIO);
426 #ifdef UGEN_BULK_RA_WB
427 			sce->ra_wb_bufsize = UGEN_BULK_RA_WB_BUFSIZE;
428 			/*
429 			 * Use request size for non-RA/WB transfers
430 			 * as the default.
431 			 */
432 			sce->ra_wb_reqsize = UGEN_BBSIZE;
433 #endif
434 			break;
435 		case UE_ISOCHRONOUS:
436 			if (dir == OUT)
437 				return (EINVAL);
438 			isize = UGETW(edesc->wMaxPacketSize);
439 			if (isize == 0)	/* shouldn't happen */
440 				return (EINVAL);
441 			sce->ibuf = malloc(isize * UGEN_NISOFRAMES,
442 				M_USBDEV, M_WAITOK);
443 			sce->cur = sce->fill = sce->ibuf;
444 			sce->limit = sce->ibuf + isize * UGEN_NISOFRAMES;
445 			DPRINTFN(5, ("ugenopen: isoc endpt=%d, isize=%d\n",
446 				     endpt, isize));
447 			err = usbd_open_pipe(sce->iface,
448 				  edesc->bEndpointAddress, 0, &sce->pipeh);
449 			if (err) {
450 				free(sce->ibuf, M_USBDEV);
451 				return (EIO);
452 			}
453 			for(i = 0; i < UGEN_NISOREQS; ++i) {
454 				sce->isoreqs[i].sce = sce;
455 				xfer = usbd_alloc_xfer(sc->sc_udev);
456 				if (xfer == 0)
457 					goto bad;
458 				sce->isoreqs[i].xfer = xfer;
459 				tbuf = usbd_alloc_buffer
460 					(xfer, isize * UGEN_NISORFRMS);
461 				if (tbuf == 0) {
462 					i++;
463 					goto bad;
464 				}
465 				sce->isoreqs[i].dmabuf = tbuf;
466 				for(j = 0; j < UGEN_NISORFRMS; ++j)
467 					sce->isoreqs[i].sizes[j] = isize;
468 				usbd_setup_isoc_xfer
469 					(xfer, sce->pipeh, &sce->isoreqs[i],
470 					 sce->isoreqs[i].sizes,
471 					 UGEN_NISORFRMS, USBD_NO_COPY,
472 					 ugen_isoc_rintr);
473 				(void)usbd_transfer(xfer);
474 			}
475 			DPRINTFN(5, ("ugenopen: isoc open done\n"));
476 			break;
477 		bad:
478 			while (--i >= 0) /* implicit buffer free */
479 				usbd_free_xfer(sce->isoreqs[i].xfer);
480 			return (ENOMEM);
481 		case UE_CONTROL:
482 			sce->timeout = USBD_DEFAULT_TIMEOUT;
483 			return (EINVAL);
484 		}
485 	}
486 	sc->sc_is_open[endpt] = 1;
487 	return (0);
488 }
489 
490 int
491 ugenclose(dev_t dev, int flag, int mode, struct lwp *l)
492 {
493 	int endpt = UGENENDPOINT(dev);
494 	struct ugen_softc *sc;
495 	struct ugen_endpoint *sce;
496 	int dir;
497 	int i;
498 
499 	USB_GET_SC(ugen, UGENUNIT(dev), sc);
500 
501 	DPRINTFN(5, ("ugenclose: flag=%d, mode=%d, unit=%d, endpt=%d\n",
502 		     flag, mode, UGENUNIT(dev), endpt));
503 
504 #ifdef DIAGNOSTIC
505 	if (!sc->sc_is_open[endpt]) {
506 		printf("ugenclose: not open\n");
507 		return (EINVAL);
508 	}
509 #endif
510 
511 	if (endpt == USB_CONTROL_ENDPOINT) {
512 		DPRINTFN(5, ("ugenclose: close control\n"));
513 		sc->sc_is_open[endpt] = 0;
514 		return (0);
515 	}
516 
517 	for (dir = OUT; dir <= IN; dir++) {
518 		if (!(flag & (dir == OUT ? FWRITE : FREAD)))
519 			continue;
520 		sce = &sc->sc_endpoints[endpt][dir];
521 		if (sce == NULL || sce->pipeh == NULL)
522 			continue;
523 		DPRINTFN(5, ("ugenclose: endpt=%d dir=%d sce=%p\n",
524 			     endpt, dir, sce));
525 
526 		usbd_abort_pipe(sce->pipeh);
527 		usbd_close_pipe(sce->pipeh);
528 		sce->pipeh = NULL;
529 
530 		switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
531 		case UE_INTERRUPT:
532 			ndflush(&sce->q, sce->q.c_cc);
533 			clfree(&sce->q);
534 			break;
535 		case UE_ISOCHRONOUS:
536 			for (i = 0; i < UGEN_NISOREQS; ++i)
537 				usbd_free_xfer(sce->isoreqs[i].xfer);
538 			break;
539 #ifdef UGEN_BULK_RA_WB
540 		case UE_BULK:
541 			if (sce->state & (UGEN_BULK_RA | UGEN_BULK_WB))
542 				/* ibuf freed below */
543 				usbd_free_xfer(sce->ra_wb_xfer);
544 			break;
545 #endif
546 		default:
547 			break;
548 		}
549 
550 		if (sce->ibuf != NULL) {
551 			free(sce->ibuf, M_USBDEV);
552 			sce->ibuf = NULL;
553 			clfree(&sce->q);
554 		}
555 	}
556 	sc->sc_is_open[endpt] = 0;
557 
558 	return (0);
559 }
560 
561 Static int
562 ugen_do_read(struct ugen_softc *sc, int endpt, struct uio *uio, int flag)
563 {
564 	struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][IN];
565 	u_int32_t n, tn;
566 	usbd_xfer_handle xfer;
567 	usbd_status err;
568 	int s;
569 	int error = 0;
570 
571 	DPRINTFN(5, ("%s: ugenread: %d\n", USBDEVNAME(sc->sc_dev), endpt));
572 
573 	if (sc->sc_dying)
574 		return (EIO);
575 
576 	if (endpt == USB_CONTROL_ENDPOINT)
577 		return (ENODEV);
578 
579 #ifdef DIAGNOSTIC
580 	if (sce->edesc == NULL) {
581 		printf("ugenread: no edesc\n");
582 		return (EIO);
583 	}
584 	if (sce->pipeh == NULL) {
585 		printf("ugenread: no pipe\n");
586 		return (EIO);
587 	}
588 #endif
589 
590 	switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
591 	case UE_INTERRUPT:
592 		/* Block until activity occurred. */
593 		s = splusb();
594 		while (sce->q.c_cc == 0) {
595 			if (flag & IO_NDELAY) {
596 				splx(s);
597 				return (EWOULDBLOCK);
598 			}
599 			sce->state |= UGEN_ASLP;
600 			DPRINTFN(5, ("ugenread: sleep on %p\n", sce));
601 			error = tsleep(sce, PZERO | PCATCH, "ugenri", 0);
602 			DPRINTFN(5, ("ugenread: woke, error=%d\n", error));
603 			if (sc->sc_dying)
604 				error = EIO;
605 			if (error) {
606 				sce->state &= ~UGEN_ASLP;
607 				break;
608 			}
609 		}
610 		splx(s);
611 
612 		/* Transfer as many chunks as possible. */
613 		while (sce->q.c_cc > 0 && uio->uio_resid > 0 && !error) {
614 			n = min(sce->q.c_cc, uio->uio_resid);
615 			if (n > sizeof(sc->sc_buffer))
616 				n = sizeof(sc->sc_buffer);
617 
618 			/* Remove a small chunk from the input queue. */
619 			q_to_b(&sce->q, sc->sc_buffer, n);
620 			DPRINTFN(5, ("ugenread: got %d chars\n", n));
621 
622 			/* Copy the data to the user process. */
623 			error = uiomove(sc->sc_buffer, n, uio);
624 			if (error)
625 				break;
626 		}
627 		break;
628 	case UE_BULK:
629 #ifdef UGEN_BULK_RA_WB
630 		if (sce->state & UGEN_BULK_RA) {
631 			DPRINTFN(5, ("ugenread: BULK_RA req: %zd used: %d\n",
632 				     uio->uio_resid, sce->ra_wb_used));
633 			xfer = sce->ra_wb_xfer;
634 
635 			s = splusb();
636 			if (sce->ra_wb_used == 0 && flag & IO_NDELAY) {
637 				splx(s);
638 				return (EWOULDBLOCK);
639 			}
640 			while (uio->uio_resid > 0 && !error) {
641 				while (sce->ra_wb_used == 0) {
642 					sce->state |= UGEN_ASLP;
643 					DPRINTFN(5,
644 						 ("ugenread: sleep on %p\n",
645 						  sce));
646 					error = tsleep(sce, PZERO | PCATCH,
647 						       "ugenrb", 0);
648 					DPRINTFN(5,
649 						 ("ugenread: woke, error=%d\n",
650 						  error));
651 					if (sc->sc_dying)
652 						error = EIO;
653 					if (error) {
654 						sce->state &= ~UGEN_ASLP;
655 						break;
656 					}
657 				}
658 
659 				/* Copy data to the process. */
660 				while (uio->uio_resid > 0
661 				       && sce->ra_wb_used > 0) {
662 					n = min(uio->uio_resid,
663 						sce->ra_wb_used);
664 					n = min(n, sce->limit - sce->cur);
665 					error = uiomove(sce->cur, n, uio);
666 					if (error)
667 						break;
668 					sce->cur += n;
669 					sce->ra_wb_used -= n;
670 					if (sce->cur == sce->limit)
671 						sce->cur = sce->ibuf;
672 				}
673 
674 				/*
675 				 * If the transfers stopped because the
676 				 * buffer was full, restart them.
677 				 */
678 				if (sce->state & UGEN_RA_WB_STOP &&
679 				    sce->ra_wb_used < sce->limit - sce->ibuf) {
680 					n = (sce->limit - sce->ibuf)
681 					    - sce->ra_wb_used;
682 					usbd_setup_xfer(xfer,
683 					    sce->pipeh, sce, NULL,
684 					    min(n, sce->ra_wb_xferlen),
685 					    USBD_NO_COPY, USBD_NO_TIMEOUT,
686 					    ugen_bulkra_intr);
687 					sce->state &= ~UGEN_RA_WB_STOP;
688 					err = usbd_transfer(xfer);
689 					if (err != USBD_IN_PROGRESS)
690 						/*
691 						 * The transfer has not been
692 						 * queued.  Setting STOP
693 						 * will make us try
694 						 * again at the next read.
695 						 */
696 						sce->state |= UGEN_RA_WB_STOP;
697 				}
698 			}
699 			splx(s);
700 			break;
701 		}
702 #endif
703 		xfer = usbd_alloc_xfer(sc->sc_udev);
704 		if (xfer == 0)
705 			return (ENOMEM);
706 		while ((n = min(UGEN_BBSIZE, uio->uio_resid)) != 0) {
707 			DPRINTFN(1, ("ugenread: start transfer %d bytes\n",n));
708 			tn = n;
709 			err = usbd_bulk_transfer(
710 				  xfer, sce->pipeh,
711 				  sce->state & UGEN_SHORT_OK ?
712 				      USBD_SHORT_XFER_OK : 0,
713 				  sce->timeout, sc->sc_buffer, &tn, "ugenrb");
714 			if (err) {
715 				if (err == USBD_INTERRUPTED)
716 					error = EINTR;
717 				else if (err == USBD_TIMEOUT)
718 					error = ETIMEDOUT;
719 				else
720 					error = EIO;
721 				break;
722 			}
723 			DPRINTFN(1, ("ugenread: got %d bytes\n", tn));
724 			error = uiomove(sc->sc_buffer, tn, uio);
725 			if (error || tn < n)
726 				break;
727 		}
728 		usbd_free_xfer(xfer);
729 		break;
730 	case UE_ISOCHRONOUS:
731 		s = splusb();
732 		while (sce->cur == sce->fill) {
733 			if (flag & IO_NDELAY) {
734 				splx(s);
735 				return (EWOULDBLOCK);
736 			}
737 			sce->state |= UGEN_ASLP;
738 			DPRINTFN(5, ("ugenread: sleep on %p\n", sce));
739 			error = tsleep(sce, PZERO | PCATCH, "ugenri", 0);
740 			DPRINTFN(5, ("ugenread: woke, error=%d\n", error));
741 			if (sc->sc_dying)
742 				error = EIO;
743 			if (error) {
744 				sce->state &= ~UGEN_ASLP;
745 				break;
746 			}
747 		}
748 
749 		while (sce->cur != sce->fill && uio->uio_resid > 0 && !error) {
750 			if(sce->fill > sce->cur)
751 				n = min(sce->fill - sce->cur, uio->uio_resid);
752 			else
753 				n = min(sce->limit - sce->cur, uio->uio_resid);
754 
755 			DPRINTFN(5, ("ugenread: isoc got %d chars\n", n));
756 
757 			/* Copy the data to the user process. */
758 			error = uiomove(sce->cur, n, uio);
759 			if (error)
760 				break;
761 			sce->cur += n;
762 			if(sce->cur >= sce->limit)
763 				sce->cur = sce->ibuf;
764 		}
765 		splx(s);
766 		break;
767 
768 
769 	default:
770 		return (ENXIO);
771 	}
772 	return (error);
773 }
774 
775 int
776 ugenread(dev_t dev, struct uio *uio, int flag)
777 {
778 	int endpt = UGENENDPOINT(dev);
779 	struct ugen_softc *sc;
780 	int error;
781 
782 	USB_GET_SC(ugen, UGENUNIT(dev), sc);
783 
784 	sc->sc_refcnt++;
785 	error = ugen_do_read(sc, endpt, uio, flag);
786 	if (--sc->sc_refcnt < 0)
787 		usb_detach_wakeup(USBDEV(sc->sc_dev));
788 	return (error);
789 }
790 
791 Static int
792 ugen_do_write(struct ugen_softc *sc, int endpt, struct uio *uio,
793 	int flag)
794 {
795 	struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][OUT];
796 	u_int32_t n;
797 	int error = 0;
798 #ifdef UGEN_BULK_RA_WB
799 	int s;
800 	u_int32_t tn;
801 	char *dbuf;
802 #endif
803 	usbd_xfer_handle xfer;
804 	usbd_status err;
805 
806 	DPRINTFN(5, ("%s: ugenwrite: %d\n", USBDEVNAME(sc->sc_dev), endpt));
807 
808 	if (sc->sc_dying)
809 		return (EIO);
810 
811 	if (endpt == USB_CONTROL_ENDPOINT)
812 		return (ENODEV);
813 
814 #ifdef DIAGNOSTIC
815 	if (sce->edesc == NULL) {
816 		printf("ugenwrite: no edesc\n");
817 		return (EIO);
818 	}
819 	if (sce->pipeh == NULL) {
820 		printf("ugenwrite: no pipe\n");
821 		return (EIO);
822 	}
823 #endif
824 
825 	switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
826 	case UE_BULK:
827 #ifdef UGEN_BULK_RA_WB
828 		if (sce->state & UGEN_BULK_WB) {
829 			DPRINTFN(5, ("ugenwrite: BULK_WB req: %zd used: %d\n",
830 				     uio->uio_resid, sce->ra_wb_used));
831 			xfer = sce->ra_wb_xfer;
832 
833 			s = splusb();
834 			if (sce->ra_wb_used == sce->limit - sce->ibuf &&
835 			    flag & IO_NDELAY) {
836 				splx(s);
837 				return (EWOULDBLOCK);
838 			}
839 			while (uio->uio_resid > 0 && !error) {
840 				while (sce->ra_wb_used ==
841 				       sce->limit - sce->ibuf) {
842 					sce->state |= UGEN_ASLP;
843 					DPRINTFN(5,
844 						 ("ugenwrite: sleep on %p\n",
845 						  sce));
846 					error = tsleep(sce, PZERO | PCATCH,
847 						       "ugenwb", 0);
848 					DPRINTFN(5,
849 						 ("ugenwrite: woke, error=%d\n",
850 						  error));
851 					if (sc->sc_dying)
852 						error = EIO;
853 					if (error) {
854 						sce->state &= ~UGEN_ASLP;
855 						break;
856 					}
857 				}
858 
859 				/* Copy data from the process. */
860 				while (uio->uio_resid > 0 &&
861 				    sce->ra_wb_used < sce->limit - sce->ibuf) {
862 					n = min(uio->uio_resid,
863 						(sce->limit - sce->ibuf)
864 						 - sce->ra_wb_used);
865 					n = min(n, sce->limit - sce->fill);
866 					error = uiomove(sce->fill, n, uio);
867 					if (error)
868 						break;
869 					sce->fill += n;
870 					sce->ra_wb_used += n;
871 					if (sce->fill == sce->limit)
872 						sce->fill = sce->ibuf;
873 				}
874 
875 				/*
876 				 * If the transfers stopped because the
877 				 * buffer was empty, restart them.
878 				 */
879 				if (sce->state & UGEN_RA_WB_STOP &&
880 				    sce->ra_wb_used > 0) {
881 					dbuf = (char *)usbd_get_buffer(xfer);
882 					n = min(sce->ra_wb_used,
883 						sce->ra_wb_xferlen);
884 					tn = min(n, sce->limit - sce->cur);
885 					memcpy(dbuf, sce->cur, tn);
886 					dbuf += tn;
887 					if (n - tn > 0)
888 						memcpy(dbuf, sce->ibuf,
889 						       n - tn);
890 					usbd_setup_xfer(xfer,
891 					    sce->pipeh, sce, NULL, n,
892 					    USBD_NO_COPY, USBD_NO_TIMEOUT,
893 					    ugen_bulkwb_intr);
894 					sce->state &= ~UGEN_RA_WB_STOP;
895 					err = usbd_transfer(xfer);
896 					if (err != USBD_IN_PROGRESS)
897 						/*
898 						 * The transfer has not been
899 						 * queued.  Setting STOP
900 						 * will make us try again
901 						 * at the next read.
902 						 */
903 						sce->state |= UGEN_RA_WB_STOP;
904 				}
905 			}
906 			splx(s);
907 			break;
908 		}
909 #endif
910 		xfer = usbd_alloc_xfer(sc->sc_udev);
911 		if (xfer == 0)
912 			return (EIO);
913 		while ((n = min(UGEN_BBSIZE, uio->uio_resid)) != 0) {
914 			error = uiomove(sc->sc_buffer, n, uio);
915 			if (error)
916 				break;
917 			DPRINTFN(1, ("ugenwrite: transfer %d bytes\n", n));
918 			err = usbd_bulk_transfer(xfer, sce->pipeh, 0,
919 				  sce->timeout, sc->sc_buffer, &n,"ugenwb");
920 			if (err) {
921 				if (err == USBD_INTERRUPTED)
922 					error = EINTR;
923 				else if (err == USBD_TIMEOUT)
924 					error = ETIMEDOUT;
925 				else
926 					error = EIO;
927 				break;
928 			}
929 		}
930 		usbd_free_xfer(xfer);
931 		break;
932 	case UE_INTERRUPT:
933 		xfer = usbd_alloc_xfer(sc->sc_udev);
934 		if (xfer == 0)
935 			return (EIO);
936 		while ((n = min(UGETW(sce->edesc->wMaxPacketSize),
937 		    uio->uio_resid)) != 0) {
938 			error = uiomove(sc->sc_buffer, n, uio);
939 			if (error)
940 				break;
941 			DPRINTFN(1, ("ugenwrite: transfer %d bytes\n", n));
942 			err = usbd_intr_transfer(xfer, sce->pipeh, 0,
943 			    sce->timeout, sc->sc_buffer, &n, "ugenwi");
944 			if (err) {
945 				if (err == USBD_INTERRUPTED)
946 					error = EINTR;
947 				else if (err == USBD_TIMEOUT)
948 					error = ETIMEDOUT;
949 				else
950 					error = EIO;
951 				break;
952 			}
953 		}
954 		usbd_free_xfer(xfer);
955 		break;
956 	default:
957 		return (ENXIO);
958 	}
959 	return (error);
960 }
961 
962 int
963 ugenwrite(dev_t dev, struct uio *uio, int flag)
964 {
965 	int endpt = UGENENDPOINT(dev);
966 	struct ugen_softc *sc;
967 	int error;
968 
969 	USB_GET_SC(ugen, UGENUNIT(dev), sc);
970 
971 	sc->sc_refcnt++;
972 	error = ugen_do_write(sc, endpt, uio, flag);
973 	if (--sc->sc_refcnt < 0)
974 		usb_detach_wakeup(USBDEV(sc->sc_dev));
975 	return (error);
976 }
977 
978 #if defined(__NetBSD__) || defined(__OpenBSD__)
979 int
980 ugen_activate(device_ptr_t self, enum devact act)
981 {
982 	struct ugen_softc *sc = (struct ugen_softc *)self;
983 
984 	switch (act) {
985 	case DVACT_ACTIVATE:
986 		return (EOPNOTSUPP);
987 
988 	case DVACT_DEACTIVATE:
989 		sc->sc_dying = 1;
990 		break;
991 	}
992 	return (0);
993 }
994 #endif
995 
996 USB_DETACH(ugen)
997 {
998 	USB_DETACH_START(ugen, sc);
999 	struct ugen_endpoint *sce;
1000 	int i, dir;
1001 	int s;
1002 #if defined(__NetBSD__) || defined(__OpenBSD__)
1003 	int maj, mn;
1004 
1005 	DPRINTF(("ugen_detach: sc=%p flags=%d\n", sc, flags));
1006 #elif defined(__FreeBSD__)
1007 	DPRINTF(("ugen_detach: sc=%p\n", sc));
1008 #endif
1009 
1010 	sc->sc_dying = 1;
1011 	/* Abort all pipes.  Causes processes waiting for transfer to wake. */
1012 	for (i = 0; i < USB_MAX_ENDPOINTS; i++) {
1013 		for (dir = OUT; dir <= IN; dir++) {
1014 			sce = &sc->sc_endpoints[i][dir];
1015 			if (sce && sce->pipeh)
1016 				usbd_abort_pipe(sce->pipeh);
1017 		}
1018 	}
1019 
1020 	s = splusb();
1021 	if (--sc->sc_refcnt >= 0) {
1022 		/* Wake everyone */
1023 		for (i = 0; i < USB_MAX_ENDPOINTS; i++)
1024 			wakeup(&sc->sc_endpoints[i][IN]);
1025 		/* Wait for processes to go away. */
1026 		usb_detach_wait(USBDEV(sc->sc_dev));
1027 	}
1028 	splx(s);
1029 
1030 #if defined(__NetBSD__) || defined(__OpenBSD__)
1031 	/* locate the major number */
1032 #if defined(__NetBSD__)
1033 	maj = cdevsw_lookup_major(&ugen_cdevsw);
1034 #elif defined(__OpenBSD__)
1035 	for (maj = 0; maj < nchrdev; maj++)
1036 		if (cdevsw[maj].d_open == ugenopen)
1037 			break;
1038 #endif
1039 
1040 	/* Nuke the vnodes for any open instances (calls close). */
1041 	mn = device_unit(self) * USB_MAX_ENDPOINTS;
1042 	vdevgone(maj, mn, mn + USB_MAX_ENDPOINTS - 1, VCHR);
1043 #elif defined(__FreeBSD__)
1044 	/* XXX not implemented yet */
1045 #endif
1046 
1047 	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev,
1048 			   USBDEV(sc->sc_dev));
1049 
1050 	return (0);
1051 }
1052 
1053 Static void
1054 ugenintr(usbd_xfer_handle xfer, usbd_private_handle addr, usbd_status status)
1055 {
1056 	struct ugen_endpoint *sce = addr;
1057 	/*struct ugen_softc *sc = sce->sc;*/
1058 	u_int32_t count;
1059 	u_char *ibuf;
1060 
1061 	if (status == USBD_CANCELLED)
1062 		return;
1063 
1064 	if (status != USBD_NORMAL_COMPLETION) {
1065 		DPRINTF(("ugenintr: status=%d\n", status));
1066 		if (status == USBD_STALLED)
1067 		    usbd_clear_endpoint_stall_async(sce->pipeh);
1068 		return;
1069 	}
1070 
1071 	usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
1072 	ibuf = sce->ibuf;
1073 
1074 	DPRINTFN(5, ("ugenintr: xfer=%p status=%d count=%d\n",
1075 		     xfer, status, count));
1076 	DPRINTFN(5, ("          data = %02x %02x %02x\n",
1077 		     ibuf[0], ibuf[1], ibuf[2]));
1078 
1079 	(void)b_to_q(ibuf, count, &sce->q);
1080 
1081 	if (sce->state & UGEN_ASLP) {
1082 		sce->state &= ~UGEN_ASLP;
1083 		DPRINTFN(5, ("ugen_intr: waking %p\n", sce));
1084 		wakeup(sce);
1085 	}
1086 	selnotify(&sce->rsel, 0);
1087 }
1088 
1089 Static void
1090 ugen_isoc_rintr(usbd_xfer_handle xfer, usbd_private_handle addr,
1091 		usbd_status status)
1092 {
1093 	struct isoreq *req = addr;
1094 	struct ugen_endpoint *sce = req->sce;
1095 	u_int32_t count, n;
1096 	int i, isize;
1097 
1098 	/* Return if we are aborting. */
1099 	if (status == USBD_CANCELLED)
1100 		return;
1101 
1102 	usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
1103 	DPRINTFN(5,("ugen_isoc_rintr: xfer %ld, count=%d\n",
1104 	    (long)(req - sce->isoreqs), count));
1105 
1106 	/* throw away oldest input if the buffer is full */
1107 	if(sce->fill < sce->cur && sce->cur <= sce->fill + count) {
1108 		sce->cur += count;
1109 		if(sce->cur >= sce->limit)
1110 			sce->cur = sce->ibuf + (sce->limit - sce->cur);
1111 		DPRINTFN(5, ("ugen_isoc_rintr: throwing away %d bytes\n",
1112 			     count));
1113 	}
1114 
1115 	isize = UGETW(sce->edesc->wMaxPacketSize);
1116 	for (i = 0; i < UGEN_NISORFRMS; i++) {
1117 		u_int32_t actlen = req->sizes[i];
1118 		char const *tbuf = (char const *)req->dmabuf + isize * i;
1119 
1120 		/* copy data to buffer */
1121 		while (actlen > 0) {
1122 			n = min(actlen, sce->limit - sce->fill);
1123 			memcpy(sce->fill, tbuf, n);
1124 
1125 			tbuf += n;
1126 			actlen -= n;
1127 			sce->fill += n;
1128 			if(sce->fill == sce->limit)
1129 				sce->fill = sce->ibuf;
1130 		}
1131 
1132 		/* setup size for next transfer */
1133 		req->sizes[i] = isize;
1134 	}
1135 
1136 	usbd_setup_isoc_xfer(xfer, sce->pipeh, req, req->sizes, UGEN_NISORFRMS,
1137 			     USBD_NO_COPY, ugen_isoc_rintr);
1138 	(void)usbd_transfer(xfer);
1139 
1140 	if (sce->state & UGEN_ASLP) {
1141 		sce->state &= ~UGEN_ASLP;
1142 		DPRINTFN(5, ("ugen_isoc_rintr: waking %p\n", sce));
1143 		wakeup(sce);
1144 	}
1145 	selnotify(&sce->rsel, 0);
1146 }
1147 
1148 #ifdef UGEN_BULK_RA_WB
1149 Static void
1150 ugen_bulkra_intr(usbd_xfer_handle xfer, usbd_private_handle addr,
1151 		 usbd_status status)
1152 {
1153 	struct ugen_endpoint *sce = addr;
1154 	u_int32_t count, n;
1155 	char const *tbuf;
1156 	usbd_status err;
1157 
1158 	/* Return if we are aborting. */
1159 	if (status == USBD_CANCELLED)
1160 		return;
1161 
1162 	if (status != USBD_NORMAL_COMPLETION) {
1163 		DPRINTF(("ugen_bulkra_intr: status=%d\n", status));
1164 		sce->state |= UGEN_RA_WB_STOP;
1165 		if (status == USBD_STALLED)
1166 		    usbd_clear_endpoint_stall_async(sce->pipeh);
1167 		return;
1168 	}
1169 
1170 	usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
1171 
1172 	/* Keep track of how much is in the buffer. */
1173 	sce->ra_wb_used += count;
1174 
1175 	/* Copy data to buffer. */
1176 	tbuf = (char const *)usbd_get_buffer(sce->ra_wb_xfer);
1177 	n = min(count, sce->limit - sce->fill);
1178 	memcpy(sce->fill, tbuf, n);
1179 	tbuf += n;
1180 	count -= n;
1181 	sce->fill += n;
1182 	if (sce->fill == sce->limit)
1183 		sce->fill = sce->ibuf;
1184 	if (count > 0) {
1185 		memcpy(sce->fill, tbuf, count);
1186 		sce->fill += count;
1187 	}
1188 
1189 	/* Set up the next request if necessary. */
1190 	n = (sce->limit - sce->ibuf) - sce->ra_wb_used;
1191 	if (n > 0) {
1192 		usbd_setup_xfer(xfer, sce->pipeh, sce, NULL,
1193 		    min(n, sce->ra_wb_xferlen), USBD_NO_COPY,
1194 		    USBD_NO_TIMEOUT, ugen_bulkra_intr);
1195 		err = usbd_transfer(xfer);
1196 		if (err != USBD_IN_PROGRESS) {
1197 			printf("usbd_bulkra_intr: error=%d\n", err);
1198 			/*
1199 			 * The transfer has not been queued.  Setting STOP
1200 			 * will make us try again at the next read.
1201 			 */
1202 			sce->state |= UGEN_RA_WB_STOP;
1203 		}
1204 	}
1205 	else
1206 		sce->state |= UGEN_RA_WB_STOP;
1207 
1208 	if (sce->state & UGEN_ASLP) {
1209 		sce->state &= ~UGEN_ASLP;
1210 		DPRINTFN(5, ("ugen_bulkra_intr: waking %p\n", sce));
1211 		wakeup(sce);
1212 	}
1213 	selnotify(&sce->rsel, 0);
1214 }
1215 
1216 Static void
1217 ugen_bulkwb_intr(usbd_xfer_handle xfer, usbd_private_handle addr,
1218 		 usbd_status status)
1219 {
1220 	struct ugen_endpoint *sce = addr;
1221 	u_int32_t count, n;
1222 	char *tbuf;
1223 	usbd_status err;
1224 
1225 	/* Return if we are aborting. */
1226 	if (status == USBD_CANCELLED)
1227 		return;
1228 
1229 	if (status != USBD_NORMAL_COMPLETION) {
1230 		DPRINTF(("ugen_bulkwb_intr: status=%d\n", status));
1231 		sce->state |= UGEN_RA_WB_STOP;
1232 		if (status == USBD_STALLED)
1233 		    usbd_clear_endpoint_stall_async(sce->pipeh);
1234 		return;
1235 	}
1236 
1237 	usbd_get_xfer_status(xfer, NULL, NULL, &count, NULL);
1238 
1239 	/* Keep track of how much is in the buffer. */
1240 	sce->ra_wb_used -= count;
1241 
1242 	/* Update buffer pointers. */
1243 	sce->cur += count;
1244 	if (sce->cur >= sce->limit)
1245 		sce->cur = sce->ibuf + (sce->cur - sce->limit);
1246 
1247 	/* Set up next request if necessary. */
1248 	if (sce->ra_wb_used > 0) {
1249 		/* copy data from buffer */
1250 		tbuf = (char *)usbd_get_buffer(sce->ra_wb_xfer);
1251 		count = min(sce->ra_wb_used, sce->ra_wb_xferlen);
1252 		n = min(count, sce->limit - sce->cur);
1253 		memcpy(tbuf, sce->cur, n);
1254 		tbuf += n;
1255 		if (count - n > 0)
1256 			memcpy(tbuf, sce->ibuf, count - n);
1257 
1258 		usbd_setup_xfer(xfer, sce->pipeh, sce, NULL,
1259 		    count, USBD_NO_COPY, USBD_NO_TIMEOUT, ugen_bulkwb_intr);
1260 		err = usbd_transfer(xfer);
1261 		if (err != USBD_IN_PROGRESS) {
1262 			printf("usbd_bulkwb_intr: error=%d\n", err);
1263 			/*
1264 			 * The transfer has not been queued.  Setting STOP
1265 			 * will make us try again at the next write.
1266 			 */
1267 			sce->state |= UGEN_RA_WB_STOP;
1268 		}
1269 	}
1270 	else
1271 		sce->state |= UGEN_RA_WB_STOP;
1272 
1273 	if (sce->state & UGEN_ASLP) {
1274 		sce->state &= ~UGEN_ASLP;
1275 		DPRINTFN(5, ("ugen_bulkwb_intr: waking %p\n", sce));
1276 		wakeup(sce);
1277 	}
1278 	selnotify(&sce->rsel, 0);
1279 }
1280 #endif
1281 
1282 Static usbd_status
1283 ugen_set_interface(struct ugen_softc *sc, int ifaceidx, int altno)
1284 {
1285 	usbd_interface_handle iface;
1286 	usb_endpoint_descriptor_t *ed;
1287 	usbd_status err;
1288 	struct ugen_endpoint *sce;
1289 	u_int8_t niface, nendpt, endptno, endpt;
1290 	int dir;
1291 
1292 	DPRINTFN(15, ("ugen_set_interface %d %d\n", ifaceidx, altno));
1293 
1294 	err = usbd_interface_count(sc->sc_udev, &niface);
1295 	if (err)
1296 		return (err);
1297 	if (ifaceidx < 0 || ifaceidx >= niface)
1298 		return (USBD_INVAL);
1299 
1300 	err = usbd_device2interface_handle(sc->sc_udev, ifaceidx, &iface);
1301 	if (err)
1302 		return (err);
1303 	err = usbd_endpoint_count(iface, &nendpt);
1304 	if (err)
1305 		return (err);
1306 	/* XXX should only do this after setting new altno has succeeded */
1307 	for (endptno = 0; endptno < nendpt; endptno++) {
1308 		ed = usbd_interface2endpoint_descriptor(iface,endptno);
1309 		endpt = ed->bEndpointAddress;
1310 		dir = UE_GET_DIR(endpt) == UE_DIR_IN ? IN : OUT;
1311 		sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir];
1312 		sce->sc = 0;
1313 		sce->edesc = 0;
1314 		sce->iface = 0;
1315 	}
1316 
1317 	/* change setting */
1318 	err = usbd_set_interface(iface, altno);
1319 	if (err)
1320 		return (err);
1321 
1322 	err = usbd_endpoint_count(iface, &nendpt);
1323 	if (err)
1324 		return (err);
1325 	for (endptno = 0; endptno < nendpt; endptno++) {
1326 		ed = usbd_interface2endpoint_descriptor(iface,endptno);
1327 		KASSERT(ed != NULL);
1328 		endpt = ed->bEndpointAddress;
1329 		dir = UE_GET_DIR(endpt) == UE_DIR_IN ? IN : OUT;
1330 		sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir];
1331 		sce->sc = sc;
1332 		sce->edesc = ed;
1333 		sce->iface = iface;
1334 	}
1335 	return (0);
1336 }
1337 
1338 /* Retrieve a complete descriptor for a certain device and index. */
1339 Static usb_config_descriptor_t *
1340 ugen_get_cdesc(struct ugen_softc *sc, int index, int *lenp)
1341 {
1342 	usb_config_descriptor_t *cdesc, *tdesc, cdescr;
1343 	int len;
1344 	usbd_status err;
1345 
1346 	if (index == USB_CURRENT_CONFIG_INDEX) {
1347 		tdesc = usbd_get_config_descriptor(sc->sc_udev);
1348 		len = UGETW(tdesc->wTotalLength);
1349 		if (lenp)
1350 			*lenp = len;
1351 		cdesc = malloc(len, M_TEMP, M_WAITOK);
1352 		memcpy(cdesc, tdesc, len);
1353 		DPRINTFN(5,("ugen_get_cdesc: current, len=%d\n", len));
1354 	} else {
1355 		err = usbd_get_config_desc(sc->sc_udev, index, &cdescr);
1356 		if (err)
1357 			return (0);
1358 		len = UGETW(cdescr.wTotalLength);
1359 		DPRINTFN(5,("ugen_get_cdesc: index=%d, len=%d\n", index, len));
1360 		if (lenp)
1361 			*lenp = len;
1362 		cdesc = malloc(len, M_TEMP, M_WAITOK);
1363 		err = usbd_get_config_desc_full(sc->sc_udev, index, cdesc, len);
1364 		if (err) {
1365 			free(cdesc, M_TEMP);
1366 			return (0);
1367 		}
1368 	}
1369 	return (cdesc);
1370 }
1371 
1372 Static int
1373 ugen_get_alt_index(struct ugen_softc *sc, int ifaceidx)
1374 {
1375 	usbd_interface_handle iface;
1376 	usbd_status err;
1377 
1378 	err = usbd_device2interface_handle(sc->sc_udev, ifaceidx, &iface);
1379 	if (err)
1380 		return (-1);
1381 	return (usbd_get_interface_altindex(iface));
1382 }
1383 
1384 Static int
1385 ugen_do_ioctl(struct ugen_softc *sc, int endpt, u_long cmd,
1386 	      void *addr, int flag, struct lwp *l)
1387 {
1388 	struct ugen_endpoint *sce;
1389 	usbd_status err;
1390 	usbd_interface_handle iface;
1391 	struct usb_config_desc *cd;
1392 	usb_config_descriptor_t *cdesc;
1393 	struct usb_interface_desc *id;
1394 	usb_interface_descriptor_t *idesc;
1395 	struct usb_endpoint_desc *ed;
1396 	usb_endpoint_descriptor_t *edesc;
1397 	struct usb_alt_interface *ai;
1398 	struct usb_string_desc *si;
1399 	u_int8_t conf, alt;
1400 
1401 	DPRINTFN(5, ("ugenioctl: cmd=%08lx\n", cmd));
1402 	if (sc->sc_dying)
1403 		return (EIO);
1404 
1405 	switch (cmd) {
1406 	case FIONBIO:
1407 		/* All handled in the upper FS layer. */
1408 		return (0);
1409 	case USB_SET_SHORT_XFER:
1410 		if (endpt == USB_CONTROL_ENDPOINT)
1411 			return (EINVAL);
1412 		/* This flag only affects read */
1413 		sce = &sc->sc_endpoints[endpt][IN];
1414 		if (sce == NULL || sce->pipeh == NULL)
1415 			return (EINVAL);
1416 		if (*(int *)addr)
1417 			sce->state |= UGEN_SHORT_OK;
1418 		else
1419 			sce->state &= ~UGEN_SHORT_OK;
1420 		return (0);
1421 	case USB_SET_TIMEOUT:
1422 		sce = &sc->sc_endpoints[endpt][IN];
1423 		if (sce == NULL
1424 		    /* XXX this shouldn't happen, but the distinction between
1425 		       input and output pipes isn't clear enough.
1426 		       || sce->pipeh == NULL */
1427 			)
1428 			return (EINVAL);
1429 		sce->timeout = *(int *)addr;
1430 		return (0);
1431 	case USB_SET_BULK_RA:
1432 #ifdef UGEN_BULK_RA_WB
1433 		if (endpt == USB_CONTROL_ENDPOINT)
1434 			return (EINVAL);
1435 		sce = &sc->sc_endpoints[endpt][IN];
1436 		if (sce == NULL || sce->pipeh == NULL)
1437 			return (EINVAL);
1438 		edesc = sce->edesc;
1439 		if ((edesc->bmAttributes & UE_XFERTYPE) != UE_BULK)
1440 			return (EINVAL);
1441 
1442 		if (*(int *)addr) {
1443 			/* Only turn RA on if it's currently off. */
1444 			if (sce->state & UGEN_BULK_RA)
1445 				return (0);
1446 
1447 			if (sce->ra_wb_bufsize == 0 || sce->ra_wb_reqsize == 0)
1448 				/* shouldn't happen */
1449 				return (EINVAL);
1450 			sce->ra_wb_xfer = usbd_alloc_xfer(sc->sc_udev);
1451 			if (sce->ra_wb_xfer == NULL)
1452 				return (ENOMEM);
1453 			sce->ra_wb_xferlen = sce->ra_wb_reqsize;
1454 			/*
1455 			 * Set up a dmabuf because we reuse the xfer with
1456 			 * the same (max) request length like isoc.
1457 			 */
1458 			if (usbd_alloc_buffer(sce->ra_wb_xfer,
1459 					      sce->ra_wb_xferlen) == 0) {
1460 				usbd_free_xfer(sce->ra_wb_xfer);
1461 				return (ENOMEM);
1462 			}
1463 			sce->ibuf = malloc(sce->ra_wb_bufsize,
1464 					   M_USBDEV, M_WAITOK);
1465 			sce->fill = sce->cur = sce->ibuf;
1466 			sce->limit = sce->ibuf + sce->ra_wb_bufsize;
1467 			sce->ra_wb_used = 0;
1468 			sce->state |= UGEN_BULK_RA;
1469 			sce->state &= ~UGEN_RA_WB_STOP;
1470 			/* Now start reading. */
1471 			usbd_setup_xfer(sce->ra_wb_xfer, sce->pipeh, sce,
1472 			    NULL,
1473 			    min(sce->ra_wb_xferlen, sce->ra_wb_bufsize),
1474 			    USBD_NO_COPY, USBD_NO_TIMEOUT,
1475 			    ugen_bulkra_intr);
1476 			err = usbd_transfer(sce->ra_wb_xfer);
1477 			if (err != USBD_IN_PROGRESS) {
1478 				sce->state &= ~UGEN_BULK_RA;
1479 				free(sce->ibuf, M_USBDEV);
1480 				sce->ibuf = NULL;
1481 				usbd_free_xfer(sce->ra_wb_xfer);
1482 				return (EIO);
1483 			}
1484 		} else {
1485 			/* Only turn RA off if it's currently on. */
1486 			if (!(sce->state & UGEN_BULK_RA))
1487 				return (0);
1488 
1489 			sce->state &= ~UGEN_BULK_RA;
1490 			usbd_abort_pipe(sce->pipeh);
1491 			usbd_free_xfer(sce->ra_wb_xfer);
1492 			/*
1493 			 * XXX Discard whatever's in the buffer, but we
1494 			 * should keep it around and drain the buffer
1495 			 * instead.
1496 			 */
1497 			free(sce->ibuf, M_USBDEV);
1498 			sce->ibuf = NULL;
1499 		}
1500 		return (0);
1501 #else
1502 		return (EOPNOTSUPP);
1503 #endif
1504 	case USB_SET_BULK_WB:
1505 #ifdef UGEN_BULK_RA_WB
1506 		if (endpt == USB_CONTROL_ENDPOINT)
1507 			return (EINVAL);
1508 		sce = &sc->sc_endpoints[endpt][OUT];
1509 		if (sce == NULL || sce->pipeh == NULL)
1510 			return (EINVAL);
1511 		edesc = sce->edesc;
1512 		if ((edesc->bmAttributes & UE_XFERTYPE) != UE_BULK)
1513 			return (EINVAL);
1514 
1515 		if (*(int *)addr) {
1516 			/* Only turn WB on if it's currently off. */
1517 			if (sce->state & UGEN_BULK_WB)
1518 				return (0);
1519 
1520 			if (sce->ra_wb_bufsize == 0 || sce->ra_wb_reqsize == 0)
1521 				/* shouldn't happen */
1522 				return (EINVAL);
1523 			sce->ra_wb_xfer = usbd_alloc_xfer(sc->sc_udev);
1524 			if (sce->ra_wb_xfer == NULL)
1525 				return (ENOMEM);
1526 			sce->ra_wb_xferlen = sce->ra_wb_reqsize;
1527 			/*
1528 			 * Set up a dmabuf because we reuse the xfer with
1529 			 * the same (max) request length like isoc.
1530 			 */
1531 			if (usbd_alloc_buffer(sce->ra_wb_xfer,
1532 					      sce->ra_wb_xferlen) == 0) {
1533 				usbd_free_xfer(sce->ra_wb_xfer);
1534 				return (ENOMEM);
1535 			}
1536 			sce->ibuf = malloc(sce->ra_wb_bufsize,
1537 					   M_USBDEV, M_WAITOK);
1538 			sce->fill = sce->cur = sce->ibuf;
1539 			sce->limit = sce->ibuf + sce->ra_wb_bufsize;
1540 			sce->ra_wb_used = 0;
1541 			sce->state |= UGEN_BULK_WB | UGEN_RA_WB_STOP;
1542 		} else {
1543 			/* Only turn WB off if it's currently on. */
1544 			if (!(sce->state & UGEN_BULK_WB))
1545 				return (0);
1546 
1547 			sce->state &= ~UGEN_BULK_WB;
1548 			/*
1549 			 * XXX Discard whatever's in the buffer, but we
1550 			 * should keep it around and keep writing to
1551 			 * drain the buffer instead.
1552 			 */
1553 			usbd_abort_pipe(sce->pipeh);
1554 			usbd_free_xfer(sce->ra_wb_xfer);
1555 			free(sce->ibuf, M_USBDEV);
1556 			sce->ibuf = NULL;
1557 		}
1558 		return (0);
1559 #else
1560 		return (EOPNOTSUPP);
1561 #endif
1562 	case USB_SET_BULK_RA_OPT:
1563 	case USB_SET_BULK_WB_OPT:
1564 #ifdef UGEN_BULK_RA_WB
1565 	{
1566 		struct usb_bulk_ra_wb_opt *opt;
1567 
1568 		if (endpt == USB_CONTROL_ENDPOINT)
1569 			return (EINVAL);
1570 		opt = (struct usb_bulk_ra_wb_opt *)addr;
1571 		if (cmd == USB_SET_BULK_RA_OPT)
1572 			sce = &sc->sc_endpoints[endpt][IN];
1573 		else
1574 			sce = &sc->sc_endpoints[endpt][OUT];
1575 		if (sce == NULL || sce->pipeh == NULL)
1576 			return (EINVAL);
1577 		if (opt->ra_wb_buffer_size < 1 ||
1578 		    opt->ra_wb_buffer_size > UGEN_BULK_RA_WB_BUFMAX ||
1579 		    opt->ra_wb_request_size < 1 ||
1580 		    opt->ra_wb_request_size > opt->ra_wb_buffer_size)
1581 			return (EINVAL);
1582 		/*
1583 		 * XXX These changes do not take effect until the
1584 		 * next time RA/WB mode is enabled but they ought to
1585 		 * take effect immediately.
1586 		 */
1587 		sce->ra_wb_bufsize = opt->ra_wb_buffer_size;
1588 		sce->ra_wb_reqsize = opt->ra_wb_request_size;
1589 		return (0);
1590 	}
1591 #else
1592 		return (EOPNOTSUPP);
1593 #endif
1594 	default:
1595 		break;
1596 	}
1597 
1598 	if (endpt != USB_CONTROL_ENDPOINT)
1599 		return (EINVAL);
1600 
1601 	switch (cmd) {
1602 #ifdef UGEN_DEBUG
1603 	case USB_SETDEBUG:
1604 		ugendebug = *(int *)addr;
1605 		break;
1606 #endif
1607 	case USB_GET_CONFIG:
1608 		err = usbd_get_config(sc->sc_udev, &conf);
1609 		if (err)
1610 			return (EIO);
1611 		*(int *)addr = conf;
1612 		break;
1613 	case USB_SET_CONFIG:
1614 		if (!(flag & FWRITE))
1615 			return (EPERM);
1616 		err = ugen_set_config(sc, *(int *)addr);
1617 		switch (err) {
1618 		case USBD_NORMAL_COMPLETION:
1619 			break;
1620 		case USBD_IN_USE:
1621 			return (EBUSY);
1622 		default:
1623 			return (EIO);
1624 		}
1625 		break;
1626 	case USB_GET_ALTINTERFACE:
1627 		ai = (struct usb_alt_interface *)addr;
1628 		err = usbd_device2interface_handle(sc->sc_udev,
1629 			  ai->uai_interface_index, &iface);
1630 		if (err)
1631 			return (EINVAL);
1632 		idesc = usbd_get_interface_descriptor(iface);
1633 		if (idesc == NULL)
1634 			return (EIO);
1635 		ai->uai_alt_no = idesc->bAlternateSetting;
1636 		break;
1637 	case USB_SET_ALTINTERFACE:
1638 		if (!(flag & FWRITE))
1639 			return (EPERM);
1640 		ai = (struct usb_alt_interface *)addr;
1641 		err = usbd_device2interface_handle(sc->sc_udev,
1642 			  ai->uai_interface_index, &iface);
1643 		if (err)
1644 			return (EINVAL);
1645 		err = ugen_set_interface(sc, ai->uai_interface_index,
1646 		    ai->uai_alt_no);
1647 		if (err)
1648 			return (EINVAL);
1649 		break;
1650 	case USB_GET_NO_ALT:
1651 		ai = (struct usb_alt_interface *)addr;
1652 		cdesc = ugen_get_cdesc(sc, ai->uai_config_index, 0);
1653 		if (cdesc == NULL)
1654 			return (EINVAL);
1655 		idesc = usbd_find_idesc(cdesc, ai->uai_interface_index, 0);
1656 		if (idesc == NULL) {
1657 			free(cdesc, M_TEMP);
1658 			return (EINVAL);
1659 		}
1660 		ai->uai_alt_no = usbd_get_no_alts(cdesc,
1661 		    idesc->bInterfaceNumber);
1662 		free(cdesc, M_TEMP);
1663 		break;
1664 	case USB_GET_DEVICE_DESC:
1665 		*(usb_device_descriptor_t *)addr =
1666 			*usbd_get_device_descriptor(sc->sc_udev);
1667 		break;
1668 	case USB_GET_CONFIG_DESC:
1669 		cd = (struct usb_config_desc *)addr;
1670 		cdesc = ugen_get_cdesc(sc, cd->ucd_config_index, 0);
1671 		if (cdesc == NULL)
1672 			return (EINVAL);
1673 		cd->ucd_desc = *cdesc;
1674 		free(cdesc, M_TEMP);
1675 		break;
1676 	case USB_GET_INTERFACE_DESC:
1677 		id = (struct usb_interface_desc *)addr;
1678 		cdesc = ugen_get_cdesc(sc, id->uid_config_index, 0);
1679 		if (cdesc == NULL)
1680 			return (EINVAL);
1681 		if (id->uid_config_index == USB_CURRENT_CONFIG_INDEX &&
1682 		    id->uid_alt_index == USB_CURRENT_ALT_INDEX)
1683 			alt = ugen_get_alt_index(sc, id->uid_interface_index);
1684 		else
1685 			alt = id->uid_alt_index;
1686 		idesc = usbd_find_idesc(cdesc, id->uid_interface_index, alt);
1687 		if (idesc == NULL) {
1688 			free(cdesc, M_TEMP);
1689 			return (EINVAL);
1690 		}
1691 		id->uid_desc = *idesc;
1692 		free(cdesc, M_TEMP);
1693 		break;
1694 	case USB_GET_ENDPOINT_DESC:
1695 		ed = (struct usb_endpoint_desc *)addr;
1696 		cdesc = ugen_get_cdesc(sc, ed->ued_config_index, 0);
1697 		if (cdesc == NULL)
1698 			return (EINVAL);
1699 		if (ed->ued_config_index == USB_CURRENT_CONFIG_INDEX &&
1700 		    ed->ued_alt_index == USB_CURRENT_ALT_INDEX)
1701 			alt = ugen_get_alt_index(sc, ed->ued_interface_index);
1702 		else
1703 			alt = ed->ued_alt_index;
1704 		edesc = usbd_find_edesc(cdesc, ed->ued_interface_index,
1705 					alt, ed->ued_endpoint_index);
1706 		if (edesc == NULL) {
1707 			free(cdesc, M_TEMP);
1708 			return (EINVAL);
1709 		}
1710 		ed->ued_desc = *edesc;
1711 		free(cdesc, M_TEMP);
1712 		break;
1713 	case USB_GET_FULL_DESC:
1714 	{
1715 		int len;
1716 		struct iovec iov;
1717 		struct uio uio;
1718 		struct usb_full_desc *fd = (struct usb_full_desc *)addr;
1719 		int error;
1720 
1721 		cdesc = ugen_get_cdesc(sc, fd->ufd_config_index, &len);
1722 		if (len > fd->ufd_size)
1723 			len = fd->ufd_size;
1724 		iov.iov_base = (void *)fd->ufd_data;
1725 		iov.iov_len = len;
1726 		uio.uio_iov = &iov;
1727 		uio.uio_iovcnt = 1;
1728 		uio.uio_resid = len;
1729 		uio.uio_offset = 0;
1730 		uio.uio_rw = UIO_READ;
1731 		uio.uio_vmspace = l->l_proc->p_vmspace;
1732 		error = uiomove((void *)cdesc, len, &uio);
1733 		free(cdesc, M_TEMP);
1734 		return (error);
1735 	}
1736 	case USB_GET_STRING_DESC: {
1737 		int len;
1738 		si = (struct usb_string_desc *)addr;
1739 		err = usbd_get_string_desc(sc->sc_udev, si->usd_string_index,
1740 			  si->usd_language_id, &si->usd_desc, &len);
1741 		if (err)
1742 			return (EINVAL);
1743 		break;
1744 	}
1745 	case USB_DO_REQUEST:
1746 	{
1747 		struct usb_ctl_request *ur = (void *)addr;
1748 		int len = UGETW(ur->ucr_request.wLength);
1749 		struct iovec iov;
1750 		struct uio uio;
1751 		void *ptr = 0;
1752 		usbd_status xerr;
1753 		int error = 0;
1754 
1755 		if (!(flag & FWRITE))
1756 			return (EPERM);
1757 		/* Avoid requests that would damage the bus integrity. */
1758 		if ((ur->ucr_request.bmRequestType == UT_WRITE_DEVICE &&
1759 		     ur->ucr_request.bRequest == UR_SET_ADDRESS) ||
1760 		    (ur->ucr_request.bmRequestType == UT_WRITE_DEVICE &&
1761 		     ur->ucr_request.bRequest == UR_SET_CONFIG) ||
1762 		    (ur->ucr_request.bmRequestType == UT_WRITE_INTERFACE &&
1763 		     ur->ucr_request.bRequest == UR_SET_INTERFACE))
1764 			return (EINVAL);
1765 
1766 		if (len < 0 || len > 32767)
1767 			return (EINVAL);
1768 		if (len != 0) {
1769 			iov.iov_base = (void *)ur->ucr_data;
1770 			iov.iov_len = len;
1771 			uio.uio_iov = &iov;
1772 			uio.uio_iovcnt = 1;
1773 			uio.uio_resid = len;
1774 			uio.uio_offset = 0;
1775 			uio.uio_rw =
1776 				ur->ucr_request.bmRequestType & UT_READ ?
1777 				UIO_READ : UIO_WRITE;
1778 			uio.uio_vmspace = l->l_proc->p_vmspace;
1779 			ptr = malloc(len, M_TEMP, M_WAITOK);
1780 			if (uio.uio_rw == UIO_WRITE) {
1781 				error = uiomove(ptr, len, &uio);
1782 				if (error)
1783 					goto ret;
1784 			}
1785 		}
1786 		sce = &sc->sc_endpoints[endpt][IN];
1787 		xerr = usbd_do_request_flags(sc->sc_udev, &ur->ucr_request,
1788 			  ptr, ur->ucr_flags, &ur->ucr_actlen, sce->timeout);
1789 		if (xerr) {
1790 			error = EIO;
1791 			goto ret;
1792 		}
1793 		if (len != 0) {
1794 			if (uio.uio_rw == UIO_READ) {
1795 				error = uiomove(ptr, len, &uio);
1796 				if (error)
1797 					goto ret;
1798 			}
1799 		}
1800 	ret:
1801 		if (ptr)
1802 			free(ptr, M_TEMP);
1803 		return (error);
1804 	}
1805 	case USB_GET_DEVICEINFO:
1806 		usbd_fill_deviceinfo(sc->sc_udev,
1807 				     (struct usb_device_info *)addr, 0);
1808 		break;
1809 #ifdef COMPAT_30
1810 	case USB_GET_DEVICEINFO_OLD:
1811 		usbd_fill_deviceinfo_old(sc->sc_udev,
1812 					 (struct usb_device_info_old *)addr, 0);
1813 
1814 		break;
1815 #endif
1816 	default:
1817 		return (EINVAL);
1818 	}
1819 	return (0);
1820 }
1821 
1822 int
1823 ugenioctl(dev_t dev, u_long cmd, void *addr, int flag, struct lwp *l)
1824 {
1825 	int endpt = UGENENDPOINT(dev);
1826 	struct ugen_softc *sc;
1827 	int error;
1828 
1829 	USB_GET_SC(ugen, UGENUNIT(dev), sc);
1830 
1831 	sc->sc_refcnt++;
1832 	error = ugen_do_ioctl(sc, endpt, cmd, addr, flag, l);
1833 	if (--sc->sc_refcnt < 0)
1834 		usb_detach_wakeup(USBDEV(sc->sc_dev));
1835 	return (error);
1836 }
1837 
1838 int
1839 ugenpoll(dev_t dev, int events, struct lwp *l)
1840 {
1841 	struct ugen_softc *sc;
1842 	struct ugen_endpoint *sce_in, *sce_out;
1843 	int revents = 0;
1844 	int s;
1845 
1846 	USB_GET_SC(ugen, UGENUNIT(dev), sc);
1847 
1848 	if (sc->sc_dying)
1849 		return (POLLHUP);
1850 
1851 	sce_in = &sc->sc_endpoints[UGENENDPOINT(dev)][IN];
1852 	sce_out = &sc->sc_endpoints[UGENENDPOINT(dev)][OUT];
1853 	if (sce_in == NULL && sce_out == NULL)
1854 		return (POLLERR);
1855 #ifdef DIAGNOSTIC
1856 	if (!sce_in->edesc && !sce_out->edesc) {
1857 		printf("ugenpoll: no edesc\n");
1858 		return (POLLERR);
1859 	}
1860 	/* It's possible to have only one pipe open. */
1861 	if (!sce_in->pipeh && !sce_out->pipeh) {
1862 		printf("ugenpoll: no pipe\n");
1863 		return (POLLERR);
1864 	}
1865 #endif
1866 	s = splusb();
1867 	if (sce_in && sce_in->pipeh && (events & (POLLIN | POLLRDNORM)))
1868 		switch (sce_in->edesc->bmAttributes & UE_XFERTYPE) {
1869 		case UE_INTERRUPT:
1870 			if (sce_in->q.c_cc > 0)
1871 				revents |= events & (POLLIN | POLLRDNORM);
1872 			else
1873 				selrecord(l, &sce_in->rsel);
1874 			break;
1875 		case UE_ISOCHRONOUS:
1876 			if (sce_in->cur != sce_in->fill)
1877 				revents |= events & (POLLIN | POLLRDNORM);
1878 			else
1879 				selrecord(l, &sce_in->rsel);
1880 			break;
1881 		case UE_BULK:
1882 #ifdef UGEN_BULK_RA_WB
1883 			if (sce_in->state & UGEN_BULK_RA) {
1884 				if (sce_in->ra_wb_used > 0)
1885 					revents |= events &
1886 					    (POLLIN | POLLRDNORM);
1887 				else
1888 					selrecord(l, &sce_in->rsel);
1889 				break;
1890 			}
1891 #endif
1892 			/*
1893 			 * We have no easy way of determining if a read will
1894 			 * yield any data or a write will happen.
1895 			 * Pretend they will.
1896 			 */
1897 			 revents |= events & (POLLIN | POLLRDNORM);
1898 			 break;
1899 		default:
1900 			break;
1901 		}
1902 	if (sce_out && sce_out->pipeh && (events & (POLLOUT | POLLWRNORM)))
1903 		switch (sce_out->edesc->bmAttributes & UE_XFERTYPE) {
1904 		case UE_INTERRUPT:
1905 		case UE_ISOCHRONOUS:
1906 			/* XXX unimplemented */
1907 			break;
1908 		case UE_BULK:
1909 #ifdef UGEN_BULK_RA_WB
1910 			if (sce_out->state & UGEN_BULK_WB) {
1911 				if (sce_out->ra_wb_used <
1912 				    sce_out->limit - sce_out->ibuf)
1913 					revents |= events &
1914 					    (POLLOUT | POLLWRNORM);
1915 				else
1916 					selrecord(l, &sce_out->rsel);
1917 				break;
1918 			}
1919 #endif
1920 			/*
1921 			 * We have no easy way of determining if a read will
1922 			 * yield any data or a write will happen.
1923 			 * Pretend they will.
1924 			 */
1925 			 revents |= events & (POLLOUT | POLLWRNORM);
1926 			 break;
1927 		default:
1928 			break;
1929 		}
1930 
1931 
1932 	splx(s);
1933 	return (revents);
1934 }
1935 
1936 static void
1937 filt_ugenrdetach(struct knote *kn)
1938 {
1939 	struct ugen_endpoint *sce = kn->kn_hook;
1940 	int s;
1941 
1942 	s = splusb();
1943 	SLIST_REMOVE(&sce->rsel.sel_klist, kn, knote, kn_selnext);
1944 	splx(s);
1945 }
1946 
1947 static int
1948 filt_ugenread_intr(struct knote *kn, long hint)
1949 {
1950 	struct ugen_endpoint *sce = kn->kn_hook;
1951 
1952 	kn->kn_data = sce->q.c_cc;
1953 	return (kn->kn_data > 0);
1954 }
1955 
1956 static int
1957 filt_ugenread_isoc(struct knote *kn, long hint)
1958 {
1959 	struct ugen_endpoint *sce = kn->kn_hook;
1960 
1961 	if (sce->cur == sce->fill)
1962 		return (0);
1963 
1964 	if (sce->cur < sce->fill)
1965 		kn->kn_data = sce->fill - sce->cur;
1966 	else
1967 		kn->kn_data = (sce->limit - sce->cur) +
1968 		    (sce->fill - sce->ibuf);
1969 
1970 	return (1);
1971 }
1972 
1973 #ifdef UGEN_BULK_RA_WB
1974 static int
1975 filt_ugenread_bulk(struct knote *kn, long hint)
1976 {
1977 	struct ugen_endpoint *sce = kn->kn_hook;
1978 
1979 	if (!(sce->state & UGEN_BULK_RA))
1980 		/*
1981 		 * We have no easy way of determining if a read will
1982 		 * yield any data or a write will happen.
1983 		 * So, emulate "seltrue".
1984 		 */
1985 		return (filt_seltrue(kn, hint));
1986 
1987 	if (sce->ra_wb_used == 0)
1988 		return (0);
1989 
1990 	kn->kn_data = sce->ra_wb_used;
1991 
1992 	return (1);
1993 }
1994 
1995 static int
1996 filt_ugenwrite_bulk(struct knote *kn, long hint)
1997 {
1998 	struct ugen_endpoint *sce = kn->kn_hook;
1999 
2000 	if (!(sce->state & UGEN_BULK_WB))
2001 		/*
2002 		 * We have no easy way of determining if a read will
2003 		 * yield any data or a write will happen.
2004 		 * So, emulate "seltrue".
2005 		 */
2006 		return (filt_seltrue(kn, hint));
2007 
2008 	if (sce->ra_wb_used == sce->limit - sce->ibuf)
2009 		return (0);
2010 
2011 	kn->kn_data = (sce->limit - sce->ibuf) - sce->ra_wb_used;
2012 
2013 	return (1);
2014 }
2015 #endif
2016 
2017 static const struct filterops ugenread_intr_filtops =
2018 	{ 1, NULL, filt_ugenrdetach, filt_ugenread_intr };
2019 
2020 static const struct filterops ugenread_isoc_filtops =
2021 	{ 1, NULL, filt_ugenrdetach, filt_ugenread_isoc };
2022 
2023 #ifdef UGEN_BULK_RA_WB
2024 static const struct filterops ugenread_bulk_filtops =
2025 	{ 1, NULL, filt_ugenrdetach, filt_ugenread_bulk };
2026 
2027 static const struct filterops ugenwrite_bulk_filtops =
2028 	{ 1, NULL, filt_ugenrdetach, filt_ugenwrite_bulk };
2029 #else
2030 static const struct filterops ugen_seltrue_filtops =
2031 	{ 1, NULL, filt_ugenrdetach, filt_seltrue };
2032 #endif
2033 
2034 int
2035 ugenkqfilter(dev_t dev, struct knote *kn)
2036 {
2037 	struct ugen_softc *sc;
2038 	struct ugen_endpoint *sce;
2039 	struct klist *klist;
2040 	int s;
2041 
2042 	USB_GET_SC(ugen, UGENUNIT(dev), sc);
2043 
2044 	if (sc->sc_dying)
2045 		return (1);
2046 
2047 	switch (kn->kn_filter) {
2048 	case EVFILT_READ:
2049 		sce = &sc->sc_endpoints[UGENENDPOINT(dev)][IN];
2050 		if (sce == NULL)
2051 			return (1);
2052 
2053 		klist = &sce->rsel.sel_klist;
2054 		switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
2055 		case UE_INTERRUPT:
2056 			kn->kn_fop = &ugenread_intr_filtops;
2057 			break;
2058 		case UE_ISOCHRONOUS:
2059 			kn->kn_fop = &ugenread_isoc_filtops;
2060 			break;
2061 		case UE_BULK:
2062 #ifdef UGEN_BULK_RA_WB
2063 			kn->kn_fop = &ugenread_bulk_filtops;
2064 			break;
2065 #else
2066 			/*
2067 			 * We have no easy way of determining if a read will
2068 			 * yield any data or a write will happen.
2069 			 * So, emulate "seltrue".
2070 			 */
2071 			kn->kn_fop = &ugen_seltrue_filtops;
2072 #endif
2073 			break;
2074 		default:
2075 			return (1);
2076 		}
2077 		break;
2078 
2079 	case EVFILT_WRITE:
2080 		sce = &sc->sc_endpoints[UGENENDPOINT(dev)][OUT];
2081 		if (sce == NULL)
2082 			return (1);
2083 
2084 		klist = &sce->rsel.sel_klist;
2085 		switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
2086 		case UE_INTERRUPT:
2087 		case UE_ISOCHRONOUS:
2088 			/* XXX poll doesn't support this */
2089 			return (1);
2090 
2091 		case UE_BULK:
2092 #ifdef UGEN_BULK_RA_WB
2093 			kn->kn_fop = &ugenwrite_bulk_filtops;
2094 #else
2095 			/*
2096 			 * We have no easy way of determining if a read will
2097 			 * yield any data or a write will happen.
2098 			 * So, emulate "seltrue".
2099 			 */
2100 			kn->kn_fop = &ugen_seltrue_filtops;
2101 #endif
2102 			break;
2103 		default:
2104 			return (1);
2105 		}
2106 		break;
2107 
2108 	default:
2109 		return (1);
2110 	}
2111 
2112 	kn->kn_hook = sce;
2113 
2114 	s = splusb();
2115 	SLIST_INSERT_HEAD(klist, kn, kn_selnext);
2116 	splx(s);
2117 
2118 	return (0);
2119 }
2120 
2121 #if defined(__FreeBSD__)
2122 DRIVER_MODULE(ugen, uhub, ugen_driver, ugen_devclass, usbd_driver_load, 0);
2123 #endif
2124