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