diff options
author | Hans de Goede <hdegoede@redhat.com> | 2012-03-26 22:54:12 +0100 |
---|---|---|
committer | Pete Batard <pete@akeo.ie> | 2012-03-26 23:03:22 +0100 |
commit | c6a34f46c1c9ffc5a6dbf3fce59522aa753c75b9 (patch) | |
tree | 40f072b7d4bc47cf35a142127ed864eacdec99db | |
parent | a76f2eea59807eb6f3d6642e80ccb9844b5092e4 (diff) | |
download | libusb-c6a34f46c1c9ffc5a6dbf3fce59522aa753c75b9.tar.gz |
Linux: Translate iso pkt status codes to libusb transfer status codes
* Linux negative errno from iso pkts status must be translated and reported.
-rw-r--r-- | libusb/os/linux_usbfs.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c index f9fa4cd..d41aac8 100644 --- a/libusb/os/linux_usbfs.c +++ b/libusb/os/linux_usbfs.c @@ -2079,7 +2079,41 @@ static int handle_iso_completion(struct usbi_transfer *itransfer, struct usbfs_iso_packet_desc *urb_desc = &urb->iso_frame_desc[i]; struct libusb_iso_packet_descriptor *lib_desc = &transfer->iso_packet_desc[tpriv->iso_packet_offset++]; - lib_desc->status = urb_desc->status; + lib_desc->status = LIBUSB_TRANSFER_COMPLETED; + switch (urb_desc->status) { + case 0: + break; + case -ENOENT: /* cancelled */ + case -ECONNRESET: + break; + case -ENODEV: + case -ESHUTDOWN: + usbi_dbg("device removed"); + lib_desc->status = LIBUSB_TRANSFER_NO_DEVICE; + break; + case -EPIPE: + usbi_dbg("detected endpoint stall"); + lib_desc->status = LIBUSB_TRANSFER_STALL; + break; + case -EOVERFLOW: + usbi_dbg("overflow error"); + lib_desc->status = LIBUSB_TRANSFER_OVERFLOW; + break; + case -ETIME: + case -EPROTO: + case -EILSEQ: + case -ECOMM: + case -ENOSR: + case -EXDEV: + usbi_dbg("low-level USB error %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + default: + usbi_warn(TRANSFER_CTX(transfer), + "unrecognised urb status %d", urb_desc->status); + lib_desc->status = LIBUSB_TRANSFER_ERROR; + break; + } lib_desc->actual_length = urb_desc->actual_length; } |