ThinkPad X395でLinuxのWWANを動かす(1)

とりあえず動いた。

Linuxでサポートされていない XMM7360

前回のブログで書いた通り、 最近の ThinkPad に(オプションで) 搭載できるWWANカードの Fibocom L850-GL (即ちIntel® XMM™ 7360) はそれまでのWWANカードのように一筋縄には現状はまだ使えない。特にAMDモデルでは。

これはざっくり言えば、従来のカードは(見た目は同じM.2カードでしかないが、) USB 接続で使用していたのに対してL850-GLはPCIeでの接続 (がデフォルト) になっているため。当該カード自体はUSBとPCIeに両対応してい、USBであればLinuxでドライバが利用可能なためUSBモードに切り替える(ACPIを叩く)スクリプトカーネルモジュールが有志の手で作成されていた。

リセットをしてモードを切り替える他にも端子を物理的に絶縁してUSBとして認識させているものもいくつもあった。

概ね2019年の Intel モデルの ThinkPad であるところの X390、T490、T490s、P43s、X1 Yoga 4th などではこれで動作していたらしいものの AMDモデルにおいてはこのスクリプトでカードをリセットするとデバイスがただ見えなくなるといった状況に。AMDモデルについては手元の X395 の他にも、A285 や T495 でも同様の事象が報告されてい、むしろ成功している例はみられないのでおそらくチップセットか何かの仕様として当該M.2スロットでUSBは利用できない模様。おそらくT495sも共通と思われる。(他のIntelモデルについてはT480sやX1C6thで動いた、T480やP52,P52s,P53で動かないだとかいろんな話があるのでよくわからないけどPシリーズとか特に同様の理由でないか。)

そんな xmm7360-usb-modeswitch だが、実は前回のブログを書いている途中にリポジトリ名の変更とOrgへの引っ越しが行われていた。そう、PCI版ドライバを作るために。(かはしらないが、その時にリバースリポが先に公開されていたしおそらくそういうこと)

このPCI版ドライバは現時点ではまだ人柱版といったところで正常に動作することを過度に期待してはいけない。実際、自分もシステムがクラッシュした。(ところでmay singe your jafflesなんて言い回しはじめて聞いた……)
しかし、こちらにリソース回す為か、usb-modeswitch のリポは「もはやメンテナンスされていない」となっている。まあ必要な人には十分な状態だし、それよりもPCIで使えたほうが幅広く恩恵はある……

さて、PCI版ドライバは現時点ではModemManagerのような高度なツールには対応してない、というかModemManager側が対応していないとも言えるかもしれない。

Linux 5.18でカーネルにサポート追加?

2022年5月にリリースされたLinux 5.18カーネルではひっそりとXMM7360のサポートIOMSドライバが追加されている。まだ完全とは言い難いようだが、ModemManagerでも扱えそうである。

といっても、PCIモデムでも結局は従来のモデムと同様にATコマンドを叩くので基本的なところは共通している模様。ドライバをロードしたらscreenやminicomなんかで /dev/ttyXMM[0-2] からATコマンドをたたけた。ただ、rpcあたりが少し厄介らしい。また、USBでは自動的に呼ばれるいくつかのコマンドが手動で呼ぶ必要があったりするらしい。リバースしたリポジトリに概要が纏められているが、とりあえず現状としてそういった初期化を含めた接続をまとめてやってくれるスクリプトが絶賛開発されている。一応手元での動作が確認できた。

このエントリの一部はこのモデムでspmodeに接続しながら書いている。

モデムをテストする

このドライバはカーネルモジュールであるわけだが、カーネルパニックを引き起こす事もある程度にはまだ不安定なのでDKIMなりなんなりでインストールしちゃうのはまだ時期尚早かと思う。

