Lines Matching +full:bi +full:- +full:directional
3 /*-
4 * SPDX-License-Identifier: BSD-2-Clause
174 USETW(req.wIndex, sc->sc_iface_no); in ulpt_reset()
184 mtx_lock(&sc->sc_mtx); in ulpt_reset()
186 if (usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, in ulpt_reset()
189 if (usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, in ulpt_reset()
194 mtx_unlock(&sc->sc_mtx); in ulpt_reset()
201 struct usb_fifo *f = sc->sc_fifo_open[USB_FIFO_TX]; in ulpt_write_callback()
240 struct usb_fifo *f = sc->sc_fifo_open[USB_FIFO_RX]; in ulpt_read_callback()
257 if (sc->sc_zlps == 4) { in ulpt_read_callback()
261 sc->sc_zlps++; in ulpt_read_callback()
267 sc->sc_zlps = 0; in ulpt_read_callback()
284 sc->sc_zlps = 0; in ulpt_read_callback()
311 new_status = cur_status & ~sc->sc_last_status; in ulpt_status_callback()
312 sc->sc_last_status = cur_status; in ulpt_status_callback()
316 device_get_nameunit(sc->sc_dev)); in ulpt_status_callback()
319 device_get_nameunit(sc->sc_dev)); in ulpt_status_callback()
322 device_get_nameunit(sc->sc_dev)); in ulpt_status_callback()
329 req.wIndex[0] = sc->sc_iface_no; in ulpt_status_callback()
385 usbd_transfer_start(sc->sc_xfer[ULPT_BULK_DT_RD]); in ulpt_start_read()
393 usbd_transfer_stop(sc->sc_xfer[ULPT_BULK_DT_RD]); in ulpt_stop_read()
401 usbd_transfer_start(sc->sc_xfer[ULPT_BULK_DT_WR]); in ulpt_start_write()
409 usbd_transfer_stop(sc->sc_xfer[ULPT_BULK_DT_WR]); in ulpt_stop_write()
419 if (sc->sc_fflags == 0) { in ulpt_open()
432 if (sc->sc_fflags & fflags) { in unlpt_open()
437 mtx_lock(&sc->sc_mtx); in unlpt_open()
438 usbd_xfer_set_stall(sc->sc_xfer[ULPT_BULK_DT_RD]); in unlpt_open()
439 mtx_unlock(&sc->sc_mtx); in unlpt_open()
441 usbd_xfer_max_len(sc->sc_xfer[ULPT_BULK_DT_RD]), in unlpt_open()
446 sc->sc_fifo_open[USB_FIFO_RX] = fifo; in unlpt_open()
450 mtx_lock(&sc->sc_mtx); in unlpt_open()
451 usbd_xfer_set_stall(sc->sc_xfer[ULPT_BULK_DT_WR]); in unlpt_open()
452 mtx_unlock(&sc->sc_mtx); in unlpt_open()
454 usbd_xfer_max_len(sc->sc_xfer[ULPT_BULK_DT_WR]), in unlpt_open()
459 sc->sc_fifo_open[USB_FIFO_TX] = fifo; in unlpt_open()
461 sc->sc_fflags |= fflags & (FREAD | FWRITE); in unlpt_open()
470 sc->sc_fflags &= ~(fflags & (FREAD | FWRITE)); in ulpt_close()
485 /* Uni-directional USB printer */
490 /* Bi-directional USB printer */
516 if (uaa->usb_mode != USB_MODE_HOST) in ulpt_probe()
534 uint8_t iface_index = uaa->info.bIfaceIndex; in ulpt_attach()
539 sc->sc_dev = dev; in ulpt_attach()
540 sc->sc_udev = uaa->device; in ulpt_attach()
544 mtx_init(&sc->sc_mtx, "ulpt lock", NULL, MTX_DEF | MTX_RECURSE); in ulpt_attach()
546 usb_callout_init_mtx(&sc->sc_watchdog, &sc->sc_mtx, 0); in ulpt_attach()
550 id = usbd_get_interface_descriptor(uaa->iface); in ulpt_attach()
556 if ((id->bDescriptorType == UDESC_INTERFACE) && in ulpt_attach()
557 (id->bLength >= sizeof(*id))) { in ulpt_attach()
558 if (id->bInterfaceNumber != uaa->info.bIfaceNum) { in ulpt_attach()
562 if ((id->bInterfaceClass == UICLASS_PRINTER || in ulpt_attach()
563 id->bInterfaceClass == UICLASS_VENDOR) && in ulpt_attach()
564 (id->bInterfaceSubClass == UISUBCLASS_PRINTER || in ulpt_attach()
565 id->bInterfaceSubClass == UISUBCLASS_VENDOR) && in ulpt_attach()
566 (id->bInterfaceProtocol == UIPROTO_PRINTER_BI)) { in ulpt_attach()
572 usbd_get_config_descriptor(uaa->device), (void *)id); in ulpt_attach()
583 (uaa->device, iface_index, alt_index); in ulpt_attach()
591 sc->sc_iface_no = id->bInterfaceNumber; in ulpt_attach()
593 error = usbd_transfer_setup(uaa->device, &iface_index, in ulpt_attach()
594 sc->sc_xfer, ulpt_config, ULPT_N_TRANSFER, in ulpt_attach()
595 sc, &sc->sc_mtx); in ulpt_attach()
600 device_printf(sc->sc_dev, "using bi-directional mode\n"); in ulpt_attach()
615 USETW(req.wValue, cd->bConfigurationValue); in ulpt_attach()
616 USETW2(req.wIndex, id->bInterfaceNumber, id->bAlternateSetting); in ulpt_attach()
617 USETW(req.wLength, sizeof devinfo - 1); in ulpt_attach()
621 device_printf(sc->sc_dev, "cannot get device id\n"); in ulpt_attach()
623 device_printf(sc->sc_dev, "empty device id, no " in ulpt_attach()
626 /* devinfo now contains an IEEE-1284 device ID */ in ulpt_attach()
628 if (len > sizeof devinfo - 3) in ulpt_attach()
629 len = sizeof devinfo - 3; in ulpt_attach()
631 printf("%s: device id <", device_get_nameunit(sc->sc_dev)); in ulpt_attach()
638 error = usb_fifo_attach(uaa->device, sc, &sc->sc_mtx, in ulpt_attach()
639 &ulpt_fifo_methods, &sc->sc_fifo, in ulpt_attach()
640 unit, -1, uaa->info.bIfaceIndex, in ulpt_attach()
645 error = usb_fifo_attach(uaa->device, sc, &sc->sc_mtx, in ulpt_attach()
646 &unlpt_fifo_methods, &sc->sc_fifo_noreset, in ulpt_attach()
647 unit, -1, uaa->info.bIfaceIndex, in ulpt_attach()
654 mtx_lock(&sc->sc_mtx); in ulpt_attach()
656 mtx_unlock(&sc->sc_mtx); in ulpt_attach()
671 usb_fifo_detach(&sc->sc_fifo); in ulpt_detach()
672 usb_fifo_detach(&sc->sc_fifo_noreset); in ulpt_detach()
674 mtx_lock(&sc->sc_mtx); in ulpt_detach()
675 usb_callout_stop(&sc->sc_watchdog); in ulpt_detach()
676 mtx_unlock(&sc->sc_mtx); in ulpt_detach()
678 usbd_transfer_unsetup(sc->sc_xfer, ULPT_N_TRANSFER); in ulpt_detach()
679 usb_callout_drain(&sc->sc_watchdog); in ulpt_detach()
680 mtx_destroy(&sc->sc_mtx); in ulpt_detach()
716 for (p = str - 1; p; p = strchr(p, ';')) {
724 printf("%.*s", (int)(q - p + 1), p);
736 mtx_assert(&sc->sc_mtx, MA_OWNED); in ulpt_watchdog()
742 if (sc->sc_fflags == 0) in ulpt_watchdog()
743 usbd_transfer_start(sc->sc_xfer[ULPT_INTR_DT_RD]); in ulpt_watchdog()
745 usb_callout_reset(&sc->sc_watchdog, in ulpt_watchdog()