TP-LinkのTX50EをLinuxで使う(2024/03時点)

以前、WiFi 6(11ax)USB WiFiアダプター(BUFFALO WI-U3-1200AX2)をLinuxで使う(2022/02時点)という記事を書きました。

あれから2年ほどが経過し、ある程度安定して使えているのだけれども、ちょっと気になる点がでてきました。

それは、継続的に大容量のファイルをダウンロードしているような場合に接続が切れてしまい、USB子機を刺し直すまで復帰できないことがあるということです。

そうそう頻繁に発生するわけではないが、踏むとかなり嫌な現象です。 USB接続ということで発熱を疑ってはみたものの、どうもそれとも違うようです。

なかにはDFSのせいでチャンネルが切り替わったという場合もあるので必ずしも無線LAN子機が悪いわけではありません。 しかし、遭遇すると面倒くさい。 そこで、試しに置き換えを検討することにしました。

My New Gearの選定条件について

以前は有線での配線が現実的でないことから、簡単に使えそうなUSB無線LAN子機としてBUFFALO WI-U3-1200AX2を選択しました。

しかし今では別にUSB接続にこだわる必要もありません。 というかむしろUSB無線LAN子機をやめようかと思っているのでいくつか検討してみました。 条件はつぎのとおりです。

  • WiFi 6 (11ax)対応は必須
  • WiFi 6Eまではいらない
  • USB接続の無線LAN子機は対象外とする
  • LinuxでドライバーがあるなどDebian sidで安定して使えそうなものにする
  • M.2への増設はスロットに空きがないので不可
  • WANは共用LANでそれほど速度はでないし、二重ルーターのWAN側は1Gbpsの制約があるので過剰スペックはいらない

結果として候補は次の2つとなりました。

TX20EとTX50Eでは、TX20Eが4000円くらい、TX50Eが5000円くらいの費用感でした。

現状WANがせいぜい300Mbps程度しかでない回線なので、TX20Eの5GHzで1201Mbpsという仕様でスペック的には十分です。

しかし、TX20EとTX50Eでは採用されているチップに違いがありました。

TX20EはRealtekのチップでRTL8852BE、一方TX50EのほうはIntelのAX200を採用しています。 WI-U3-1200AX2もRealtekだったので、今度はIntelのチップを採用しているTX50Eを選択することにしました。 (AX200だったら、M.2に刺すタイプがだいぶ安いのですが、M.2は空いていないので断念しました。)

TP-Linkはルーターだったら個人的な理由があって選ばないのですが、無線LANカードならよいのではという判断です。

購入したTX50EはマザーボードのPCIE 2.0 x 1のスロットが空いているのでそちらに接続しました。 PCIE 3.0 x4も空いていますが、そちらは(M.2を利用していると無効なので使えません。)

TX50EはBluetoothもついていて、USB 1_2のピンヘッダ(USB 2.0)に刺しておきました。このピンヘッダに刺すというのはピンを曲げてしまわないか実に怖いですね。 刺した後にlspciでみると、認識はされていることがわかりました。

$ lspci | grep -v AMD
...
06:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
...

BluetoothについてはUSB経由での接続となるのでlsusbで確認しました。

$ lsusb
...
Bus 001 Device 003: ID 8087:0029 Intel Corp. AX200 Bluetooth
...

lspci -vで詳細をみると、次のように必要なモジュールを教えてくれます。

06:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
    Subsystem: Intel Corporation Wi-Fi 6 AX200NGW
    Flags: fast devsel, IRQ 32
    Memory at fc500000 (64-bit, non-prefetchable) [size=16K]
    Capabilities: <access denied>
    Kernel modules: iwlwifi

Capabilitiesを確認するには、sudo lspci -v を実行しないといけないです。

Kernel driver in use: pcieport

06:00.0 Network controller: Intel Corporation Wi-Fi 6 AX200 (rev 1a)
    Subsystem: Intel Corporation Wi-Fi 6 AX200NGW
    Flags: fast devsel, IRQ 32
    Memory at fc500000 (64-bit, non-prefetchable) [size=16K]
    Capabilities: [c8] Power Management version 3
    Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+
    Capabilities: [40] Express Endpoint, IntMsgNum 0
    Capabilities: [80] MSI-X: Enable- Count=16 Masked-
    Capabilities: [100] Advanced Error Reporting
    Capabilities: [14c] Latency Tolerance Reporting
    Capabilities: [154] L1 PM Substates
    Kernel modules: iwlwifi

