USB 錯誤程式碼

修訂:

2004-10-21

這是(希望)所有可能的錯誤程式碼(及其解釋)的文件,這些錯誤程式碼可以從 usbcore 返回。

其中一些由主機控制器驅動程式 (HCD) 返回,裝置驅動程式只能透過 usbcore 看到。通常,所有 HCD 的行為都應相同,除了傳輸速度相關的行為以及某些故障的報告方式。

usb_submit_urb() 返回的錯誤程式碼

非 USB 特定的

0

URB 提交順利

-ENOMEM

沒有記憶體用於分配內部結構

USB 特定的

-EBUSY

URB 已經處於活動狀態。

-ENODEV

指定的 USB 裝置或匯流排不存在

-ENOENT

指定的介面或端點不存在或未啟用

-ENXIO

主機控制器驅動程式不支援此型別的 urb 排隊。(視為主機控制器錯誤。)

-EINVAL

  1. 指定了無效的傳輸型別(或不支援)

  2. 無效或不支援的定期傳輸間隔

  3. ISO:嘗試更改傳輸間隔

  4. ISO:number_of_packets < 0

  5. 各種其他情況

-EXDEV

ISO:未指定 URB_ISO_ASAP,並且 URB 將被排程的所有幀都已過期。

-EFBIG

主機控制器驅動程式無法排程那麼多 ISO 幀。

-EPIPE

URB 中指定的管道型別與端點的實際型別不匹配。

-EMSGSIZE

  1. 端點 maxpacket 大小為零;它在當前的介面備用設定中不可用。

  2. ISO 資料包大於端點 maxpacket。

  3. 請求的資料傳輸長度無效:負數或對於主機控制器來說太大。

-EBADR

控制 URB 的設定資料包中的 wLength 值與 URB 的 transfer_buffer_length 不匹配。

-ENOSPC

此請求將過度提交為定期傳輸(中斷、同步)保留的 usb 頻寬。

-ESHUTDOWN

由於某些無法解決的問題,裝置或主機控制器已被停用。

-EPERM

提交失敗,因為設定了 urb->reject

-EHOSTUNREACH

由於裝置已掛起,URB 被拒絕。

-ENOEXEC

控制 URB 不包含設定資料包。

in urb->statusiso_frame_desc[n].status (對於 ISO) 返回的錯誤程式碼

USB 裝置驅動程式只能在完成處理程式中測試 urb 狀態值。 這是因為否則將在一個 CPU 上更新這些值的 HCD 與在另一個 CPU 上測試它們的裝置驅動程式之間存在競爭。

即使報告了錯誤,傳輸的 actual_length 也可能是正數。 這是因為傳輸通常涉及多個數據包,因此一個或多個數據包可能會在錯誤停止進一步的端點 I/O 之前完成。

對於同步 URB,僅當 URB 未連結、裝置被移除、主機控制器被停用或總傳輸長度小於請求長度並且設定了 URB_SHORT_NOT_OK 標誌時,urb 狀態值才為非零。 同步 URB 的完成處理程式應僅看到 urb->status 設定為零、-ENOENT-ECONNRESET-ESHUTDOWN-EREMOTEIO。 單個幀描述符狀態欄位可能會報告更多狀態程式碼。

0

傳輸成功完成

-ENOENT

URB 已由 usb_unlink_urb() 同步取消連結

-EINPROGRESS

URB 仍在掛起,尚未有結果(也就是說,如果驅動程式看到此錯誤,則這是一個錯誤。)

-EPROTO [1], [2]

  1. bitstuff 錯誤

  2. 在規定的匯流排轉換時間內未收到響應資料包

  3. 未知的 USB 錯誤

-EILSEQ [1], [2]

  1. CRC 不匹配

  2. 在規定的匯流排轉換時間內未收到響應資料包

  3. 未知的 USB 錯誤

請注意,通常控制器硬體無法區分 a)、b) 和 c) 情況,因此驅動程式無法判斷是否存在協議錯誤、未響應(通常由裝置斷開連線引起)或某些其他故障。

-ETIME [2]

在規定的匯流排轉換時間內未收到響應資料包。 此錯誤可能會報告為 -EPROTO-EILSEQ

-ETIMEDOUT

同步 USB 訊息功能使用此程式碼來指示超時在傳輸完成之前已過期,並且 HC 未報告其他錯誤。

-EPIPE [2]

端點停止。 對於非控制端點,使用 usb_clear_halt() 重置此狀態。

-ECOMM

在 IN 傳輸期間,主機控制器接收來自端點的資料的速度快於將其寫入系統記憶體的速度

-ENOSR

在 OUT 傳輸期間,主機控制器無法足夠快地從系統記憶體中檢索資料以跟上 USB 資料速率

-EOVERFLOW [1]

端點返回的資料量大於端點的最大資料包大小或剩餘緩衝區大小。“Babble”。

-EREMOTEIO

從端點讀取的資料未填充指定的緩衝區,並且在 urb->transfer_flags 中設定了 URB_SHORT_NOT_OK

-ENODEV

裝置已移除。 通常以其他錯誤的突發開始,因為集線器驅動程式不會立即檢測到裝置移除事件。

-EXDEV

ISO 傳輸僅部分完成(僅在 iso_frame_desc[n].status 中設定,而不是在 urb->status 中)

-EINVAL

ISO 瘋狂,如果發生這種情況:登出並回家

-ECONNRESET

URB 已由 usb_unlink_urb() 非同步取消連結

-ESHUTDOWN

由於某些無法解決的問題,裝置或主機控制器已被停用,例如物理斷開連線。

由 usbcore 函式返回的錯誤程式碼

注意

還期望其他提交和傳輸狀態程式碼

usb_register():

-EINVAL

註冊新驅動程式時出錯

usb_get_*/usb_set_*(), usb_control_msg(), usb_bulk_msg()

-ETIMEDOUT

超時在傳輸完成之前已過期。