Lines Matching +full:fifo +full:- +full:size
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
73 SNES_DEV(0x0810, 0xe501, 0), /* GeeekPi K-0161 */
169 err = usbd_req_get_report(sc->sc_udev, NULL, kern_data, in uhid_get_report()
170 len, sc->sc_iface_index, type, id); in uhid_get_report()
204 err = usbd_req_set_report(sc->sc_udev, NULL, kern_data, in uhid_set_report()
205 len, sc->sc_iface_index, type, id); in uhid_set_report()
218 uhid_snes_open(struct usb_fifo *fifo, int fflags) in uhid_snes_open() argument
220 struct uhid_snes_softc *sc = usb_fifo_softc(fifo); in uhid_snes_open()
223 if (sc->sc_fflags & fflags) { in uhid_snes_open()
228 mtx_lock(&sc->sc_mutex); in uhid_snes_open()
229 usbd_xfer_set_stall(sc->sc_transfer[UHID_SNES_INTR_DT_RD]); in uhid_snes_open()
230 mtx_unlock(&sc->sc_mutex); in uhid_snes_open()
232 error = usb_fifo_alloc_buffer(fifo, in uhid_snes_open()
233 usbd_xfer_max_len(sc->sc_transfer[UHID_SNES_INTR_DT_RD]), in uhid_snes_open()
238 sc->sc_fifo_open[USB_FIFO_RX] = fifo; in uhid_snes_open()
251 USETW(req.wIndex, sc->sc_iface_num); in uhid_snes_reset()
254 mtx_lock(&sc->sc_mutex); in uhid_snes_reset()
256 error = usbd_do_request_flags(sc->sc_usb_device, &sc->sc_mutex, in uhid_snes_reset()
260 usbd_do_request_flags(sc->sc_usb_device, &sc->sc_mutex, in uhid_snes_reset()
264 mtx_unlock(&sc->sc_mutex); in uhid_snes_reset()
268 uhid_snes_close(struct usb_fifo *fifo, int fflags) in uhid_snes_close() argument
270 struct uhid_snes_softc *sc = usb_fifo_softc(fifo); in uhid_snes_close()
272 sc->sc_fflags &= ~(fflags & FREAD); in uhid_snes_close()
273 usb_fifo_free_buffer(fifo); in uhid_snes_close()
277 uhid_snes_ioctl(struct usb_fifo *fifo, u_long cmd, void *data, int fflags) in uhid_snes_ioctl() argument
279 struct uhid_snes_softc *sc = usb_fifo_softc(fifo); in uhid_snes_ioctl()
285 uint32_t size; in uhid_snes_ioctl() local
305 if (sc->sc_repdesc_size > ugd->ugd_maxlen) { in uhid_snes_ioctl()
306 size = ugd->ugd_maxlen; in uhid_snes_ioctl()
308 size = sc->sc_repdesc_size; in uhid_snes_ioctl()
311 ugd->ugd_actlen = size; in uhid_snes_ioctl()
312 if (ugd->ugd_data == NULL) in uhid_snes_ioctl()
314 error = copyout(sc->sc_repdesc_ptr, ugd->ugd_data, size); in uhid_snes_ioctl()
326 sc->sc_iid, NULL, NULL, sc->sc_isize); in uhid_snes_ioctl()
330 mtx_lock(&sc->sc_mutex); in uhid_snes_ioctl()
331 sc->sc_fflags |= UHID_FLAG_IMMED; in uhid_snes_ioctl()
332 mtx_unlock(&sc->sc_mutex); in uhid_snes_ioctl()
334 mtx_lock(&sc->sc_mutex); in uhid_snes_ioctl()
335 sc->sc_fflags &= ~UHID_FLAG_IMMED; in uhid_snes_ioctl()
336 mtx_unlock(&sc->sc_mutex); in uhid_snes_ioctl()
345 switch (ugd->ugd_report_type) { in uhid_snes_ioctl()
347 size = sc->sc_isize; in uhid_snes_ioctl()
348 id = sc->sc_iid; in uhid_snes_ioctl()
351 size = sc->sc_osize; in uhid_snes_ioctl()
352 id = sc->sc_oid; in uhid_snes_ioctl()
355 size = sc->sc_fsize; in uhid_snes_ioctl()
356 id = sc->sc_fid; in uhid_snes_ioctl()
362 error = copyin(ugd->ugd_data, &id, 1); in uhid_snes_ioctl()
364 error = uhid_get_report(sc, ugd->ugd_report_type, id, in uhid_snes_ioctl()
365 NULL, ugd->ugd_data, imin(ugd->ugd_maxlen, size)); in uhid_snes_ioctl()
373 switch (ugd->ugd_report_type) { in uhid_snes_ioctl()
375 size = sc->sc_isize; in uhid_snes_ioctl()
376 id = sc->sc_iid; in uhid_snes_ioctl()
379 size = sc->sc_osize; in uhid_snes_ioctl()
380 id = sc->sc_oid; in uhid_snes_ioctl()
383 size = sc->sc_fsize; in uhid_snes_ioctl()
384 id = sc->sc_fid; in uhid_snes_ioctl()
390 error = copyin(ugd->ugd_data, &id, 1); in uhid_snes_ioctl()
392 error = uhid_set_report(sc, ugd->ugd_report_type, id, in uhid_snes_ioctl()
393 NULL, ugd->ugd_data, imin(ugd->ugd_maxlen, size)); in uhid_snes_ioctl()
418 mtx_assert(&sc->sc_mutex, MA_OWNED); in uhid_snes_watchdog()
420 if (sc->sc_fflags == 0) in uhid_snes_watchdog()
421 usbd_transfer_start(sc->sc_transfer[UHID_SNES_STATUS_DT_RD]); in uhid_snes_watchdog()
423 usb_callout_reset(&sc->sc_watchdog, hz, &uhid_snes_watchdog, sc); in uhid_snes_watchdog()
427 uhid_snes_start_read(struct usb_fifo *fifo) in uhid_snes_start_read() argument
429 struct uhid_snes_softc *sc = usb_fifo_softc(fifo); in uhid_snes_start_read()
431 usbd_transfer_start(sc->sc_transfer[UHID_SNES_INTR_DT_RD]); in uhid_snes_start_read()
435 uhid_snes_stop_read(struct usb_fifo *fifo) in uhid_snes_stop_read() argument
437 struct uhid_snes_softc *sc = usb_fifo_softc(fifo); in uhid_snes_stop_read()
439 usbd_transfer_stop(sc->sc_transfer[UHID_SNES_INTR_DT_RD]); in uhid_snes_stop_read()
446 struct usb_fifo *fifo = sc->sc_fifo_open[USB_FIFO_RX]; in uhid_snes_read_callback() local
451 if (fifo == NULL) in uhid_snes_read_callback()
457 if (sc->sc_zero_length_packets == 4) in uhid_snes_read_callback()
461 sc->sc_zero_length_packets++; in uhid_snes_read_callback()
466 sc->sc_zero_length_packets = 0; in uhid_snes_read_callback()
469 usb_fifo_put_data(fifo, pc, 0, actual, 1); in uhid_snes_read_callback()
473 if (usb_fifo_put_bytes_max(fifo) != 0) { in uhid_snes_read_callback()
483 sc->sc_zero_length_packets = 0; in uhid_snes_read_callback()
486 /* Issue a clear-stall request. */ in uhid_snes_read_callback()
506 req.wIndex[0] = sc->sc_iface_num; in uhid_snes_status_callback()
529 if (uaa->usb_mode != USB_MODE_HOST) in uhid_snes_probe()
542 uint8_t alt_index, iface_index = uaa->info.bIfaceIndex; in uhid_snes_attach()
545 sc->sc_dev = dev; in uhid_snes_attach()
546 sc->sc_usb_device = uaa->device; in uhid_snes_attach()
548 mtx_init(&sc->sc_mutex, "uhid_snes", NULL, MTX_DEF | MTX_RECURSE); in uhid_snes_attach()
549 usb_callout_init_mtx(&sc->sc_watchdog, &sc->sc_mutex, 0); in uhid_snes_attach()
551 idesc = usbd_get_interface_descriptor(uaa->iface); in uhid_snes_attach()
552 alt_index = -1; in uhid_snes_attach()
557 if ((idesc->bDescriptorType == UDESC_INTERFACE) && in uhid_snes_attach()
558 (idesc->bLength >= sizeof(*idesc))) { in uhid_snes_attach()
559 if (idesc->bInterfaceNumber != uaa->info.bIfaceNum) { in uhid_snes_attach()
563 if (idesc->bInterfaceClass == UICLASS_HID) in uhid_snes_attach()
568 cdesc = usbd_get_config_descriptor(uaa->device); in uhid_snes_attach()
576 error = usbd_set_alt_interface_index(uaa->device, iface_index, alt_index); in uhid_snes_attach()
581 sc->sc_iface_num = idesc->bInterfaceNumber; in uhid_snes_attach()
583 error = usbd_transfer_setup(uaa->device, &iface_index, in uhid_snes_attach()
584 sc->sc_transfer, uhid_snes_config, UHID_SNES_N_TRANSFER, sc, in uhid_snes_attach()
585 &sc->sc_mutex); in uhid_snes_attach()
590 error = usb_fifo_attach(uaa->device, sc, &sc->sc_mutex, in uhid_snes_attach()
591 &uhid_snes_fifo_methods, &sc->sc_fifo, unit, -1, in uhid_snes_attach()
593 sc->sc_repdesc_size = sizeof(uhid_snes_report_descr); in uhid_snes_attach()
594 sc->sc_repdesc_ptr = __DECONST(void*, &uhid_snes_report_descr); in uhid_snes_attach()
599 mtx_lock(&sc->sc_mutex); in uhid_snes_attach()
601 mtx_unlock(&sc->sc_mutex); in uhid_snes_attach()
614 usb_fifo_detach(&sc->sc_fifo); in uhid_snes_detach()
615 usb_fifo_detach(&sc->sc_fifo_no_reset); in uhid_snes_detach()
617 mtx_lock(&sc->sc_mutex); in uhid_snes_detach()
618 usb_callout_stop(&sc->sc_watchdog); in uhid_snes_detach()
619 mtx_unlock(&sc->sc_mutex); in uhid_snes_detach()
621 usbd_transfer_unsetup(sc->sc_transfer, UHID_SNES_N_TRANSFER); in uhid_snes_detach()
622 usb_callout_drain(&sc->sc_watchdog); in uhid_snes_detach()
623 mtx_destroy(&sc->sc_mutex); in uhid_snes_detach()