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