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