Lines Matching +full:fifo +full:- +full:size

7 /*-
8 * SPDX-License-Identifier: BSD-2-Clause
91 #define UHID_BSIZE 1024 /* bytes, buffer size */
175 if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc, in uhid_intr_write_callback()
211 if ((actlen >= (int)sc->sc_isize) || in uhid_intr_read_callback()
212 ((actlen > 0) && (sc->sc_iid != 0))) { in uhid_intr_read_callback()
214 if (actlen > (int)sc->sc_isize) in uhid_intr_read_callback()
215 actlen = sc->sc_isize; in uhid_intr_read_callback()
216 usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc, in uhid_intr_read_callback()
220 * Do not do read-ahead, because this may lead in uhid_intr_read_callback()
232 sc->sc_fifo.fp[USB_FIFO_RX]) != 0) { in uhid_intr_read_callback()
233 usbd_xfer_set_frame_len(xfer, 0, sc->sc_isize); in uhid_intr_read_callback()
250 uint8_t type, uint8_t id, uint16_t size) in uhid_fill_set_report() argument
252 req->bmRequestType = UT_WRITE_CLASS_INTERFACE; in uhid_fill_set_report()
253 req->bRequest = UR_SET_REPORT; in uhid_fill_set_report()
254 USETW2(req->wValue, type, id); in uhid_fill_set_report()
255 req->wIndex[0] = iface_no; in uhid_fill_set_report()
256 req->wIndex[1] = 0; in uhid_fill_set_report()
257 USETW(req->wLength, size); in uhid_fill_set_report()
262 uint8_t type, uint8_t id, uint16_t size) in uhid_fill_get_report() argument
264 req->bmRequestType = UT_READ_CLASS_INTERFACE; in uhid_fill_get_report()
265 req->bRequest = UR_GET_REPORT; in uhid_fill_get_report()
266 USETW2(req->wValue, type, id); in uhid_fill_get_report()
267 req->wIndex[0] = iface_no; in uhid_fill_get_report()
268 req->wIndex[1] = 0; in uhid_fill_get_report()
269 USETW(req->wLength, size); in uhid_fill_get_report()
278 uint32_t size = sc->sc_osize; in uhid_write_callback() local
286 if (sc->sc_oid) { in uhid_write_callback()
288 if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc, in uhid_write_callback()
298 if (size) { in uhid_write_callback()
299 size--; in uhid_write_callback()
306 if (usb_fifo_get_data(sc->sc_fifo.fp[USB_FIFO_TX], pc, in uhid_write_callback()
308 if (actlen != size) { in uhid_write_callback()
312 (&req, sc->sc_iface_no, in uhid_write_callback()
313 UHID_OUTPUT_REPORT, id, size); in uhid_write_callback()
319 usbd_xfer_set_frame_len(xfer, 1, size); in uhid_write_callback()
320 usbd_xfer_set_frames(xfer, size ? 2 : 1); in uhid_write_callback()
328 usb_fifo_get_data_error(sc->sc_fifo.fp[USB_FIFO_TX]); in uhid_write_callback()
344 usb_fifo_put_data(sc->sc_fifo.fp[USB_FIFO_RX], pc, sizeof(req), in uhid_read_callback()
345 sc->sc_isize, 1); in uhid_read_callback()
350 if (usb_fifo_put_bytes_max(sc->sc_fifo.fp[USB_FIFO_RX]) > 0) { in uhid_read_callback()
352 (&req, sc->sc_iface_no, UHID_INPUT_REPORT, in uhid_read_callback()
353 sc->sc_iid, sc->sc_isize); in uhid_read_callback()
358 usbd_xfer_set_frame_len(xfer, 1, sc->sc_isize); in uhid_read_callback()
359 usbd_xfer_set_frames(xfer, sc->sc_isize ? 2 : 1); in uhid_read_callback()
366 usb_fifo_put_data_error(sc->sc_fifo.fp[USB_FIFO_RX]); in uhid_read_callback()
410 uhid_start_read(struct usb_fifo *fifo) in uhid_start_read() argument
412 struct uhid_softc *sc = usb_fifo_softc(fifo); in uhid_start_read()
414 if (sc->sc_flags & UHID_FLAG_IMMED) { in uhid_start_read()
415 usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_RD]); in uhid_start_read()
417 usbd_transfer_start(sc->sc_xfer[UHID_INTR_DT_RD]); in uhid_start_read()
422 uhid_stop_read(struct usb_fifo *fifo) in uhid_stop_read() argument
424 struct uhid_softc *sc = usb_fifo_softc(fifo); in uhid_stop_read()
426 usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_RD]); in uhid_stop_read()
427 usbd_transfer_stop(sc->sc_xfer[UHID_INTR_DT_RD]); in uhid_stop_read()
431 uhid_start_write(struct usb_fifo *fifo) in uhid_start_write() argument
433 struct uhid_softc *sc = usb_fifo_softc(fifo); in uhid_start_write()
435 if ((sc->sc_flags & UHID_FLAG_IMMED) || in uhid_start_write()
436 sc->sc_xfer[UHID_INTR_DT_WR] == NULL) { in uhid_start_write()
437 usbd_transfer_start(sc->sc_xfer[UHID_CTRL_DT_WR]); in uhid_start_write()
439 usbd_transfer_start(sc->sc_xfer[UHID_INTR_DT_WR]); in uhid_start_write()
444 uhid_stop_write(struct usb_fifo *fifo) in uhid_stop_write() argument
446 struct uhid_softc *sc = usb_fifo_softc(fifo); in uhid_stop_write()
448 usbd_transfer_stop(sc->sc_xfer[UHID_CTRL_DT_WR]); in uhid_stop_write()
449 usbd_transfer_stop(sc->sc_xfer[UHID_INTR_DT_WR]); in uhid_stop_write()
464 err = usbd_req_get_report(sc->sc_udev, NULL, kern_data, in uhid_get_report()
465 len, sc->sc_iface_index, type, id); in uhid_get_report()
500 err = usbd_req_set_report(sc->sc_udev, NULL, kern_data, in uhid_set_report()
501 len, sc->sc_iface_index, type, id); in uhid_set_report()
514 uhid_open(struct usb_fifo *fifo, int fflags) in uhid_open() argument
516 struct uhid_softc *sc = usb_fifo_softc(fifo); in uhid_open()
524 mtx_lock(&sc->sc_mtx); in uhid_open()
525 sc->sc_flags &= ~UHID_FLAG_IMMED; in uhid_open()
526 mtx_unlock(&sc->sc_mtx); in uhid_open()
528 if (usb_fifo_alloc_buffer(fifo, in uhid_open()
529 sc->sc_isize + 1, UHID_FRAME_NUM)) { in uhid_open()
534 if (usb_fifo_alloc_buffer(fifo, in uhid_open()
535 sc->sc_osize + 1, UHID_FRAME_NUM)) { in uhid_open()
543 uhid_close(struct usb_fifo *fifo, int fflags) in uhid_close() argument
546 usb_fifo_free_buffer(fifo); in uhid_close()
551 uhid_ioctl(struct usb_fifo *fifo, u_long cmd, void *addr, in uhid_ioctl() argument
554 struct uhid_softc *sc = usb_fifo_softc(fifo); in uhid_ioctl()
560 uint32_t size; in uhid_ioctl() local
580 if (sc->sc_repdesc_size > ugd->ugd_maxlen) { in uhid_ioctl()
581 size = ugd->ugd_maxlen; in uhid_ioctl()
583 size = sc->sc_repdesc_size; in uhid_ioctl()
585 ugd->ugd_actlen = size; in uhid_ioctl()
586 if (ugd->ugd_data == NULL) in uhid_ioctl()
588 error = copyout(sc->sc_repdesc_ptr, ugd->ugd_data, size); in uhid_ioctl()
600 sc->sc_iid, NULL, NULL, sc->sc_isize); in uhid_ioctl()
604 mtx_lock(&sc->sc_mtx); in uhid_ioctl()
605 sc->sc_flags |= UHID_FLAG_IMMED; in uhid_ioctl()
606 mtx_unlock(&sc->sc_mtx); in uhid_ioctl()
608 mtx_lock(&sc->sc_mtx); in uhid_ioctl()
609 sc->sc_flags &= ~UHID_FLAG_IMMED; in uhid_ioctl()
610 mtx_unlock(&sc->sc_mtx); in uhid_ioctl()
619 switch (ugd->ugd_report_type) { in uhid_ioctl()
621 size = sc->sc_isize; in uhid_ioctl()
622 id = sc->sc_iid; in uhid_ioctl()
625 size = sc->sc_osize; in uhid_ioctl()
626 id = sc->sc_oid; in uhid_ioctl()
629 size = sc->sc_fsize; in uhid_ioctl()
630 id = sc->sc_fid; in uhid_ioctl()
635 size = imin(ugd->ugd_maxlen, size); in uhid_ioctl()
637 error = copyin(ugd->ugd_data, &id, 1); in uhid_ioctl()
639 error = uhid_get_report(sc, ugd->ugd_report_type, id, in uhid_ioctl()
640 NULL, ugd->ugd_data, size); in uhid_ioctl()
641 ugd->ugd_actlen = size; in uhid_ioctl()
649 switch (ugd->ugd_report_type) { in uhid_ioctl()
651 size = sc->sc_isize; in uhid_ioctl()
652 id = sc->sc_iid; in uhid_ioctl()
655 size = sc->sc_osize; in uhid_ioctl()
656 id = sc->sc_oid; in uhid_ioctl()
659 size = sc->sc_fsize; in uhid_ioctl()
660 id = sc->sc_fid; in uhid_ioctl()
666 error = copyin(ugd->ugd_data, &id, 1); in uhid_ioctl()
668 error = uhid_set_report(sc, ugd->ugd_report_type, id, in uhid_ioctl()
669 NULL, ugd->ugd_data, imin(ugd->ugd_maxlen, size)); in uhid_ioctl()
688 uhid_ioctl_post(struct usb_fifo *fifo, u_long cmd, void *addr, in uhid_ioctl_post() argument
695 error = ugen_fill_deviceinfo(fifo, addr); in uhid_ioctl_post()
724 if (uaa->usb_mode != USB_MODE_HOST) in uhid_probe()
739 if ((uaa->info.bInterfaceClass == UICLASS_HID) && in uhid_probe()
740 (uaa->info.bInterfaceSubClass == UISUBCLASS_BOOT) && in uhid_probe()
741 (((uaa->info.bInterfaceProtocol == UIPROTO_BOOT_KEYBOARD) && in uhid_probe()
743 ((uaa->info.bInterfaceProtocol == UIPROTO_MOUSE) && in uhid_probe()
749 error = usbd_req_get_hid_desc(uaa->device, NULL, in uhid_probe()
750 &buf, &len, M_USBDEV, uaa->info.bIfaceIndex); in uhid_probe()
751 /* Let HID decscriptor-less devices to be handled at attach */ in uhid_probe()
781 mtx_init(&sc->sc_mtx, "uhid lock", NULL, MTX_DEF | MTX_RECURSE); in uhid_attach()
783 sc->sc_udev = uaa->device; in uhid_attach()
785 sc->sc_iface_no = uaa->info.bIfaceNum; in uhid_attach()
786 sc->sc_iface_index = uaa->info.bIfaceIndex; in uhid_attach()
788 error = usbd_transfer_setup(uaa->device, in uhid_attach()
789 &uaa->info.bIfaceIndex, sc->sc_xfer, uhid_config, in uhid_attach()
790 UHID_N_TRANSFER, sc, &sc->sc_mtx); in uhid_attach()
796 if (uaa->info.idVendor == USB_VENDOR_WACOM) { in uhid_attach()
799 if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE) { in uhid_attach()
800 sc->sc_repdesc_size = sizeof(uhid_graphire_report_descr); in uhid_attach()
801 sc->sc_repdesc_ptr = __DECONST(void *, &uhid_graphire_report_descr); in uhid_attach()
802 sc->sc_flags |= UHID_FLAG_STATIC_DESC; in uhid_attach()
804 } else if (uaa->info.idProduct == USB_PRODUCT_WACOM_GRAPHIRE3_4X5) { in uhid_attach()
812 error = usbd_req_set_report(uaa->device, NULL, in uhid_attach()
814 uaa->info.bIfaceIndex, UHID_FEATURE_REPORT, 2); in uhid_attach()
820 sc->sc_repdesc_size = sizeof(uhid_graphire3_4x5_report_descr); in uhid_attach()
821 sc->sc_repdesc_ptr = __DECONST(void *, &uhid_graphire3_4x5_report_descr); in uhid_attach()
822 sc->sc_flags |= UHID_FLAG_STATIC_DESC; in uhid_attach()
824 } else if ((uaa->info.bInterfaceClass == UICLASS_VENDOR) && in uhid_attach()
825 (uaa->info.bInterfaceSubClass == UISUBCLASS_XBOX360_CONTROLLER) && in uhid_attach()
826 (uaa->info.bInterfaceProtocol == UIPROTO_XBOX360_GAMEPAD)) { in uhid_attach()
832 error = usbd_req_set_report(uaa->device, NULL, in uhid_attach()
834 uaa->info.bIfaceIndex, UHID_OUTPUT_REPORT, 0); in uhid_attach()
840 sc->sc_repdesc_size = sizeof(uhid_xb360gp_report_descr); in uhid_attach()
841 sc->sc_repdesc_ptr = __DECONST(void *, &uhid_xb360gp_report_descr); in uhid_attach()
842 sc->sc_flags |= UHID_FLAG_STATIC_DESC; in uhid_attach()
844 if (sc->sc_repdesc_ptr == NULL) { in uhid_attach()
845 error = usbd_req_get_hid_desc(uaa->device, NULL, in uhid_attach()
846 &sc->sc_repdesc_ptr, &sc->sc_repdesc_size, in uhid_attach()
847 M_USBDEV, uaa->info.bIfaceIndex); in uhid_attach()
854 error = usbd_req_set_idle(uaa->device, NULL, in uhid_attach()
855 uaa->info.bIfaceIndex, 0, 0); in uhid_attach()
861 sc->sc_isize = hid_report_size_max in uhid_attach()
862 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_input, &sc->sc_iid); in uhid_attach()
864 sc->sc_osize = hid_report_size_max in uhid_attach()
865 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_output, &sc->sc_oid); in uhid_attach()
867 sc->sc_fsize = hid_report_size_max in uhid_attach()
868 (sc->sc_repdesc_ptr, sc->sc_repdesc_size, hid_feature, &sc->sc_fid); in uhid_attach()
870 if (sc->sc_isize > UHID_BSIZE) { in uhid_attach()
871 DPRINTF("input size is too large, " in uhid_attach()
873 sc->sc_isize); in uhid_attach()
874 sc->sc_isize = UHID_BSIZE; in uhid_attach()
876 if (sc->sc_osize > UHID_BSIZE) { in uhid_attach()
877 DPRINTF("output size is too large, " in uhid_attach()
879 sc->sc_osize); in uhid_attach()
880 sc->sc_osize = UHID_BSIZE; in uhid_attach()
882 if (sc->sc_fsize > UHID_BSIZE) { in uhid_attach()
883 DPRINTF("feature size is too large, " in uhid_attach()
885 sc->sc_fsize); in uhid_attach()
886 sc->sc_fsize = UHID_BSIZE; in uhid_attach()
889 error = usb_fifo_attach(uaa->device, sc, &sc->sc_mtx, in uhid_attach()
890 &uhid_fifo_methods, &sc->sc_fifo, in uhid_attach()
891 unit, -1, uaa->info.bIfaceIndex, in uhid_attach()
908 usb_fifo_detach(&sc->sc_fifo); in uhid_detach()
910 usbd_transfer_unsetup(sc->sc_xfer, UHID_N_TRANSFER); in uhid_detach()
912 if (sc->sc_repdesc_ptr) { in uhid_detach()
913 if (!(sc->sc_flags & UHID_FLAG_STATIC_DESC)) { in uhid_detach()
914 free(sc->sc_repdesc_ptr, M_USBDEV); in uhid_detach()
917 mtx_destroy(&sc->sc_mtx); in uhid_detach()
937 .size = sizeof(struct uhid_softc),