使っているのはusbserialとoptionの組み合わせ。
いじくり回し過ぎちゃって、変更したのはどこだったか、何が決定打なのか分からなくなってしまったのですが、とりあえず思い出した事を書いてみます。(過去の記事で触れたところについてはここでは書いていません)
usb-serial.cにて、
buffer_size = le16_to_cpu(endpoint->wMaxPacketSize);
の処理があと3ヶ所あったので、全て
buffer_size = (endpoint->wMaxPacketSize > maxSize)?endpoint->wMaxPacketSize:maxSize;
に変更。(2行に表示されているかもしれませんが実際には1行です)
option.cにて、
#define N_IN_URB 4
#define N_OUT_URB 1
#define IN_BUFLEN 4096
#define OUT_BUFLEN 128
#define N_OUT_URB 1
#define IN_BUFLEN 4096
#define OUT_BUFLEN 128
という部分を、
#define N_IN_URB 4
#define N_OUT_URB 4
#define IN_BUFLEN 4096
#define OUT_BUFLEN 4096
#define N_OUT_URB 4
#define IN_BUFLEN 4096
#define OUT_BUFLEN 4096
と変更。
この時間帯(0:30)に3回測定して、下りは2Mbps前後、上りも毎回60kbps出ていました。いい感じです。とは言えWindows環境で測定してみたら上り200kbpsオーバーだったので、Linuxでもまだまだ速くなって欲しいところではありますが。
ただ無茶な変更をしたせいか、回線の切断でOSごとハングするようになってしまいました。またN_OUT_URBを"1"に設定した場合(この場合上りは8kbps程度しか出ない)、切断するとpppのセッションは切れるもののカードのMODEランプは付いたまま。そのままrmmodやpccardctl ejectをするとやっぱりOSごとハングしてしまいます。う〜ん…。
上記のoption.cに設定している値とusbserialのロード時に指定しているmaxSizeの値を煮詰めれば何とかなるんでしょうか…。少し光が見えてきましたが、まだまだ道は険しいです。
今宵は、ここまでにいたしとうございます。
# WindowsではJREが数クリック/数分で導入できてちょっと感動(笑)
そういえばoptionはどうして動くようになったんですか?
これを読んで素人判断してみました。
URB数を増やしたorバッファサイズを増やしたの
どちらで効果が出ているのか分かりませんが、
前者であれば、optionドライバはURB数に応じてwrite処理を多重にしてくれるように見えますね。(ソース読んでないので根拠なし)
wirteは多重度が上がると速度が上がること、VMB5000のTX/RXFIFOバッファがそれぞれ16KByteであることを踏まえて、URB数を8,バッファサイズを2kとかにしたほうが速いとか、いかがでしょ。
素人丸出しで申し訳ない…orz
optionはやってみたら動きました。(笑)
そこら中いじくり回しちゃっているので、わけ分からんです。
たぶんkenyaくんもやってみたら動くよ。
たまに初期化に失敗するけど、接続し直せば大丈夫っぽい。
リンク先私も読んでみました。同じく素人判断ながら、
・cdc-acmはURBが1つしかないので速度が出ない
・optionはUSBを多重化することで高速化した
と思ったんだけどどうだろう?
実際、上り側のURB数(っぽい)N_OUT_URBを1から4に変えたら速度上がったし。
optionがどんな通信速度を考慮してURBとバッファの数をこう設定したのかが気になるところ。でもチューニングなしで下りは2.6Mbpsとか出るんだから上りが極端に遅いのを想定してるって事はあり得ないよなぁ。
N_OUT_URBを4にしたら通信が切断できなくなったので、この辺のパラメータはusbserialとかvmb_hcdなんかと強調して合わせていかないといけない気がする。でもそんなにソース読めないっす…。(涙)
というわけでうちのも設定してみました。
1.10ドライバはデバッグログ抜きが面倒だったのでまだ1.09でのテストです。
ファームウェアは1.01に上げました。
Linuxカーネルを2.6.23.12に変更、
usb-serial.cの変更はしていません。
option.cの
HUAWEIのIDをD01NX用にIDを変更(自動認識のため)
#define N_OUT_URBを1から4に変更
#define OUT_BUFLENを128から2048(バッファでかすぎるのもどうかと思ったので)に変更で
下り1.511Mbps (188.8kByte/s)
測定品質 93.5
上り366.5kbps (45.81kByte/s)
測定品質 97.1
でました。
うちではこれでwindowsと同等です。
一応報告まで。
#さぁ寝よう…
ひょっとして、回線切断もうまくいってますか?
だとしたら完璧ですね〜。おめでとうございます。
私の環境との差異は・・・、
・ディストロ(Gentoo/Plamo)
・カーネルバージョン(2.6.22-r9/2.6.23.12)
・VMBドライバ(1.10/1.9)
・usbserial(バッファ拡張あり/デフォルト)
・option(URB=8:BUFLEN=128/URB=4:BUFLEN=2048)
こんな感じですね。
私の環境ではURB=4の場合BUFLENをいくつに設定しても60Kbpsしか出なかったので、URB=4で上り全速になっているのが不思議です。usbserialのパッチがジャマをしているのか、カーネル2.6.23で何か修正されているのか(そう言えば試作で『2.6.23を使うと幸せになれるかも』というコメントがあったような)、VMBドライバの1.10は外れなのか。(笑)
とりあえず私もカーネルのバージョン上げて試してみます。
夜遅くまでお疲れ様でした。