ファームウェアのインストール

Debian sidを利用しているので、iwlwifiのファームウェアfirmware-iwlwifiに含まれている。(はず)

firmware-iwlwifi/unstable 20230625-2 all
  Binary firmware for Intel Wireless cards

sudo apt install -y firmware-iwlwifiでファームウェアをインストールしたので、 sudo modprobe iwlwifiしてみました。 しかし、デバイスとしてはみえていません。 dmesgになにか手がかりがないか確認してみたところ次のようなメッセージが出力されていました。

$ sudo dmesg G iwl
[   56.856794] iwlwifi 0000:06:00.0: enabling device (0000 -> 0002)
[   56.860509] iwlwifi 0000:06:00.0: Detected crf-id 0x3617, cnv-id 0x100530 wfpm id 0x80000000
[   56.860519] iwlwifi 0000:06:00.0: PCI dev 2723/0084, rev=0x340, rfid=0x10a100
[   56.860598] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-77.ucode (-2)
[   56.860612] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-77.ucode (-2)
[   56.860614] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-77.ucode failed with error -2
[   56.860643] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-76.ucode (-2)
[   56.860654] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-76.ucode (-2)
[   56.860655] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-76.ucode failed with error -2
[   56.860672] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-75.ucode (-2)
[   56.860686] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-75.ucode (-2)
[   56.860687] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-75.ucode failed with error -2
[   56.860703] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-74.ucode (-2)
[   56.860714] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-74.ucode (-2)
[   56.860716] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-74.ucode failed with error -2
[   56.860730] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-73.ucode (-2)
[   56.860745] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-73.ucode (-2)
[   56.860746] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-73.ucode failed with error -2
[   56.860761] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-72.ucode (-2)
[   56.860771] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-72.ucode (-2)
[   56.860773] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-72.ucode failed with error -2
[   56.860787] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-71.ucode (-2)
[   56.860798] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-71.ucode (-2)
[   56.860799] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-71.ucode failed with error -2
[   56.860818] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-70.ucode (-2)
[   56.860830] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-70.ucode (-2)
[   56.860832] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-70.ucode failed with error -2
[   56.860848] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-69.ucode (-2)
[   56.873856] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-69.ucode (-2)
[   56.874960] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-69.ucode failed with error -2
[   56.876143] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-68.ucode (-2)
[   56.877324] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-68.ucode (-2)
[   56.881935] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-68.ucode failed with error -2
[   56.881965] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-67.ucode (-2)
[   56.883308] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-67.ucode (-2)
[   56.883766] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-67.ucode failed with error -2
[   56.883786] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-66.ucode (-2)
[   56.885136] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-66.ucode (-2)
[   56.885138] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-66.ucode failed with error -2
[   56.885157] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-65.ucode (-2)
[   56.887548] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-65.ucode (-2)
[   56.888045] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-65.ucode failed with error -2
[   56.888069] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-64.ucode (-2)
[   56.889515] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-64.ucode (-2)
[   56.889517] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-64.ucode failed with error -2
[   56.889531] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-63.ucode (-2)
[   56.889541] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-63.ucode (-2)
[   56.889543] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-63.ucode failed with error -2
[   56.889556] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-62.ucode (-2)
[   56.889566] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-62.ucode (-2)
[   56.889568] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-62.ucode failed with error -2
[   56.889581] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-61.ucode (-2)
[   56.889595] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-61.ucode (-2)
[   56.889597] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-61.ucode failed with error -2
[   56.889613] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-60.ucode (-2)
[   56.889624] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-60.ucode (-2)
[   56.889625] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-60.ucode failed with error -2
[   56.889639] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-59.ucode (-2)
[   56.889649] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-59.ucode (-2)
[   56.889651] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-59.ucode failed with error -2
[   56.889664] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-58.ucode (-2)
[   56.889675] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-58.ucode (-2)
[   56.889676] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-58.ucode failed with error -2
[   56.889689] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-57.ucode (-2)
[   56.889700] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-57.ucode (-2)
[   56.889701] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-57.ucode failed with error -2
[   56.889715] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-56.ucode (-2)
[   56.889727] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-56.ucode (-2)
[   56.889728] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-56.ucode failed with error -2
[   56.889743] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-55.ucode (-2)
[   56.889754] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-55.ucode (-2)
[   56.889756] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-55.ucode failed with error -2
[   56.889774] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-54.ucode (-2)
[   56.889785] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-54.ucode (-2)
[   56.889786] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-54.ucode failed with error -2
[   56.889801] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-53.ucode (-2)
[   56.889812] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-53.ucode (-2)
[   56.889813] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-53.ucode failed with error -2
[   56.889827] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-52.ucode (-2)
[   56.889837] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-52.ucode (-2)
[   56.889838] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-52.ucode failed with error -2
[   56.889851] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-51.ucode (-2)
[   56.889863] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-51.ucode (-2)
[   56.889864] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-51.ucode failed with error -2
[   56.889879] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-50.ucode (-2)
[   56.889889] iwlwifi 0000:06:00.0: firmware: failed to load iwlwifi-cc-a0-50.ucode (-2)
[   56.889891] iwlwifi 0000:06:00.0: Direct firmware load for iwlwifi-cc-a0-50.ucode failed with error -2
[   56.889892] iwlwifi 0000:06:00.0: minimum version required: iwlwifi-cc-a0-50
[   56.889894] iwlwifi 0000:06:00.0: maximum version supported: iwlwifi-cc-a0-77
[   56.889895] iwlwifi 0000:06:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

