跳至內容
測試伺服器
開發伺服器

在 Linux 上發生 USB 3.0 錯誤 "Failed to Submit Transfer Status=0xe2100001"#

問題#

如果您在 Linux 上執行 USB 3.0 相機,並將傳輸層 MaxTransferSize 參數增加到大於 65536 位元組(Bytes)的值,您可能會在主控台中反覆收到以下錯誤訊息:

Failed to submit transfer status=0xe2100001.

增加傳輸層 MaxTransferSize 參數通常可以降低 CPU 負載,因為它減少了資料額外負荷並降低了 CPU 中斷次數。在 Linux 上,Maximum Transfer Size 的最大大小約為 3 MB。

產生此錯誤訊息的原因是核心模組 (kernel module)「usbcore」沒有足夠的記憶體來應付要求的 USB 請求區塊 (URB) 大小。「usbcore」預設大約有 16 MB 的可用記憶體。

要求的 URB 大小計算方式如下:

Maximum Transfer Size x Num Max Queued URBs

Num Max Queued URBs 預設設為 64。

解決方案#

為避免出現上述錯誤訊息,請按照以下步驟操作:

  1. 使用上述公式,並在 pylon Viewer 或您的應用程式中減少 NumMaxQueuedUrbs 值,直到錯誤訊息消失為止。
  2. 為核心模組「usbcore」分配更多記憶體:

    1. 若要查看目前已分配的記憶體(以 MBytes 為單位),請在主控台中執行以下指令:

      cat /sys/module/usbcore/parameters/usbfs_memory_mb
      
    2. 若要僅針對目前的工作階段增加記憶體(例如增加至 32 MB),請以 root 身分登入並執行:

      echo -n 32 > /sys/module/usbcore/parameters/usbfs_memory_mb
      

如何永久增加已分配的記憶體取決於所使用的 Linux 發行版本。

對於使用「grub2」的 Ubuntu,可以執行以下操作:

  1. 編輯檔案:/etc/default/grub。
  2. 變更變數: GRUB_CMDLINE_LINUX。例如:
    GRUB_CMDLINE_LINUX="usbcore.usbfs_memory_mb=32"
    
  3. 以 root 身分執行以下指令並重新開機:
    update-grub
    

返回知識文章