From eed0afcd0426824598770c46b3cc44ebe7d92748 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 19 Oct 2013 13:29:59 +1100 Subject: [PATCH] Convert libusb transfer errors to regular libusb error messages to allow for accurate message reporting. --- usbutils.c | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/usbutils.c b/usbutils.c index 2e160add..963cc50e 100644 --- a/usbutils.c +++ b/usbutils.c @@ -2232,6 +2232,33 @@ static void LIBUSB_CALL transfer_callback(struct libusb_transfer *transfer) cgsem_post(&ut->cgsem); } +static int usb_transfer_toerr(int ret) +{ + switch (ret) { + default: + case LIBUSB_TRANSFER_COMPLETED: + ret = LIBUSB_SUCCESS; + break; + case LIBUSB_TRANSFER_ERROR: + ret = LIBUSB_ERROR_IO; + break; + case LIBUSB_TRANSFER_TIMED_OUT: + case LIBUSB_TRANSFER_CANCELLED: + ret = LIBUSB_ERROR_TIMEOUT; + break; + case LIBUSB_TRANSFER_STALL: + ret = LIBUSB_ERROR_PIPE; + break; + case LIBUSB_TRANSFER_NO_DEVICE: + ret = LIBUSB_ERROR_NO_DEVICE; + break; + case LIBUSB_TRANSFER_OVERFLOW: + ret = LIBUSB_ERROR_OVERFLOW; + break; + } + return ret; +} + /* Wait for callback function to tell us it has finished the USB transfer, but * use our own timer to cancel the request if we go beyond the timeout. */ static int callback_wait(struct usb_transfer *ut, int *transferred, unsigned int timeout) @@ -2248,8 +2275,7 @@ static int callback_wait(struct usb_transfer *ut, int *transferred, unsigned int cgsem_wait(&ut->cgsem); } ret = transfer->status; - if (ret == LIBUSB_TRANSFER_CANCELLED || ret == LIBUSB_TRANSFER_TIMED_OUT) - ret = LIBUSB_ERROR_TIMEOUT; + ret = usb_transfer_toerr(ret); /* No need to sort out mutexes here since they won't be reused */ *transferred = transfer->actual_length; @@ -2316,7 +2342,7 @@ usb_bulk_transfer(struct libusb_device_handle *dev_handle, int intinfo, cgpu->drv->name, cgpu->device_id, usb_cmdname(cmd), *transferred, err, errn); - if (err == LIBUSB_ERROR_PIPE || err == LIBUSB_TRANSFER_STALL) { + if (err == LIBUSB_ERROR_PIPE) { int retries = 0; do { @@ -2739,15 +2765,14 @@ static int usb_control_transfer(struct cgpu_info *cgpu, libusb_device_handle *de err = libusb_submit_transfer(ut.transfer); if (!err) err = callback_wait(&ut, &transferred, timeout); - if (err == LIBUSB_TRANSFER_COMPLETED && transferred) { + if (err == LIBUSB_SUCCESS && transferred) { if ((bmRequestType & LIBUSB_ENDPOINT_DIR_MASK) == LIBUSB_ENDPOINT_IN) memcpy(buffer, libusb_control_transfer_get_data(ut.transfer), transferred); err = transferred; goto out; } - if ((err) == LIBUSB_TRANSFER_CANCELLED) - err = LIBUSB_ERROR_TIMEOUT; + err = usb_transfer_toerr(err); out: complete_usb_transfer(&ut); return err;