@ -2232,6 +2232,33 @@ static void LIBUSB_CALL transfer_callback(struct libusb_transfer *transfer)
@@ -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
@@ -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,
@@ -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
@@ -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 ;