int obsd_submit_transfer(struct usbi_transfer *itransfer) { struct libusb_transfer *transfer; struct handle_priv *hpriv; int err = 0; usbi_dbg(""); transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); hpriv = (struct handle_priv *)transfer->dev_handle->os_priv; switch (transfer->type) { case LIBUSB_TRANSFER_TYPE_CONTROL: err = _sync_control_transfer(itransfer); break; case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: if (IS_XFEROUT(transfer)) { /* Isochronous write is not supported */ err = LIBUSB_ERROR_NOT_SUPPORTED; break; } err = _sync_gen_transfer(itransfer); break; case LIBUSB_TRANSFER_TYPE_BULK: case LIBUSB_TRANSFER_TYPE_INTERRUPT: if (IS_XFEROUT(transfer) && transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET) { err = LIBUSB_ERROR_NOT_SUPPORTED; break; } err = _sync_gen_transfer(itransfer); break; case LIBUSB_TRANSFER_TYPE_BULK_STREAM: err = LIBUSB_ERROR_NOT_SUPPORTED; break; } if (err) return (err); if (write(hpriv->pipe[1], &itransfer, sizeof(itransfer)) < 0) return _errno_to_libusb(errno); return (LIBUSB_SUCCESS); }
static int usbdk_submit_transfer(struct usbi_transfer *itransfer) { struct libusb_transfer *transfer = USBI_TRANSFER_TO_LIBUSB_TRANSFER(itransfer); switch (transfer->type) { case LIBUSB_TRANSFER_TYPE_CONTROL: return usbdk_do_control_transfer(itransfer); case LIBUSB_TRANSFER_TYPE_BULK: case LIBUSB_TRANSFER_TYPE_INTERRUPT: if (IS_XFEROUT(transfer) && (transfer->flags & LIBUSB_TRANSFER_ADD_ZERO_PACKET)) return LIBUSB_ERROR_NOT_SUPPORTED; //TODO: Check whether we can support this in UsbDk else return usbdk_do_bulk_transfer(itransfer); case LIBUSB_TRANSFER_TYPE_ISOCHRONOUS: return usbdk_do_iso_transfer(itransfer); default: usbi_err(TRANSFER_CTX(transfer), "unknown endpoint type %d", transfer->type); return LIBUSB_ERROR_INVALID_PARAM; } }