Home | History | Annotate | Download | only in usb

Lines Matching defs:sce

133 	struct ugen_endpoint *sce;
427 struct ugen_endpoint *sce;
429 sce = &sc->sc_endpoints[i][dir];
430 selinit(&sce->rsel);
431 cv_init(&sce->cv, "ugensce");
474 struct ugen_endpoint *sce = &sc->sc_endpoints[i][dir];
475 memset(sce, 0, UGEN_ENDPOINT_NONZERO_CRUFT);
487 struct ugen_endpoint *sce;
546 sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir];
550 sce->sc = sc;
551 sce->edesc = ed;
552 sce->iface = iface;
577 struct ugen_endpoint *sce;
610 sce = &sc->sc_endpoints[endpt][dir];
611 if (sce->edesc == NULL) {
623 sce = &sc->sc_endpoints[endpt][dir];
624 sce->state = 0;
625 sce->timeout = USBD_NO_TIMEOUT;
626 DPRINTFN(5, "sc=%jx, endpt=%jd, dir=%jd, sce=%#jx",
627 (uintptr_t)sc, endpt, dir, (uintptr_t)sce);
628 edesc = sce->edesc;
632 err = usbd_open_pipe(sce->iface,
633 edesc->bEndpointAddress, 0, &sce->pipeh);
645 sce->ibuf = kmem_alloc(isize, KM_SLEEP);
648 if (clalloc(&sce->q, UGEN_IBSIZE, 0) == -1) {
649 kmem_free(sce->ibuf, isize);
650 sce->ibuf = NULL;
654 err = usbd_open_pipe_intr(sce->iface,
656 USBD_SHORT_XFER_OK, &sce->pipeh, sce,
657 sce->ibuf, isize, ugenintr,
660 clfree(&sce->q);
661 kmem_free(sce->ibuf, isize);
662 sce->ibuf = NULL;
669 err = usbd_open_pipe(sce->iface,
670 edesc->bEndpointAddress, 0, &sce->pipeh);
675 sce->ra_wb_bufsize = UGEN_BULK_RA_WB_BUFSIZE;
680 sce->ra_wb_reqsize = UGEN_BBSIZE;
692 sce->ibuf = kmem_alloc(isize * UGEN_NISOFRAMES,
694 sce->cur = sce->fill = sce->ibuf;
695 sce->limit = sce->ibuf + isize * UGEN_NISOFRAMES;
698 err = usbd_open_pipe(sce->iface,
699 edesc->bEndpointAddress, 0, &sce->pipeh);
701 kmem_free(sce->ibuf, isize * UGEN_NISOFRAMES);
702 sce->ibuf = NULL;
707 sce->isoreqs[i].sce = sce;
708 err = usbd_create_xfer(sce->pipeh,
713 sce->isoreqs[i].xfer = xfer;
714 sce->isoreqs[i].dmabuf = usbd_get_buffer(xfer);
716 sce->isoreqs[i].sizes[j] = isize;
717 usbd_setup_isoc_xfer(xfer, &sce->isoreqs[i],
718 sce->isoreqs[i].sizes, UGEN_NISORFRMS, 0,
726 usbd_destroy_xfer(sce->isoreqs[i].xfer);
727 sce->isoreqs[i].xfer = NULL;
729 usbd_close_pipe(sce->pipeh);
730 sce->pipeh = NULL;
731 kmem_free(sce->ibuf, isize * UGEN_NISOFRAMES);
732 sce->ibuf = NULL;
736 sce->timeout = USBD_DEFAULT_TIMEOUT;
751 struct ugen_endpoint *sce;
771 sce = &sc->sc_endpoints[endpt][dir];
772 if (sce->pipeh == NULL)
774 DPRINTFN(5, "endpt=%jd dir=%jd sce=%jx",
775 endpt, dir, (uintptr_t)sce, 0);
777 usbd_abort_pipe(sce->pipeh);
779 int isize = UGETW(sce->edesc->wMaxPacketSize);
782 switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
784 ndflush(&sce->q, sce->q.c_cc);
785 clfree(&sce->q);
790 usbd_destroy_xfer(sce->isoreqs[i].xfer);
791 sce->isoreqs[i].xfer = NULL;
796 if (sce->state & (UGEN_BULK_RA | UGEN_BULK_WB)) {
797 usbd_destroy_xfer(sce->ra_wb_xfer);
798 sce->ra_wb_xfer = NULL;
799 msize = sce->ra_wb_bufsize;
805 usbd_close_pipe(sce->pipeh);
806 sce->pipeh = NULL;
807 if (sce->ibuf != NULL) {
808 kmem_free(sce->ibuf, msize);
809 sce->ibuf = NULL;
815 sce = &sc->sc_endpoints[endpt][dir];
816 KASSERT(sce->pipeh == NULL);
817 KASSERT(sce->ibuf == NULL);
818 KASSERT(sce->ra_wb_xfer == NULL);
820 KASSERT(sce->isoreqs[i].xfer == NULL);
851 struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][IN];
863 KASSERT(sce->edesc);
864 KASSERT(sce->pipeh);
866 switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
870 while (sce->q.c_cc == 0) {
875 DPRINTFN(5, "sleep on %jx", (uintptr_t)sce, 0, 0, 0);
877 error = cv_timedwait_sig(&sce->cv, &sc->sc_lock,
878 mstohz(sce->timeout));
889 while (sce->q.c_cc > 0 && uio->uio_resid > 0 && !error) {
890 n = uimin(sce->q.c_cc, uio->uio_resid);
895 q_to_b(&sce->q, sc->sc_buffer, n);
905 if (sce->state & UGEN_BULK_RA) {
907 uio->uio_resid, sce->ra_wb_used, 0, 0);
908 xfer = sce->ra_wb_xfer;
911 if (sce->ra_wb_used == 0 && flag & IO_NDELAY) {
916 while (sce->ra_wb_used == 0) {
918 (uintptr_t)sce, 0, 0, 0);
920 error = cv_timedwait_sig(&sce->cv,
921 &sc->sc_lock, mstohz(sce->timeout));
932 && sce->ra_wb_used > 0) {
934 sce->ra_wb_used);
935 n = uimin(n, sce->limit - sce->cur);
936 error = uiomove(sce->cur, n, uio);
939 sce->cur += n;
940 sce->ra_wb_used -= n;
941 if (sce->cur == sce->limit)
942 sce->cur = sce->ibuf;
949 if (sce->state & UGEN_RA_WB_STOP &&
950 sce->ra_wb_used < sce->limit - sce->ibuf) {
951 n = (sce->limit - sce->ibuf)
952 - sce->ra_wb_used;
953 usbd_setup_xfer(xfer, sce, NULL,
954 uimin(n, sce->ra_wb_xferlen),
957 sce->state &= ~UGEN_RA_WB_STOP;
966 sce->state |= UGEN_RA_WB_STOP;
972 error = usbd_create_xfer(sce->pipeh, UGEN_BBSIZE,
979 err = usbd_bulk_transfer(xfer, sce->pipeh,
980 sce->state & UGEN_SHORT_OK ? USBD_SHORT_XFER_OK : 0,
981 sce->timeout, sc->sc_buffer, &tn);
1000 while (sce->cur == sce->fill) {
1006 DPRINTFN(5, "sleep on %jx", (uintptr_t)sce, 0, 0, 0);
1007 error = cv_timedwait_sig(&sce->cv, &sc->sc_lock,
1008 mstohz(sce->timeout));
1016 while (sce->cur != sce->fill && uio->uio_resid > 0 && !error) {
1017 if(sce->fill > sce->cur)
1018 n = uimin(sce->fill - sce->cur, uio->uio_resid);
1020 n = uimin(sce->limit - sce->cur, uio->uio_resid);
1025 error = uiomove(sce->cur, n, uio);
1028 sce->cur += n;
1029 if (sce->cur >= sce->limit)
1030 sce->cur = sce->ibuf;
1061 struct ugen_endpoint *sce = &sc->sc_endpoints[endpt][OUT];
1076 KASSERT(sce->edesc);
1077 KASSERT(sce->pipeh);
1079 switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
1081 if (sce->state & UGEN_BULK_WB) {
1083 uio->uio_resid, sce->ra_wb_used, 0, 0);
1084 xfer = sce->ra_wb_xfer;
1087 if (sce->ra_wb_used == sce->limit - sce->ibuf &&
1093 while (sce->ra_wb_used ==
1094 sce->limit - sce->ibuf) {
1096 (uintptr_t)sce, 0, 0, 0);
1098 error = cv_timedwait_sig(&sce->cv,
1099 &sc->sc_lock, mstohz(sce->timeout));
1110 sce->ra_wb_used < sce->limit - sce->ibuf) {
1112 (sce->limit - sce->ibuf)
1113 - sce->ra_wb_used);
1114 n = uimin(n, sce->limit - sce->fill);
1115 error = uiomove(sce->fill, n, uio);
1118 sce->fill += n;
1119 sce->ra_wb_used += n;
1120 if (sce->fill == sce->limit)
1121 sce->fill = sce->ibuf;
1128 if (sce->state & UGEN_RA_WB_STOP &&
1129 sce->ra_wb_used > 0) {
1131 n = uimin(sce->ra_wb_used,
1132 sce->ra_wb_xferlen);
1133 tn = uimin(n, sce->limit - sce->cur);
1134 memcpy(dbuf, sce->cur, tn);
1137 memcpy(dbuf, sce->ibuf,
1139 usbd_setup_xfer(xfer, sce, NULL, n,
1142 sce->state &= ~UGEN_RA_WB_STOP;
1151 sce->state |= UGEN_RA_WB_STOP;
1157 error = usbd_create_xfer(sce->pipeh, UGEN_BBSIZE,
1166 err = usbd_bulk_transfer(xfer, sce->pipeh, 0, sce->timeout,
1181 error = usbd_create_xfer(sce->pipeh,
1182 UGETW(sce->edesc->wMaxPacketSize), 0, 0, &xfer);
1185 while ((n = uimin(UGETW(sce->edesc->wMaxPacketSize),
1191 err = usbd_intr_transfer(xfer, sce->pipeh, 0,
1192 sce->timeout, sc->sc_buffer, &n);
1244 struct ugen_endpoint *sce;
1278 sce = &sc->sc_endpoints[i][dir];
1279 if (sce->pipeh)
1280 usbd_abort_pipe(sce->pipeh);
1323 sce = &sc->sc_endpoints[i][dir];
1324 seldestroy(&sce->rsel);
1325 cv_destroy(&sce->cv);
1338 struct ugen_endpoint *sce = addr;
1339 struct ugen_softc *sc = sce->sc;
1352 usbd_clear_endpoint_stall_async(sce->pipeh);
1357 ibuf = sce->ibuf;
1365 (void)b_to_q(ibuf, count, &sce->q);
1366 cv_signal(&sce->cv);
1368 selnotify(&sce->rsel, 0, 0);
1376 struct ugen_endpoint *sce = req->sce;
1377 struct ugen_softc *sc = sce->sc;
1390 (intmax_t)(req - sce->isoreqs), count, 0, 0);
1395 if (sce->fill < sce->cur && sce->cur <= sce->fill + count) {
1396 sce->cur += count;
1397 if (sce->cur >= sce->limit)
1398 sce->cur = sce->ibuf + (sce->limit - sce->cur);
1403 isize = UGETW(sce->edesc->wMaxPacketSize);
1410 n = uimin(actlen, sce->limit - sce->fill);
1411 memcpy(sce->fill, tbuf, n);
1415 sce->fill += n;
1416 if (sce->fill == sce->limit)
1417 sce->fill = sce->ibuf;
1428 cv_signal(&sce->cv);
1430 selnotify(&sce->rsel, 0, 0);
1437 struct ugen_endpoint *sce = addr;
1438 struct ugen_softc *sc = sce->sc;
1452 sce->state |= UGEN_RA_WB_STOP;
1454 usbd_clear_endpoint_stall_async(sce->pipeh);
1463 sce->ra_wb_used += count;
1466 tbuf = (char const *)usbd_get_buffer(sce->ra_wb_xfer);
1467 n = uimin(count, sce->limit - sce->fill);
1468 memcpy(sce->fill, tbuf, n);
1471 sce->fill += n;
1472 if (sce->fill == sce->limit)
1473 sce->fill = sce->ibuf;
1475 memcpy(sce->fill, tbuf, count);
1476 sce->fill += count;
1480 n = (sce->limit - sce->ibuf) - sce->ra_wb_used;
1482 usbd_setup_xfer(xfer, sce, NULL, uimin(n, sce->ra_wb_xferlen), 0,
1491 sce->state |= UGEN_RA_WB_STOP;
1495 sce->state |= UGEN_RA_WB_STOP;
1497 cv_signal(&sce->cv);
1499 selnotify(&sce->rsel, 0, 0);
1506 struct ugen_endpoint *sce = addr;
1507 struct ugen_softc *sc = sce->sc;
1521 sce->state |= UGEN_RA_WB_STOP;
1523 usbd_clear_endpoint_stall_async(sce->pipeh);
1532 sce->ra_wb_used -= count;
1535 sce->cur += count;
1536 if (sce->cur >= sce->limit)
1537 sce->cur = sce->ibuf + (sce->cur - sce->limit);
1540 if (sce->ra_wb_used > 0) {
1542 tbuf = (char *)usbd_get_buffer(sce->ra_wb_xfer);
1543 count = uimin(sce->ra_wb_used, sce->ra_wb_xferlen);
1544 n = uimin(count, sce->limit - sce->cur);
1545 memcpy(tbuf, sce->cur, n);
1548 memcpy(tbuf, sce->ibuf, count - n);
1550 usbd_setup_xfer(xfer, sce, NULL, count, 0, USBD_NO_TIMEOUT,
1559 sce->state |= UGEN_RA_WB_STOP;
1563 sce->state |= UGEN_RA_WB_STOP;
1565 cv_signal(&sce->cv);
1567 selnotify(&sce->rsel, 0, 0);
1576 struct ugen_endpoint *sce;
1612 sce = &sc->sc_endpoints[UE_GET_ADDR(endpt)][dir];
1613 sce->sc = sc;
1614 sce->edesc = ed;
1615 sce->iface = iface;
1674 struct ugen_endpoint *sce;
1704 sce = &sc->sc_endpoints[endpt][IN];
1705 if (sce == NULL || sce->pipeh == NULL)
1708 sce->state |= UGEN_SHORT_OK;
1710 sce->state &= ~UGEN_SHORT_OK;
1712 (uintptr_t)sce->pipeh, sce->state & UGEN_SHORT_OK, 0, 0);
1716 sce = &sc->sc_endpoints[endpt][dir];
1717 if (sce == NULL)
1720 sce->timeout = *(int *)addr;
1722 (uintptr_t)sce->pipeh, dir, sce->timeout, 0);
1728 sce = &sc->sc_endpoints[endpt][IN];
1729 if (sce == NULL || sce->pipeh == NULL)
1731 edesc = sce->edesc;
1737 if (sce->state & UGEN_BULK_RA)
1739 KASSERT(sce->ra_wb_xfer == NULL);
1740 KASSERT(sce->ibuf == NULL);
1742 if (sce->ra_wb_bufsize == 0 || sce->ra_wb_reqsize == 0)
1745 error = usbd_create_xfer(sce->pipeh,
1746 sce->ra_wb_reqsize, 0, 0, &sce->ra_wb_xfer);
1749 sce->ra_wb_xferlen = sce->ra_wb_reqsize;
1750 sce->ibuf = kmem_alloc(sce->ra_wb_bufsize, KM_SLEEP);
1751 sce->fill = sce->cur = sce->ibuf;
1752 sce->limit = sce->ibuf + sce->ra_wb_bufsize;
1753 sce->ra_wb_used = 0;
1754 sce->state |= UGEN_BULK_RA;
1755 sce->state &= ~UGEN_RA_WB_STOP;
1757 usbd_setup_xfer(sce->ra_wb_xfer, sce, NULL,
1758 uimin(sce->ra_wb_xferlen, sce->ra_wb_bufsize),
1760 err = usbd_transfer(sce->ra_wb_xfer);
1762 sce->state &= ~UGEN_BULK_RA;
1763 kmem_free(sce->ibuf, sce->ra_wb_bufsize);
1764 sce->ibuf = NULL;
1765 usbd_destroy_xfer(sce->ra_wb_xfer);
1766 sce->ra_wb_xfer = NULL;
1771 if (!(sce->state & UGEN_BULK_RA))
1774 sce->state &= ~UGEN_BULK_RA;
1775 usbd_abort_pipe(sce->pipeh);
1776 usbd_destroy_xfer(sce->ra_wb_xfer);
1777 sce->ra_wb_xfer = NULL;
1783 kmem_free(sce->ibuf, sce->ra_wb_bufsize);
1784 sce->ibuf = NULL;
1790 sce = &sc->sc_endpoints[endpt][OUT];
1791 if (sce == NULL || sce->pipeh == NULL)
1793 edesc = sce->edesc;
1799 if (sce->state & UGEN_BULK_WB)
1801 KASSERT(sce->ra_wb_xfer == NULL);
1802 KASSERT(sce->ibuf == NULL);
1804 if (sce->ra_wb_bufsize == 0 || sce->ra_wb_reqsize == 0)
1807 error = usbd_create_xfer(sce->pipeh, sce->ra_wb_reqsize,
1808 0, 0, &sce->ra_wb_xfer);
1810 sce->ra_wb_xferlen = sce->ra_wb_reqsize;
1811 sce->ibuf = kmem_alloc(sce->ra_wb_bufsize, KM_SLEEP);
1812 sce->fill = sce->cur = sce->ibuf;
1813 sce->limit = sce->ibuf + sce->ra_wb_bufsize;
1814 sce->ra_wb_used = 0;
1815 sce->state |= UGEN_BULK_WB | UGEN_RA_WB_STOP;
1818 if (!(sce->state & UGEN_BULK_WB))
1821 sce->state &= ~UGEN_BULK_WB;
1827 usbd_abort_pipe(sce->pipeh);
1828 usbd_destroy_xfer(sce->ra_wb_xfer);
1829 sce->ra_wb_xfer = NULL;
1830 kmem_free(sce->ibuf, sce->ra_wb_bufsize);
1831 sce->ibuf = NULL;
1843 sce = &sc->sc_endpoints[endpt][IN];
1845 sce = &sc->sc_endpoints[endpt][OUT];
1846 if (sce == NULL || sce->pipeh == NULL)
1858 sce->ra_wb_bufsize = opt->ra_wb_buffer_size;
1859 sce->ra_wb_reqsize = opt->ra_wb_request_size;
2057 sce = &sc->sc_endpoints[endpt][IN];
2059 ptr, ur->ucr_flags, &ur->ucr_actlen, sce->timeout);
2203 struct ugen_endpoint *sce = kn->kn_hook;
2204 struct ugen_softc *sc = sce->sc;
2207 selremove_knote(&sce->rsel, kn);
2214 struct ugen_endpoint *sce = kn->kn_hook;
2215 struct ugen_softc *sc = sce->sc;
2222 kn->kn_data = sce->q.c_cc;
2233 struct ugen_endpoint *sce = kn->kn_hook;
2234 struct ugen_softc *sc = sce->sc;
2240 } else if (sce->cur == sce->fill) {
2242 } else if (sce->cur < sce->fill) {
2243 kn->kn_data = sce->fill - sce->cur;
2246 kn->kn_data = (sce->limit - sce->cur) +
2247 (sce->fill - sce->ibuf);
2258 struct ugen_endpoint *sce = kn->kn_hook;
2259 struct ugen_softc *sc = sce->sc;
2265 } else if (!(sce->state & UGEN_BULK_RA)) {
2272 } else if (sce->ra_wb_used == 0) {
2275 kn->kn_data = sce->ra_wb_used;
2286 struct ugen_endpoint *sce = kn->kn_hook;
2287 struct ugen_softc *sc = sce->sc;
2293 } else if (!(sce->state & UGEN_BULK_WB)) {
2300 } else if (sce->ra_wb_used == sce->limit - sce->ibuf) {
2303 kn->kn_data = (sce->limit - sce->ibuf) - sce->ra_wb_used;
2343 struct ugen_endpoint *sce;
2357 sce = &sc->sc_endpoints[UGENENDPOINT(dev)][IN];
2358 if (sce == NULL) {
2363 sip = &sce->rsel;
2364 switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
2381 sce = &sc->sc_endpoints[UGENENDPOINT(dev)][OUT];
2382 if (sce == NULL) {
2387 sip = &sce->rsel;
2388 switch (sce->edesc->bmAttributes & UE_XFERTYPE) {
2409 kn->kn_hook = sce;