[Armadillo:07768] Re: armadillo-420 usb cdc_acmのドライバが落ちる

辻 泰裕 email@hidden
2011年 12月 16日 (金) 13:12:22 JST


お世話になっております、辻です。

先日教えて頂いた、USBのIRAM サイズを変更してする件についてですが、
2048から8192変更して確認しましたが、結果は変わりませんでした。

その後も不具合の調査をすすめていますが、以下のような結果となっています。

ttyACMデバイスを引き抜くと
drivers/usb/core/hub.c の関数:usb_disconnect が実行され
usb 2-1: USB disconnect, address 9
cdc_acm: acm_ctrl_irq - usb_submit_urb failed with result -19
fsl-ehci fsl-ehci.1: HC died; cleaning up
とメッセージが表示されホストコントローラが落ちてしまいます。

HC died のメッセージを出力するのは、
drivers/usb/core/hcd.c 関数:usb_hc_died なのですが、この関数の呼び出し元は、
同ファイルの関数:usb_hcd_irq です。
if (unlikely(hcd->state == HC_STATE_HALT)) このif分が成立した場合、呼び出されます。

disconnect中にhcd->stateをどの処理にて、HC_STATE_HALTにするのか調べると、
drivers/usb/host/ehci-sched.c 関数:qh_unlink_periodic → 関数:disable_periodic が
呼び出されそこから、
drivers/usb/host/ehci-hcd.c 関数:handshake_on_error_set_halt が呼び出されます。
この関数から同ファイル内の関数:handshake を呼び出し、その戻り値が、-ETIMEDOUT となり、
HC_STATE_HALT がセットされます。(この時のmaskとdoneは、ともにSTS_PSSです)
関数:handshake_on_error_set_halt にて、unlink時(ehci->periodic_sched==0)のみエラーを
無視し、正常完了とすると、USBの抜き差しを行っても正常に動作します。

かなり強引な対応なのですが、問題ないでしょうか?
または、この内容でなにか根本原因が推測できますでしょうか?

この対応をしたカーネルにて、ttyACM、ttyUSBにて、直接接続、ハブをかましての接続にて
通信テスト(通信中にUSBを引き抜く等)を行っておりますが問題は発生しておりません。

以上 宜しくお願いします。







armadillo メーリングリストの案内