コンテンツにスキップ
ステージングサーバー
開発サーバー

LinuxでのUSB 3.0エラー "Failed to Submit Transfer Status=0xe2100001"#

問題#

Linux環境でUSB 3.0カメラを使用しており、トランスポートレイヤーの MaxTransferSize パラメータを65536バイトより大きい値に設定した場合、コンソールに次のようなエラーメッセージが繰り返し表示されることがあります。

Failed to submit transfer status=0xe2100001.

トランスポートレイヤーの MaxTransferSize パラメータを増やすと、通常はデータオーバーヘッドが削減され、CPU割り込みが減るため、CPU負荷を軽減できます。Linux環境では、Maximum Transfer Sizeの最大サイズは約3 MBです。

このエラーメッセージが表示される理由は、カーネルモジュール「usbcore」に、要求されたUSB Request Block(URB)サイズ分の十分なMemoryがないためです。デフォルトでは、「usbcore」には約16 MBのMemoryが割り当てられています。

要求されるURBサイズは、次のように計算されます。

Maximum Transfer Size x Num Max Queued URBs

デフォルトでは、Num Max Queued URBsは64に設定されています。

解決策#

上記のエラーメッセージを回避するには、次の手順を実行します。

  1. 前述の計算式を使用して、エラーメッセージが表示されなくなるまで、pylon Viewerまたはアプリケーション内の NumMaxQueuedUrbs の値を下げます。
  2. カーネルモジュール「usbcore」に追加のMemoryを割り当てます。

    1. 現在割り当てられているMemory(MBytes単位)を確認するには、コンソールで次のコマンドを実行します。

      cat /sys/module/usbcore/parameters/usbfs_memory_mb
      
    2. 現在のセッションのみMemoryを増やす(例:32 MBにする)には、rootとしてログインし、次を実行します。

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

割り当てられたMemoryを恒久的に増やす方法は、使用しているLinuxディストリビューションによって異なります。

「grub2」を使用するUbuntuの場合は、次の手順を実行できます。

  1. ファイル /etc/default/grub を編集します。
  2. 変数を変更します。 GRUB_CMDLINE_LINUX例えば:
    GRUB_CMDLINE_LINUX="usbcore.usbfs_memory_mb=32"
    
  3. rootとして次のコマンドを実行し、再起動します。
    update-grub
    

ナレッジ記事に戻る