やたらとファームウェアのロードに失敗している状況であることがわかります。

ファームウェアを最新版に更新する

apt showでファームウェアに関するパッケージの説明を確認してみたところ、次の結果が得られました。

$ apt show firmware-iwlwifi G AX

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

  * Intel Bluetooth AX201 (var 0 rev 0) configuration, version
  * Intel Bluetooth AX201 (var 0 rev 0) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 0 rev 1) configuration, version
  * Intel Bluetooth AX201 (var 0 rev 1) firmware, version 22.220.0.3
  * Intel Bluetooth AX101 (var 0 rev 3) configuration, version
  * Intel Bluetooth AX101 (var 0 rev 3) firmware, version 22.200.0.2
  * Intel Bluetooth AX201 (var 0 rev 4) configuration, version
  * Intel Bluetooth AX201 (var 0 rev 4) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 16 rev 4) configuration, version
  * Intel Bluetooth AX201 (var 16 rev 4) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 32 rev 0) configuration
  * Intel Bluetooth AX201 (var 32 rev 0) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 32 rev 1) configuration, version
  * Intel Bluetooth AX201 (var 32 rev 1) firmware, version 22.220.0.3
  * Intel Bluetooth AX201 (var 32 rev 4) configuration, version
  * Intel Bluetooth AX201 (var 32 rev 4) firmware, version 22.220.0.3
  * Intel Wireless AX211 Bluethooth configuration, version 22.220.0.3
  * Intel Wireless AX211 Bluethooth firmware, version 22.220.0.3
  * Intel Wireless AX2100 Bluethooth configuration, version 22.220.0.3
  * Intel Wireless AX2100 Bluethooth firmware, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 configuration, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 firmware, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 configuration, version 22.220.0.3
  * Intel Wireless Bluetooth AX201 firmware, version 22.220.0.3

残念ながら、AX200は掲載されていません。

そこで、dmesgで言及されているようにlinux-firmwareのGitリポジトリを確認してみました。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git

firmware-iwlwifiは20230625-2なのでちょっと古いためのようです。 リポジトリのログを確認するとちょくちょくファームウェアが更新されています。

例えば、2023-08-28でAX200のファームウェアが更新されています。

https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/commit/?id=3892dc0121482d1fe5f3fa3a9943a89ef5838c85

firmware-iwlwifiのapt showの結果をみるかぎり、ibt系がAX200のファームウェアのようです。 コミットをみるかぎり、次の3つを更新したほうがよさそうです。

