NCP-HG100 LTEモデムクラッシュのソフト的な対処

マクさんです

例のワクチン一発目を撃たれたところですが、盤石なるセルフロックダウン体制を敷いておりまして、県境を超えない引きこもりリタイア暮らしを堪能しているところであります

無料公開のゴールデンカムイを読み耽ったり、激安昭和レトロゲームを嫁さんとプレイしたり、平日の誰もいない浜辺で昼寝したり波と戯れたり・・・などと日々忙しく活動していたところ、ガジェットを弄りたい欲望が湧き上がってきた

なので、金が掛からず適度に攻略しがいのありそうな、NCP-HG100のモデムクラッシュ対策をソフト的にやってみた、という話。

NCP-HG100のLTEモデムクラッシュは、2台目でも発生した

その激安さ故に2台買っといた、NCP-HG100

1台目は目下のところ楽天UNLIMIT VIの試験運用中である。モデムクラッシュ対策の効果は、3か月連続運用したところ不具合は発生せず。来月(9月)にはADSLを解約して本運用するつもりだ

だがしかし、モデムクラッシュの発生と対策は1台でしか確認していない、という問題がある。ADSLの置換えという喫緊の課題への対処をせまられ、まずは試験運用作業を優先する、という苦渋の決断を下すしかなかったのだ。2台目のNCP-HG100は通電チェックだけやって放置する他なかったのである・・・ごめんよ、2台目

・・・

とゆーことで、試しに1台目と置き換えて様子をうかがってみたところ、ほどなくしてモデムクラッシュが発生。発生頻度は日に1~2回。スピードテストやファイルのダウンロードで起きやすいのも1台目と同様だ

モデムクラッシュは1台目に固有の問題ではないとわかった

そうとわかれば、ちゃちゃっとUSB接続をSuperSpeed(SS)からHighSpeed(HS)に変更して、モデムクラッシュが改善するかみてみようぞ!

dtsの書き換えは効かなかった

まずは、先のブログエントリでソフト対策案として挙げた、

dts に maximum-speed = “high-speed”; を書いて(略

・・・

を試してみます。

結構遊べた手間がかかったのですが、結局ダメだった。詳細は省くが自分用の備忘録として作業の概要だけ書いておく

  • kernelに渡される(kernel jump直前の)dtbを取得して、dtsにする

  • dwc3@8a00000 { … } と、他それっぽいノードに、maximum-speed = “high-speed”; を追加

  • dtbにする

  • FITからRAM展開された後の dtbを置き換えたいので、アセンブラでdtb置換えコードを書く

  • U-Bootで、適当なアドレスにdtbと、dtb置換えコードを置く

  • FITイメージをロードする

  • 実行中のU-Bootを書き換える。kernel ではなくdtb置換えコードへジャンプさせる

  • bootm

  • 置き換えたdtbでkernelが起動

・・・

これで、dtbの置き換えはできましたが、HighSpeedにはならんかった

プロパティ拾ってくれてそうなdwc3のドライバコードを観察すると、どうやらhostの初期化では maximum_speed で何か変わる雰囲気がないみたいです(よくわかりません。理解度はゼロ)。dwc3/gadget.c では何か設定してるので、hostの速度を設定するためのプロパティじゃないのかも。(kernel 4.4では)

SS PHYのリセットでLTEモデムのHighSpeed接続が覚醒

続いて、先のブログエントリで「簡単なんじゃね?」などと放言したSS PHYにリセットを掛けちゃう案です

参考関数として挙げといた ipq4019_ss_phy_power_off() ・・・から追うのはガセ情報(自爆)だったので

適当に捜索し、dwc3/core.c の、dwc3_core_soft_reset() にそれっぽいリセット処理を発見。

GUSB3PIPECTL なるレジスタでリセットを掛けてみる

# devmem 0x08a0c2c0 32 0x830E0002

すると、無事にUSB死亡を確認😆・・・・いやいや、これは何かしら効いてるということではないか

じゃあってんで、さきに unbind してOSがUSBに触らないよーにしたらどうなるか、試してみよう

# echo -n "2-1" > /sys/bus/usb/drivers/usb/unbind
# devmem 0x08a0c2c0 32 0x830E0002

すると、新たに、HSで、デバイスが認識された!

これは・・・SS端子にテープ貼るのより簡単じゃね?

実装工事

ただ単純に試してみたい動機で実装してみた。実運用はお勧めできませんが、パッチを置いておく

ncp-hg100_hs_patch

処理の狙いは、大別して①起動時にHSにするのと、②モデムクラッシュ復帰処理で再度HS接続させること、です。他処理との同期は考慮せず、やってみたら動いた!という作りですので、諸々の処理順とかタイミングに依存して動かないことがあるかも知れん

パッチは長々と書いてありますが、ほとんどモデムクラッシュ復帰処理です。前のブログエントリの修正も含んでいますし、実は起動時設定だけなら rc.local の変更だけ(パッチの後ろの方にある3行)です。ここの変更だけではモデムクラッシュして復帰処理が走るとSSになりますが、そもそもモデムクラッシュ自体が(略

まとめ

資料も知見もなく、PHYをリセットしっぱなしで色々と平気なのか、マクさんは知りません。というかレジスタ名からしてPHYそのものではなくて内部IFだけのリセットなのかも知れません

# cat /sys/kernel/debug/usb/devices

すればわかりますが、トポロジが不正な状態になります。SS接続情報が残っているけど無視という状態になっているような・・・。

ま、なんかおかしいけど動いてる、という状態に他なりません。

ですので実用では、前のブログエントリで書いたSS端子マスクの方が良いです。なんといっても、SS接続がなければHSになる、これは仕様ということなので。

・・・

ちなみに実際、1週間動かしてみたところではモデムクラッシュは起きてないですね。やはりSS接続で顕在化する不具合がどこかに潜んでいると見て宜しかろう

ガジェット弄りたい欲望も満たされたし、こういう、1銭にもならない、納期も!品質も!!他人から求められない!!!

自己満活動っていうのは・・・・

・・・まさに、至高😀・・・