現時点(2020/01/13)では、このモジュールとスクリプトを使うことで

  • カーネルモジュール
    • ネットワークインタフェースwwan0とデバイスファイル /dev/ttyXMM[0-2]/dev/xmm0/{trace,rpc} をはやす(数字は一例)
      • 当然デバイスを操作/通信できる
  • 接続スクリプト
    • モデムの初期化
    • FCCアンロック
    • APNへの接続
    • IPアドレスの取得、wwanへセット
    • デフォルトルートをwwanにセット
    • DNSの取得(リゾルバの実装は環境依存だからか自動設定はできない)

といったことが行える。

テスト手順

だいたいREADMEにあるとおり。

Archでの作業手順を紹介すると、

  • 事前準備として
    • 自分の利用しているカーネルにあわせてlinux-headersのようなカーネルヘッダーをインストールする
    • python をインストールしておく
    • pyroute2 が必要なので yay -S python-pyroute2 しておく。なお、自分はなんとなくvenvで入れている。
  • git clone https://github.com/xmm7360/xmm7360-pci
  • cd xmm7360-pci
  • vim rpc/open_xdatachannel.py (ファイル内のtelstra.internetを接続先のAPNに書き換える)
  • make (カーネルモジュールのビルド)
  • make load (ビルドしたモジュールのロード)
  • sudo python3 rpc/open_xdatachannel.py
  • :pray:

起動中などで接続スクリプトが途中でとまることがあるが、RPC executing UtaRPCPSConnectSetupReqresponse: 0x0で終了すれば無事接続できたことになる。

リポをアップデートしたときはもちろん、当然ながらカーネルがかわるたびにモジュールのビルドが必要。ロード以降はブートの度に必要。

DNSサーバーのアドレスは現時点では途中でUtaMsCallPsConnectReqコマンドの直前で報告されている。たとえば手元のSPモードの環境では

のようになっていた。このマシンでは名前解決に systemd-resolved を使用しているのでそれで設定した。

routeをみると、wwan0 がデフォルトルートとして登録されているのが確認できる。

なおデフォルトルートして登録されているので他のネットワーク、wlanなどに接続している状態でこのスクリプトを実行してもwwan0が優先される……まあ試す際はWLANは無効化した上でやっておいた方がわかりやすい気はする。

pingを打つ、IP確認君みてみる、スピテする、などで目的のネットワークで接続できていることが確認できるだろう。

軽くspeedtest.netで測定してみたところ下り60Mbps、上り30Mbps程度が出たがスペックとしては450/50対応してるはずなのでもすこし出てほしいところ……

(時間をすこしずらして再測定したら72/12に。えぇ……)

エラー例

初期化が未完

手元でテストした際に発生したエラーとして、”NameError: name ‘ip_addr’ is not defined”といったエラーがでることがあった。初期化完了するまえに進もうとしたためIPアドレスが取得できなかったなどの可能性があるっぽい。

後のコミットでそのような状況の場合にはリトライするようになって発生しずらくなったと思われるが、まだ発生したきがする……

カーネルがクラッシュ

カーネルによってScheduling while atomicクラッシュすることがあった。報告したところ修正されたっぽい。当該カーネルでクラッシュが発生しなくなった。

サスペンドからの復帰時にハング

接続した上でサスペンド(スリープ)に入って復帰するとハングしてしまう(#1)。ログをみてみるとぬるぽが発生してることが確認できる。

回避策としてサスペンドにフックを掛けてrmmodさせるってのが挙げられている(#15)が、そもそも自分はrmmodすらできなくなっていたのでほんとにそれでいいのやら……?

USER/PWDのいるAPNに対応してない?

ATコマンドではAT+CSTTで "APN","USER","PWD"のようにユーザー名やパスワードを指定する。spmodeではAPN以外のパラメーターは不要だがSoftbankのplus.4gなんかはこれが必要。Issue#5をみてると現状のコードでこれが利用できるのかどうかがよくわからない。

とりあえずのまとめ

開発中のドライバで X395 をLTEネットワークに接続することが一応できた。

せかっくLTEモデムつきのThinkPadを買ったのではやくこれがLinuxで実用的に使えるようになってくれると使い勝手が一気によくなるので期待。とはいえ現状回線が……

コメントを残す