|  | .. _usb-error-codes: | 
|  |  | 
|  | USB Error codes | 
|  | ~~~~~~~~~~~~~~~ | 
|  |  | 
|  | :Revised: 2004-Oct-21 | 
|  |  | 
|  | This is the documentation of (hopefully) all possible error codes (and | 
|  | their interpretation) that can be returned from usbcore. | 
|  |  | 
|  | Some of them are returned by the Host Controller Drivers (HCDs), which | 
|  | device drivers only see through usbcore.  As a rule, all the HCDs should | 
|  | behave the same except for transfer speed dependent behaviors and the | 
|  | way certain faults are reported. | 
|  |  | 
|  |  | 
|  | Error codes returned by :c:func:`usb_submit_urb` | 
|  | ================================================ | 
|  |  | 
|  | Non-USB-specific: | 
|  |  | 
|  |  | 
|  | =============== =============================================== | 
|  | 0		URB submission went fine | 
|  |  | 
|  | ``-ENOMEM``	no memory for allocation of internal structures | 
|  | =============== =============================================== | 
|  |  | 
|  | USB-specific: | 
|  |  | 
|  | =======================	======================================================= | 
|  | ``-EBUSY``		The URB is already active. | 
|  |  | 
|  | ``-ENODEV``		specified USB-device or bus doesn't exist | 
|  |  | 
|  | ``-ENOENT``		specified interface or endpoint does not exist or | 
|  | is not enabled | 
|  |  | 
|  | ``-ENXIO``		host controller driver does not support queuing of | 
|  | this type of urb.  (treat as a host controller bug.) | 
|  |  | 
|  | ``-EINVAL``		a) Invalid transfer type specified (or not supported) | 
|  | b) Invalid or unsupported periodic transfer interval | 
|  | c) ISO: attempted to change transfer interval | 
|  | d) ISO: ``number_of_packets`` is < 0 | 
|  | e) various other cases | 
|  |  | 
|  | ``-EXDEV``		ISO: ``URB_ISO_ASAP`` wasn't specified and all the | 
|  | frames the URB would be scheduled in have already | 
|  | expired. | 
|  |  | 
|  | ``-EFBIG``		Host controller driver can't schedule that many ISO | 
|  | frames. | 
|  |  | 
|  | ``-EPIPE``		The pipe type specified in the URB doesn't match the | 
|  | endpoint's actual type. | 
|  |  | 
|  | ``-EMSGSIZE``		(a) endpoint maxpacket size is zero; it is not usable | 
|  | in the current interface altsetting. | 
|  | (b) ISO packet is larger than the endpoint maxpacket. | 
|  | (c) requested data transfer length is invalid: negative | 
|  | or too large for the host controller. | 
|  |  | 
|  | ``-ENOSPC``		This request would overcommit the usb bandwidth reserved | 
|  | for periodic transfers (interrupt, isochronous). | 
|  |  | 
|  | ``-ESHUTDOWN``		The device or host controller has been disabled due to | 
|  | some problem that could not be worked around. | 
|  |  | 
|  | ``-EPERM``		Submission failed because ``urb->reject`` was set. | 
|  |  | 
|  | ``-EHOSTUNREACH``	URB was rejected because the device is suspended. | 
|  |  | 
|  | ``-ENOEXEC``		A control URB doesn't contain a Setup packet. | 
|  | =======================	======================================================= | 
|  |  | 
|  | Error codes returned by ``in urb->status`` or in ``iso_frame_desc[n].status`` (for ISO) | 
|  | ======================================================================================= | 
|  |  | 
|  | USB device drivers may only test urb status values in completion handlers. | 
|  | This is because otherwise there would be a race between HCDs updating | 
|  | these values on one CPU, and device drivers testing them on another CPU. | 
|  |  | 
|  | A transfer's actual_length may be positive even when an error has been | 
|  | reported.  That's because transfers often involve several packets, so that | 
|  | one or more packets could finish before an error stops further endpoint I/O. | 
|  |  | 
|  | For isochronous URBs, the urb status value is non-zero only if the URB is | 
|  | unlinked, the device is removed, the host controller is disabled, or the total | 
|  | transferred length is less than the requested length and the | 
|  | ``URB_SHORT_NOT_OK`` flag is set.  Completion handlers for isochronous URBs | 
|  | should only see ``urb->status`` set to zero, ``-ENOENT``, ``-ECONNRESET``, | 
|  | ``-ESHUTDOWN``, or ``-EREMOTEIO``. Individual frame descriptor status fields | 
|  | may report more status codes. | 
|  |  | 
|  |  | 
|  | ===============================	=============================================== | 
|  | 0				Transfer completed successfully | 
|  |  | 
|  | ``-ENOENT``			URB was synchronously unlinked by | 
|  | :c:func:`usb_unlink_urb` | 
|  |  | 
|  | ``-EINPROGRESS``		URB still pending, no results yet | 
|  | (That is, if drivers see this it's a bug.) | 
|  |  | 
|  | ``-EPROTO`` [#f1]_, [#f2]_	a) bitstuff error | 
|  | b) no response packet received within the | 
|  | prescribed bus turn-around time | 
|  | c) unknown USB error | 
|  |  | 
|  | ``-EILSEQ`` [#f1]_, [#f2]_	a) CRC mismatch | 
|  | b) no response packet received within the | 
|  | prescribed bus turn-around time | 
|  | c) unknown USB error | 
|  |  | 
|  | Note that often the controller hardware does | 
|  | not distinguish among cases a), b), and c), so | 
|  | a driver cannot tell whether there was a | 
|  | protocol error, a failure to respond (often | 
|  | caused by device disconnect), or some other | 
|  | fault. | 
|  |  | 
|  | ``-ETIME`` [#f2]_		No response packet received within the | 
|  | prescribed bus turn-around time.  This error | 
|  | may instead be reported as | 
|  | ``-EPROTO`` or ``-EILSEQ``. | 
|  |  | 
|  | ``-ETIMEDOUT``			Synchronous USB message functions use this code | 
|  | to indicate timeout expired before the transfer | 
|  | completed, and no other error was reported | 
|  | by HC. | 
|  |  | 
|  | ``-EPIPE`` [#f2]_		Endpoint stalled.  For non-control endpoints, | 
|  | reset this status with | 
|  | :c:func:`usb_clear_halt`. | 
|  |  | 
|  | ``-ECOMM``			During an IN transfer, the host controller | 
|  | received data from an endpoint faster than it | 
|  | could be written to system memory | 
|  |  | 
|  | ``-ENOSR``			During an OUT transfer, the host controller | 
|  | could not retrieve data from system memory fast | 
|  | enough to keep up with the USB data rate | 
|  |  | 
|  | ``-EOVERFLOW`` [#f1]_		The amount of data returned by the endpoint was | 
|  | greater than either the max packet size of the | 
|  | endpoint or the remaining buffer size. | 
|  | "Babble". | 
|  |  | 
|  | ``-EREMOTEIO``			The data read from the endpoint did not fill | 
|  | the specified buffer, and ``URB_SHORT_NOT_OK`` | 
|  | was set in ``urb->transfer_flags``. | 
|  |  | 
|  | ``-ENODEV``			Device was removed.  Often preceded by a burst | 
|  | of other errors, since the hub driver doesn't | 
|  | detect device removal events immediately. | 
|  |  | 
|  | ``-EXDEV``			ISO transfer only partially completed | 
|  | (only set in ``iso_frame_desc[n].status``, | 
|  | not ``urb->status``) | 
|  |  | 
|  | ``-EINVAL``			ISO madness, if this happens: Log off and | 
|  | go home | 
|  |  | 
|  | ``-ECONNRESET``			URB was asynchronously unlinked by | 
|  | :c:func:`usb_unlink_urb` | 
|  |  | 
|  | ``-ESHUTDOWN``			The device or host controller has been | 
|  | disabled due to some problem that could not | 
|  | be worked around, such as a physical | 
|  | disconnect. | 
|  | ===============================	=============================================== | 
|  |  | 
|  |  | 
|  | .. [#f1] | 
|  |  | 
|  | Error codes like ``-EPROTO``, ``-EILSEQ`` and ``-EOVERFLOW`` normally | 
|  | indicate hardware problems such as bad devices (including firmware) | 
|  | or cables. | 
|  |  | 
|  | .. [#f2] | 
|  |  | 
|  | This is also one of several codes that different kinds of host | 
|  | controller use to indicate a transfer has failed because of device | 
|  | disconnect.  In the interval before the hub driver starts disconnect | 
|  | processing, devices may receive such fault reports for every request. | 
|  |  | 
|  |  | 
|  |  | 
|  | Error codes returned by usbcore-functions | 
|  | ========================================= | 
|  |  | 
|  | .. note:: expect also other submit and transfer status codes | 
|  |  | 
|  | :c:func:`usb_register`: | 
|  |  | 
|  | ======================= =================================== | 
|  | ``-EINVAL``		error during registering new driver | 
|  | ======================= =================================== | 
|  |  | 
|  | ``usb_get_*/usb_set_*()``, | 
|  | :c:func:`usb_control_msg`, | 
|  | :c:func:`usb_bulk_msg()`: | 
|  |  | 
|  | ======================= ============================================== | 
|  | ``-ETIMEDOUT``		Timeout expired before the transfer completed. | 
|  | ======================= ============================================== |