また、ibtだけじゃなくて、iwlwifi-cc-a0-もよりあたらしいバージョンが含まれています。 もし新しいファームウェアがあれば順にロードするようにしているようです。 下限と上限は次のように定められていました。

[   56.889892] iwlwifi 0000:06:00.0: minimum version required: iwlwifi-cc-a0-50
[   56.889894] iwlwifi 0000:06:00.0: maximum version supported: iwlwifi-cc-a0-77

したがって、以下の4つのファイルを所定のディレクトリにコピーしておけば良いです。

sudo cp linux-firmware/iwlwifi-cc-a0-77.ucode /usr/lib/firmware/
sudo cp linux-firmware/intel/ibt-20-0-3.sfi /usr/lib/firmware/intel/
sudo cp linux-firmware/intel/ibt-20-1-3.sfi /usr/lib/firmware/intel/
sudo cp linux-firmware/intel/ibt-20-1-4.sfi /usr/lib/firmware/intel/

sudo modprobe -a iwlwifiするとwlp6s0として認識されました。

7: wlp6s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000

TX50Eの電源管理を無効にする

省電力機能はアグレッシブすぎると切断要因になりかねないということで、無効化しておくことにしました。 (本当は実際に問題になってから無効化したほうがよいけれども)

電源管理を無効化するにはiwlmvmに対して次のような設定を行うと良いです。 (iwlwifiのpower_save=0は効果がない)

cat /etc/modprobe.d/iwlmvm.conf 
# parm:           init_dbg:set to true to debug an ASSERT in INIT fw (default: false (bool)
# parm:           power_scheme:power management scheme: 1-active, 2-balanced, 3-low power, default: 2 (int)
options iwlmvm power_scheme=1

power_schemeといったモジュールごとに指定できるパラメーターについてはsudo modinfo iwlmvmで調べられます。

実際に再起動すると次のように省電力を無効にできていました。

sudo iwconfig
wlp6s0    IEEE 802.11  ESSID:"..."  
          Mode:Managed  Frequency:5.52 GHz  Access Point: ...
          Bit Rate=1.0806 Gb/s   Tx-Power=22 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=52/70  Signal level=-58 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:273   Missed beacon:0

アンテナの向きを調節する

性能を最大限発揮するには、アンテナの受信状態を良好なものにしないといけません。

PCIE経由だとPCの背面からアンテナを生やすことになるので、設置場所によっては向きを調節しておかないと、 リンク速度が稼げません。

ルーターが80MHzの場合、リンク速度の上限は1201Mbpsに制限されるはずです。 実際次のような結果となりました。

$ sudo iw dev wlp6s0 link
Connected to ... (on wlp6s0)
    SSID: ...
    freq: 5520.0
    RX: 929804678 bytes (891697 packets)
    TX: 572620119 bytes (261878 packets)
    signal: -58 dBm
    rx bitrate: 648.5 MBit/s 80MHz HE-MCS 6 HE-NSS 2 HE-GI 0 HE-DCM 0
    tx bitrate: 1200.9 MBit/s 80MHz HE-MCS 11 HE-NSS 2 HE-GI 0 HE-DCM 0
    bss flags: short-preamble short-slot-time
    dtim period: 10
    beacon int: 100

速度計測結果はどうだったか

TX50E(AX200)で速度を計測してみたところ、これまで上り下りで400Mbpsを超えることはなかったが、 アップロードのときに400Mbps出せるようになりました。

ダウンロードはばらつきが大きいので速くなったかどいうかはなんともいえません。 ただ、継続的にダウンロードしているような状況で切断されることがなくなり安定しているようにみえます。

TX50Eは160MHzに対応しているので、仕様上は2ストリーム2404Mbpsに対応しています。 ただし、親機のルーターが80MHzまでしか対応していな場合は、2ストリーム1201Mbpsとなります。 そのためリンク速度自体1200Mbpsと本来の性能を活かしきれていないのはもったいないですが、 それでもいまのところ安定しているのはとてもよいです。

おまけで、Bluetoothも使えるようになったので、これまでWiFiアダプターとBTドングルのぶんのUSB端子が2つ空いたのも嬉しい。

この記事はUltimate Hacking Keyboard 60 v2で書きました。