static void sunos_async_callback(union sigval arg) { struct sunos_transfer_priv *tpriv = (struct sunos_transfer_priv *)arg.sival_ptr; struct libusb_transfer *xfer = tpriv->transfer; struct aiocb *aiocb = &tpriv->aiocb; int ret; sunos_dev_handle_priv_t *hpriv; uint8_t ep; hpriv = (sunos_dev_handle_priv_t *)xfer->dev_handle->os_priv; ep = sunos_usb_ep_index(xfer->endpoint); ret = aio_error(aiocb); if (ret != 0) { xfer->status = sunos_usb_get_status(hpriv->eps[ep].statfd); } else { xfer->actual_length = LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)->transferred = aio_return(aiocb); } usb_dump_data(xfer->buffer, xfer->actual_length); usbi_dbg("ret=%d, len=%d, actual_len=%d", ret, xfer->length, xfer->actual_length); /* async notification */ usbi_signal_transfer_completion(LIBUSB_TRANSFER_TO_USBI_TRANSFER(xfer)); }
int netbsd_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); usbi_signal_transfer_completion(itransfer); return (LIBUSB_SUCCESS); }