2011/10/15

[bb]LUA2-TXがupdate_eth_regs_async()で-22というのはなぜだろう

なぜだろうねぇ。

LUA2-TXというのは、USBのNICだ。
Buffaloで販売しているが、ずいぶん前のものだから、もう廃番になっているかも。
これをBeagleBoardのNICとして使っているのだが、しばしばupdate_eth_regs_async()で-22だといわれる。
BeagleBoardだけじゃなく、PCのLinuxで使っていてもそうなったかもしれん(今はWindowsを動かしているので試せない)。

警告なのかエラーなのかわからないのは気持ちが悪いので、わかる範囲で調べてみよう。


-22は、中で呼ばれているusb_submit_urb()の戻り値だ。
しかしメッセージの表示条件は、netif_msg_drv(pegasus)が真の時というだけで、戻り値がエラーの場合というわけではない。

戻り値が-ENODEV(指定された USB デバイスかバスは存在しません)ならば、そのときはdetachしにいってる。
-22はそうなると、errnoのメンバーでいいってことになり、それなら-EINVALということだ。
こちらを参考にすると、

a) 無効 (または、使えない) な転送の種類が指定されました
b) 無効か使えない転送周期です
c) ISO: 転送間隔の変更が試みられました
d) ISO: number_of_packets (パケットの数) が 0 未満です
e) その他の場合

の、どれかというわけだ。
どれだろう・・・。

そしてもう1つ。
update_eth_regs_async()はusb_submit_urb()の戻り値を返すけれども、呼び出し元はそれを捨てているのだ。
うーん、エラーは通常戻ってくるはずがないから捨てているのか、どっちでもいいから捨てているのか、単なる実装ミスか・・・。

 

今気付いたが、update_eth_regs_async()の呼び出し元はctrl_callback()だ。
そしてctrl_callback()はコールバック関数のようで、設定はusb_fill_control_urb()内の引数みたいだ。
このusb_fill_control_urb()を呼び出すのは・・・update_eth_regs_async()など。
ctrl_callback()の関数コメントに「Aargh!!! I _really_ hate such tweaks」と書いてあるのはそういうわけか。

usb_fill_control_urb()が正常に終わり、なおかつレジスタ設定がまだ残っている場合は再びupdate_eth_regs_async()を呼び出し直して設定を行い、エラーになったら抜けることになっているのではないだろうか。
あまり通るルートじゃないけれど、他にいい方法が思いつかなかったとかかなぁ。
それなら「hate」っていう気持ちもわかる。

 

でもなぁ・・・それならprintk()使ってエラー出力しないよなぁ。
ぐるぐるループさせる方法を「hate」っていってるだけであって、エラーになっているのはやっぱりエラーと考えるのが普通のように思えてきた。

わからんので、Linux環境に戻して確認するか。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。